C 中的遞迴

2021-09-19 05:43:37 字數 1366 閱讀 4430

參考博文:

1.概念

遞迴函式即自呼叫函式,在函式內部直接的或者間接地呼叫自己。在求解某些具有隨意性的複雜問題時經常使用遞迴,如要求編寫乙個函式,將輸入的任意長度的字串反向輸出。普通做法是將字串放入陣列中然後將陣列元素反向輸出即可,然而這裡的要求是輸入是任意長度的,總不能開闢乙個很大的空間儲存字串吧?這時候遞迴就起作用了。遞迴採用了分治的思想,將整體分割成部分,從最小的基本部分入手,逐一解決,其中部分通常和整體具有相同的結構,這樣部分可以繼續分割,直到最後分割成基本部分。

遞迴函式必須定義乙個終止條件,即什麼情況下終止遞迴,終止繼續呼叫自己,如果沒有終止條件,那麼函式將一直呼叫自己,知道程式棧耗盡,這時候等於是寫了乙個bug!

總結遞迴的特點:

(1) 使用遞迴時,一定要有明確的終止條件!

(2) 遞迴演算法解題通常**比較簡潔,但不是很容易讀懂。

(3) 遞迴的呼叫需要建立大量的函式的副本,尤其是函式的引數,每一層遞迴呼叫時引數都是單獨的佔據記憶體空間,他們的位址是不同的,因此遞迴會消耗大量的時間和記憶體。而非遞迴函式雖然效率高,但相對比較難程式設計。

(4) 遞迴函式分為呼叫和回退階段,遞迴的回退順序是它呼叫順序的逆序。

2.實踐

斐波那契數列當n>3時,第n個元素的值等於第n-1個元素和n-2個元素的和,當n不確定具體數值時,可以通過遞迴的方式實現

int fib(int n)

void test_fib(int n)

cout << "use func fib() " << endl;

for (int i = 0; i < n; i++)

cout << endl;

cout << "use for loop " << endl;

for (int i = 0; i < n; i++)

cout << endl;

}最終由遞迴得到的斐波那契數列和由for迴圈得到的數列相同。

階乘問題同樣可以通過遞迴實現,**為

int factorial(int n)

當n=5時,函式的呼叫過程如下圖所示

漢諾塔問題是指一共有3根針,其中兩根為空,另外一根針從上到下按照尺寸穿好了若干個盤子,上面的小下面的大,要求是每次移動乙個盤子,將所有的盤子移動到另一根針上,並且所有的針上的盤子都滿足上小下大的要求,如下圖

這個問題同樣可以使用遞迴的方式解決,思路如下

因此發現以上步驟實際上是乙個重複的過程,則整個問題可以使用遞迴解決,當盤子個數為1時直接移動即可,為n時則先借助一根針將n-1個盤子移動到另一根針上,而n-1根針可以先移動n-1-1根針,如此往復。**如下

void move(int n, char x, char y, char z) else

}--------------------- 

C 中迭代和遞迴的區別

從概念上講,遞迴就是指程式呼叫自身的程式設計思想,即乙個函式呼叫本身 迭代是利用已知的變數值,根據遞推公式不斷演進得到變數新值得程式設計思想。迭代與普通迴圈的區別是 迭代時,迴圈 中參與運算的變數同時是儲存結果的變數,當前儲存的結果作為下一次迴圈計算的初始值。遞迴與普通迴圈的區別是 迴圈是有去無回,...

遞推遞迴 C 遞迴的函式

題目 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 其它情況返回 ...

生活中的遞迴?

好久沒有寫了,因為事情太多了。老是覺得有很多事情要做,就是不知道到底在忙什麼。然而,最近看了乙個故事,我覺得對我觸動蠻大的,不知道自己已經想故事裡面那樣陷入乙個遞迴當中了,寫下來提醒大家和我自己吧!故事名字叫 走不回來的人 故事大概是這樣的 有一次,我要在客廳裡釘一幅畫,請鄰居來幫忙。已經在牆上扶好...