一個函數在其定義中直接或間接調用自身的一種方法,它通常把一個大型的複雜的問題轉化爲一個與原問題相似的規模較小的問題來解決,可以極大的減少代碼量.遞歸的能力在於用有限的語句來定義對象的無限集合.
使用遞歸要注意的有兩點:
1)遞歸就是在過程或函數裏面調用自身;
2)在使用遞歸時,必須有一個明確的遞歸結束條件,稱爲遞歸出口.
遞歸分爲兩個階段:
1)遞推:把複雜的問題的求解推到比原問題簡單一些的問題的求解;
2)迴歸:當獲得最簡單的情況後,逐步返回,依次得到複雜的解.
利用遞歸可以解決很多問題:如揹包問題,漢諾塔問題,...等.
斐波那契數列爲:0,1,1,2,3,5...
fib(0)=0;
fib(1)=1;
fib(n)=fib(n-1)+fib(n-2);
- int fib(int n)
- {
- if(0 == n)
- return 0;
- if(1 == n)
- return 1;
- if(n > 1)
- return fib(n-1)+fib(n-2);
- }
上面就是一個簡單的遞歸調用了.由於遞歸引起一系列的函數調用,並且有可能會有一系列的重複計算,遞歸算法的執行效率相對較低.
迭代:利用變量的原值推算出變量的一個新值.如果遞歸是自己調用自己的話,迭代就是A不停的調用B.
遞歸中一定有迭代,但是迭代中不一定有遞歸,大部分可以相互轉換.能用迭代的不用遞歸,遞歸調用函數,浪費空間,並且遞歸太深容易造成堆棧的溢出.
- //這是遞歸
- int funcA(int n)
- {
- if(n > 1)
- return n+funcA(n-1);
- else
- return 1;
- }
- //這是迭代
- int funcB(int n)
- {
- int i,s=0;
- for(i=1;i<n;i++)
- s+=i;
- return s;
- }