先考慮第一步,在考慮第二步,第二步可能與第一部的解法思路相同,(範圍卻小了),然後一直分解。。。直到邊界有返回值
//特例:
下面是個關於遞迴呼叫簡單但是很能說明問題的例子:
[cpp] view plain copy
/*遞迴例子*/
#include
void up_and_down(int);
int main(void)
void up_and_down(int n)
輸出結果
level 1:n location 0240ff48
level 2:n location 0240ff28
level 3:n location 0240ff08
level 4:n location 0240fee8
level 4:n location 0240fee8
level 3:n location 0240ff08
level 2:n location 0240ff28
level 1:n location 0240ff48
首先, main() 使用引數 1 呼叫了函式 up_and_down() ,於是 up_and_down() 中形式引數 n 的值是 1, 故列印語句 #1 輸出了 level1 。然後,由於 n 的數值小於 4 ,所以 up_and_down() (第 1 級)使用引數 n+1 即數值 2 呼叫了 up_and_down()( 第 2 級 ). 使得 n 在第 2級呼叫中被賦值 2, 列印語句 #1 輸出的是 level2 。與之類似,下面的兩次呼叫分別列印出 level3 和 level4 。
當開始執行第 4 級呼叫時, n 的值是 4 ,因此 if 語句的條件不滿足。這時候不再繼續呼叫 up_and_down() 函式。第 4 級呼叫接著執行列印語句 #2 ,即輸出 level4 ,因為 n 的值是 4 。現在函式需要執行 return 語句,此時第 4 級呼叫結束,把控制權返回給該函式的呼叫函式,也就是第 3 級呼叫函式。第 3 級呼叫函式中前乙個執行過的語句是在 if 語句中進行第 4 級呼叫。因此,它繼續執行其後繼**,即執行列印語句 #2 ,這將會輸出 level3 .當第 3 級呼叫結束後,第 2 級呼叫函式開始繼續執行,即輸出level2 .依次類推.
注意,每一級的遞迴都使用它自己的私有的變數 n .可以檢視位址的值來證明.
遞迴的基本原理:
1 每一次函式呼叫都會有一次返回.當程式流執行到某一級遞迴的結尾處時,它會轉移到前一級遞迴繼續執行.
2 遞迴函式中,位於遞迴呼叫前的語句和各級被調函式具有相同的順序.如列印語句 #1 位於遞迴呼叫語句前,它按照遞迴呼叫的順序被執行了 4 次.
3 **每一級的函式呼叫都有自己的私有變數.**
4 **遞迴函式中,位於遞迴呼叫語句後的語句的執行順序和各個被呼叫函式的順序相反.**
5 雖然每一級遞迴有自己的變數,但是函式**並不會得到複製.
6 遞迴函式中必須包含可以終止遞迴呼叫的語句.
void recursionfun(int n)
cout
<< n;
recursionfun(n - 1);
}recursionfun(3)輸出321.
2、void recursionfun(int n)
recursionfun(n - 1);
cout
<< n;
}recursionfun(3)輸出123.
3、void recursionfun(int n)
cout
<< n;
recursionfun(n - 1);
cout
<< n;
}recursionfun(3)輸出321123.
4、int recursionfun(int n)
int sum = 0;
sum = n + recursion(n - 1);
return sum;
}recursionfun(3)輸出6.
編寫遞迴函式的關鍵是退出遞迴函式的條件與遞迴的過程。更好詮釋遞迴過程的是《c與指標》第7章 7.5
.2節遞迴與迭代。
1 解遞迴
偶爾可能會遇到這樣的題目,乙個遞迴函式的呼叫叫咱求結果。假如有以下遞迴函式,問加入n = 5時,函式返回值為多少。
[plain] view plain copy 在code上檢視**片派生到我的**片
int sum( int n)
return sum(n-1) + sum(n-2);
}
解如此的遞迴函式可以用筆畫畫,把握「c語句單步執行」和「函式呼叫」兩規則就能夠解此類遞迴題目。(好吧,我指的是筆試)。解此遞迴函式過程如下:
n = 5,n > 2,故而執行returnsum( n -1 ) + sum( n - 2)語句:
呼叫sum( n -1 )函式。
sum(n -1 )完畢後呼叫sum( n -2 )函式。
返回兩個函式的和。
注:先遮蔽掉編譯器的左右執行順序,總之有乙個函式先被呼叫,不妨假設編譯器從左向右執行。不影響最後的結果。
sum (n-1)的呼叫過程:
figure1:sum(4)呼叫過程
函式呼叫過程跟圖中序號一致,每個伴著箭頭往下指的序號代表sum()函式被呼叫一次。得到sum(4) = 5,sum(3) = 3。
sum(3)的值也可以根據相同的過程求得,一般比較大的遞迴包含了較小的遞迴值。所以此遞迴解為8。
if(n <= 2) 是遞迴不永久下去的關鍵語句,分支跳出語句。
遞迴的理解
對於遞迴問題,一定要明確的一點是,初始呼叫該函式時的輸入是什麼樣的 遞迴能夠奏效的前提是,問題的規模一定是減少的,或者更為嚴謹地說,問題一定是朝著遞迴結束的條件執行的 遞迴函式的第乙個要執行的就是 if 判斷,也即每進入一次遞迴,都要首先判斷是否到達遞迴的結束,n 0 其次還要明晰遞迴函式的功能,是...
遞迴的理解
本篇文章只要是實現最大公倍數的遞迴實現方法。最大公倍數是指兩個數能夠被一組數同時整除,其中最大的那個數就叫做最大公倍數,求解最大公倍數這裡主要說兩個想法,其實就是將複雜的問題簡化逐步簡化到乙個很小的問題,然後求得答案。假設有兩個數 252和105 252 21 12 105 21 5 252 105...
遞迴的理解
都說遞迴的是神,迭代的是人,這個就是學習筆記,記一下我的一些理解 hi t2015sp ring 晨鳧追風 理解方式1 1 當n 0 1時,結果正確 2 假設函式對於 n 是正確的,函式對於n 1結果也是正確的,如果這兩點是成立的,這個函式對於所有可能的 n 也是成立的 像是數學歸納法的理解 理解方...