按我理解,遞迴就是不停地調用自身,到一定的臨界條件後得出結果。
按照百度的說法,
遞迴一般用於解決三類問題:
(1)資料的定義是按遞迴定義的。(Fibonacci函數)
(2)問題解法按遞迴演算法實現。(回溯)
(3)資料的結構形式是按遞迴定義的。(樹的遍曆,圖的搜尋)
遞迴的缺點:
遞迴演算法解題相對常用的演算法如普通迴圈等,運行效率較低。因此,應該盡量避免使用遞迴,除非沒有更好的演算法或者某種特定情況,遞迴更為適合的時候。在遞迴調用的過程當中系統為每一層的返回點、局部量等開闢了棧來儲存。遞迴次數過多容易造成棧溢出等。
如何設計遞迴演算法
1.確定遞迴公式
2.確定邊界(終了)條件
計算n!
#include <stdio.h>long factorial(long n){ if (n == 0 || n == 1) return 1; else return n * factorial(n-1);}int main(void){ int n = 0, i = 0; long sum = 0; printf("Please input a number: \n"); scanf("%d", &n); printf("%d! = %lu\n", n, factorial(n)); return 0;}
我看到過的其中的一條面試題:
樓梯有n階台階,上樓可以一步上1階,也可以一步上2階,編一程式計算共有多少種不同的走法.
如果只有1個台階,只有1一種走法。
如果有2個台階,就有11和2兩種走法。
如果有3個台階,有111,12和21三種走法。
如果有4個台階,有1111,112,121,211,22五種走法。
如果有5個台階,有11111,1112,1121,1211,2111,122,212,221八種走法。
這個與斐波那契(Fibonacci)數列有關,斐波那契—盧卡斯遞推:f(1)=1,f(2)=2,從第三項開始,每一項都等於前兩項之和f(n)
= f(n-1)+ f(n-2)(當n>2)。
所以
1 n=1
f(n)={ 2 n=2
f(n-1)+f(n-2) n>2
int f(int n){ if (n == 1 || n == 2) return n; return f(n-1) + f(n-2); }