遞歸與循環
若我們要重複的多次計算相同的問題,通常可以選擇用遞歸或者循環兩種方法。
int AddFrom1ToN(int n) { int add = 0; for (int i = 1; i <= n; i++) { add += i; } return add; } int AddFrom1ToN(int n) { if (n <= 0) { return 0; } return n + AddFrom1ToN(n - 1); //return n<=0?0:n + AddFrom1ToN(n - 1); }
通常遞歸的代碼比較簡潔,但是由於它是函數調用自身,有時間的消耗和空間的消耗,且存在棧溢出的隱患
題目:
寫一個函數,輸入n,輸出斐波那契數列第n項
f(N)= 0 N=0;
1 N=1;
f(N+1)+f(N-1) N>1
程序1.0
long long Fibonacci(size_t n) { if (n = 0) return 0; if (n = 1) return 1; return Fibonacci(n - 1) + Fibonacci(n - 2); }
分析:
1.函數返回值類型爲long long,防止數字太大溢出
2.若n過大則會導致棧溢出
程序2.0
時間複雜度O(n)
long long Fibonacci(size_t n) { if (0==n) return 0; if (1==n) return 1; long long first = 0; long long second = 1; long long result = 0; for (size_t i = 2; i <= n; i++) { result = first + second; first = second; second = result; } return result; }
測試
功能測試,輸入2,4,6,8
邊界值測試,輸入0,1,2
3. 性能測試,輸入50,70
1.一隻青蛙跳臺階,一次可以跳一階或兩階,計算這個青蛙跳n階臺階有多少種跳法
分析:
(0階0種跳法)若爲1階,只有一種跳發,兩階,有兩種跳發,三階3種。。。。
最後可看成是斐波那契數列的另一種延伸。
2.一隻青蛙跳臺階,一次可以跳一階,兩階,也可以跳n階,計算這個青蛙跳n階臺階有多少種跳法
經分析可得出一個數學公式 f(n)=2^(n-1)
3.我們可以用2*1的小矩形橫着或者豎着去覆蓋更大的矩形,8個2*1的小矩形無重疊覆蓋一個2*8放的大矩形,共多少種方法