我們知道在程式設計領域裡面會碰到對某個函式的遞迴呼叫,同時對於遞迴呼叫我們有時候也可以在某些時候轉化為非遞迴呼叫,轉化為非遞迴呼叫的目的可以減少棧記憶體的分配從而減少記憶體溢位的問題,那麼在一般的數學領域中我們也有一些遞迴的呼叫的情況,比如在模擬電路中的反饋電路的情況和混沌理論中,某次計算的輸出又再次作為計算的輸入。因此研究函式遞迴有實際的意義。
一些常見的週期函式
在研究函式的遞迴之前,我們先考察一些常見的週期函式,常見的比如y=sin(pi/2 + 2*x*pi), y = (-1)^x, y = 1^x y = x^0, y=0*x。 我們這裡只研究x是整數的情況。
對於y = 0*x 來說,我們可以知道對於任何整數x∈z 來說 y = 0, 函式的週期是1,因為我們可以匯出對於任何乙個整數x∈z來說 y都等於常數a的函式:
(1)y = a + 0*x;
對於y=1^x 和 y = x^0 這兩個函式來說我們可以知道對於任何整數x∈z 來說,總是得到y = 1,函式的週期是1,因此我們可以匯出對於任何乙個整數x∈z 來說y等於常數a的函式:
(2)y = a*1^x
(3) y = a*x^0
(4) y = a - 1 + 1^x
(5) y = a - 1 + x^0
對於 y= (-1)^x 和 y = sin (pi/2 - 2*x*pi) 來說, 對於任何x∈z 來說當x為奇數時y=-1 , 而當x為偶數時y=1, 函式的週期是2, 因此我們可以匯出對於任何乙個整數x∈z,來說當x為奇數時y的值等於常數a,而x為偶數時y的值為b的函式。
對此我們可以定義乙個線性函式y = ax+b。 並假設當x=-1時y=a, 當x=1時y=b。那麼這個線性函式的解析式為:
y = (b-a)/2 * x + (b+a)/2 其中的a=(b-a)/2, b = (b+a)/2
因為我們規定x只能是-1,和1,因此我們把y=(-1)^x 和y = sin(pi/2 - 2*x*pi) 代入得到:
(6)y = (b-a)/2 * (-1)^x + (b+a)/2
(7)y = (b-a)/2 *sin(pi/2 - 2 *x *pi) + (b+a)/2
以及繼續尋找y=f(x) 當x為某個區段時 y等於某個固定的值, 也就是尋找週期為n的函式,這部分也是最難的,對於解決函式n次遞迴迴圈有很大的幫助。
也就是從某種程度上來說能找到週期為n的函式,就是對某個n次遞迴迴圈的函式進行非遞迴表達的通用表達函式。
函式的遞迴
假設存在某個函式 y = ⨍(x), y的值域是x定義域的子集。 假設當x=x0時有 y0=⨍(x0), 當我們把y0再次作為自變數又代入到⨍(x) 中去得 y1=⨍(y0), 那麼這時候y1也可以表示為:
y1 =⨍ (⨍(x0))
我們稱y1是x0經過2次函式呼叫後得到的值。同時我們稱 g(x) = ⨍ (⨍(x)) 為函式⨍(x) 的二次遞迴函式。我們可以定義如下:
定義 ⨍n(x) 為⨍(x)經過n次遞迴後得到的函式,簡稱為n次遞迴函式,其中n>=1,並且我們規定⨍1(x) = ⨍(x)
那麼接下來就要面臨幾個問題了,是否任何乙個函式都有n次遞迴函式,如果有n次遞迴函式,那麼是否可以用乙個非遞迴的函式來描述這個遞迴函式呢?以及某個函式是否經過m次遞迴後得到的值跟最開始的自變數是相等的? 以及函式的逆函式跟遞迴函式有什麼關係?
上面的幾個問題希望志同道合的同學們一起討論和研究。
設某個函式y=⨍(x) 的n次遞迴函式為⨍n(x), 若存在乙個函式g(n,x), 使得⨍n(x)=g(n,x) 那麼我們稱g(n,x)為⨍n(x)的非遞迴表示式。可以看出遞迴函式的非遞迴表示式主要是可以把遞迴的次數當做某個函式g的係數,從而簡化了遞迴函式的計算方法。
對於一些初等函式來說我們很容易得到某個函式的n次遞迴函式的非遞迴表達方式,比如:
y = a*x +b 的n次遞迴函式為 y = a^n *x + b*∑ a^i (其中i=0 to n-1)
y = x^a 的n次遞迴函式為 y = x^(a^n)
y = 1/x 的n次遞迴函式為 y = ((x^2 - 1)*(-1)^n + x^2 + 1)/2*x (這個公式沒有那麼簡單得出,後續會給出推導的過程,參考公式(8))
y = (x+1)/(x-1) 的n次遞迴函式為 y = ((-1)^(n+1)+ 2x + 1)/((2-x)*(-1)^n + x) (這個公式參考(8))
而有些函式比如
y = sin(x) 則我們沒有辦法用乙個可以定義的非遞迴函式來表示其n次遞迴函式(是否真的沒有?還是需要研究),暫時只能用列舉的方法來表示:
y = sin(sin(sin(.......(x)....)))
復合函式的遞迴函式
上面描述的是普通函式的遞迴函式,那麼對於一些復合函式怎麼求他的遞迴函式呢?
設y = ⨍(u), u=g(x), 則已x為自變數y為因變數的復合函式表示為 y= ⨍(g(x)), 那麼如何來求復合函式y的遞迴函式呢?
因為y= ⨍(g(x)), 所以將y變為自變數後的第二次遞迴的表達為:
y2 = ⨍(g(y)), 而y=⨍(g(x)), 所以代入得 y2 = ⨍(g(⨍(g(x)))). 依次類推得到
yn=⨍(g(⨍(g(⨍(g(⨍(g(...⨍(g(x)...))))))))
n函式的遞迴週期
假設某個函式⨍(x)的n次遞迴函式⨍n(x),當n=m1,m2,mk時有⨍mi(x) = x 其中(i = 1 to k ) 那麼我們稱其中的最小mi為函式的遞迴週期,稱為m。
接下來的問題就是如何確定某個n次遞迴函式是否有遞迴週期的問題,以及遞迴週期如何計算的問題,這個也是研究的課題。
2次遞迴週期函式
如果某個函式的遞迴週期為2則稱這個函式為2次遞迴週期函式。2次遞迴週期函式其實就是當n為奇數時y=f(x),而當n為偶數是y=x, 也就是遞迴週期如下:
f1(x)= f(x), f2(x)= x, f3(x)=f(x), f4(x) = x, f5(x)= f(x),.....
如何來推導乙個2次遞迴週期函式的表示式呢。
我們再從上面的函式2次遞迴週期函式來分析得出當n為奇數時fn(x) = f(x) 而當n為偶數時fn(x) = x 因此我們可以從前面的公式(6)中推導出2次遞迴週期函式的非遞迴函式為:
(8)fn(x) = (x - f(x))/2 * (-1)^n + (x+ f(x))/2
全遞迴函式
我們知道如果某個函式y =f(x), 那麼這個函式的逆函式表示為 x = f-1(y)。 如果再次對這個逆函式進行遞迴則
因為我們定義如下:
如果某個函式y=f(x)的 n次遞迴函式fn(x) 且當 n = 0 是有 f0(x) = x , 且n次逆遞迴函式為gn(x) 那麼我們稱函式
fn(x) n>=1
kn(x) = { x n = 0
gn(x) n < 0
為f(x)的全遞迴函式。
並且如果某個函式的n次遞迴函式fn(x) 當 n = 0 時有 f0(x) = x; 且有 n < 0 時 fn(x) = gn(x) 那麼我們稱fn(x)是全遞迴函式的唯一函式,並且稱這個全遞迴函式是唯一全遞迴函式。
注意的是並不是所有函式的n次遞迴函式都是全遞迴函式。
y = a* x 的n次遞迴函式是 y= a^n*x , 全遞迴函式是 y = a^n*x
y = (x+1)/(x-1) n次遞迴函式是 y = ((-1)^(n+1)+ 2x + 1)/((2-x)*(-1)^n + x) 全遞迴函式是 y = ((-1)^(n+1)+ 2x + 1)/((2-x)*(-1)^n + x)
y = 1/x n次遞迴函式是 y = ((x^2 - 1)*(-1)^n + x^2 + 1)/2*x 全遞迴函式是 y = ((x^2 - 1)*(-1)^n + x^2 + 1)/2*x
y = x^a n次遞迴函式是 y = x^(a^n) 全遞迴函式是 y = x^(a^n)
y = a*x + b n次遞迴函式是 y = a^n*x + b * ∑a^(i-1) (i = 1 to n) 全遞迴函式是:
a^n*x + b * ∑a^(i-1) (i = 1 to n) n>=1
y = { x n = 0
a^n*x - b * ∑a^i (i = -1 to -n) n < 0
遞迴函式的包裹函式
對於遞迴函式,必須有乙個控制遞迴的引數,在引數滿足某個特定條件的情況下,遞迴停止。對於私有的遞迴函式。對於使用者來說,他不需要知道這個引數,只要傳入初始值就可以,對應於公有的包裹函式 舉例 在求二叉樹的高度的時候,使用者只要傳入二叉樹的根節點。然而,在遞迴的時候,引數是每個子樹的根節點,當根節點為空...
遞迴的函式
problem description 給定乙個函式 f a,b,c 如果 a 0 或 b 0 或 c 0 返回值為 1 如果 a 20 或 b 20 或 c 20 返回值為 f 20,20,20 如果 a b 並且 b c 返回 f a,b,c 1 f a,b 1,c 1 f a,b 1,c 其它...
遞迴的函式
time limit 1000ms memory limit 65536kb submit statistic discuss problem description 給定乙個函式 f a,b,c 如果 a 0 或 b 0 或 c 0 返回值為 1 如果 a 20 或 b 20 或 c 20 返回值...