部分函式的遞迴與迭代(非遞迴)實現

2021-07-15 16:33:12 字數 1896 閱讀 3613

1 1 2 3 5 8......這樣的數列叫做斐波那契數列,規律很簡單,前兩個數字的和就是第三個數字的值。

我們可以簡單表示為:

n>2    fib(n)=fib(n-1)+fib(n-2)

fib(n)

n<=2   fib(n)=1

遞迴的實現**也是比較簡單的;只需要函式不斷呼叫自身就可以了:

#define _crt_secure_no_warnings 1

#include#includeint fib_1(int n)//採用遞迴的方式做的

int main()

當然,這看上去很容易理解,但是,這卻不是最好的方法。主要就是因為每乙個遞迴呼叫都會觸發另外兩個遞迴呼叫,這樣,冗餘計算的數量增長的非常快。例如,在計算fib(10)的時候,fib(3)被呼叫了21次,而計算fib(30)的時候,fib(3)被計算了30多萬次,這很浪費,而且效率很低。

所以,我們可以用乙個簡單迴圈來代替遞迴,雖然理解起來不如遞迴那麼簡單,但是效率提高了太多。

迭代的**實現也是比較簡單的,只要用乙個迴圈,就以a,b,c三個數字舉例吧,讓c=a+b;得到的結果給b,再把之前b的值賦給a,這樣同樣實現了斐波那契數列的規律:

#define _crt_secure_no_warnings 1

#include#includeint fib_2(int n)//採用函式的方式做

return c; }}

int main()

這可以簡單表示為:

n=0    fac(n)=1

fac(n)

n>0    fac(n)=n*fac(n-1)

遞迴的**實現也是比較容易的:

#define _crt_secure_no_warnings 1

#include#includeint fac_1(int n)

else }

int main()

當然,這和上面的斐波那契數列一樣,效率很低,主要就是因為,在呼叫函式的時候,引數會被壓到堆疊中,為區域性變數分配記憶體空間(基本上所有的遞迴函式都是如此),每一的呼叫返回時,這些都必須還原,所以,這裡產生了很大的開銷。

同樣的,用乙個簡單迴圈就可以完成相同的任務:

只要不斷乘上自身減1就可以了,知道自身不能再減為止。

**實現如下:

#define _crt_secure_no_warnings 1

#include#includeint fac_2(int n)

return ret;

}int main()

這裡**的簡潔性可以彌補遞迴帶來的執行時開銷,就上面所得呼叫函式時的開銷。

以1234這個數字為例,要求螢幕上輸出1 2 3 4;

**如下:

#define _crt_secure_no_warnings 1

#include#includevoid print(int num)

printf("%d ", num % 10);

}int main()

這裡需要對遞迴有很好的理解;還是以1234為例,第一次進入函式,1234>10,那麼會再次進入函式,不過是以123的大小進入,同樣,123還是大於10,再次以12進入,12還是大於10,那麼就再次以1進入函式,這次1<10了,那麼函式就會列印1%10的結果,就是1;

接著函式呼叫返回,列印12%10的結果,就是2;以此類推,最後輸出的結果就是4了,這樣螢幕上就會顯示出1 2 3 4 這樣的數字了;這裡就很好的演示了遞迴。

還有什麼不足敬請提出,讓我加以修改。

某些函式的遞迴與非遞迴實現的比較

1.斐波那契數列實現 遞迴實現 int fib int n 非遞迴 迭代法 實現 int fib int n return num1 從以上兩種實現方法我們可以看出,遞迴 比非遞迴簡單很多 不過,你是否知道遞迴背後的故事 如果我們要計 算第40個斐波那契數,計算機需要計算很多次 每個遞迴呼叫都觸發另...

Akm函式遞迴與非遞迴解法

如下是akm函式的遞迴演算法,根據akm函式的遞迴定義就可以得出,請參考 int akmrecur int m,int n 非遞迴演算法沒有遞迴演算法簡單,你先計算一下akm 2,1 多計算幾遍 我建議2遍,並在計算的過程中,分析一下計算過程有什麼規律 如果你計算完了,就可以看下面的分析了 請不要懶...

Ackermann函式的遞迴與非遞迴演算法

折騰了我將近一周了,沒查到能實際應用的程式 只好自己魔改 ifndef pch h define pch h 科普 阿克曼函式 ackermann 0,n n 1 ackermann 1,n n 2 ackermann 2,n 2 n 3 ackermann 3,n 2 n 3 3 include ...