我們可以先例項化,從少的數列發現規律,加入我們是計算f5,則有:f5=f4+f3,f4=f3+f2,f3=f1+f2,f2=f1+f0.這時我們來計算f1,f0精確計算了多少次,為了方便計算,我們畫圖來表示:
根據二叉樹結點的個數可以得出呼叫的次數,個數可由完全二叉樹的性質得出
倒過來再換一種思路:
定義fib()如下:
int fib(intn)由原來fib的地推公式得出求解次數的地推公式。
那麼count(fib(10)) = count(fib(9)) + count(fib(8)) + 1;
求解count( fib(n) ) 的次數,就是計算fib(n)遞迴樹(是乙個二叉樹),葉子結點的個數。
count( fib(0) ) = 1
count( fib(1) ) = 1
count( fib(2) ) = count ( fib(1) ) + count( fib(0) ) + 1 = 3
count( fib(3) ) = count ( fib(2) ) + count( fib(1) ) + 1 = 3+1+1 = 5
這個樣子計算的還是很快的
fib(10),一共呼叫了 177次。
其實上面是360的一道面試題
不,也是河南師範大學的考研真題,一小問,差點在程式裡再模擬一下fib讓程式自己算去了(也能出結果但是格式上看著好難受),但是這樣又明顯違背了主程式和被呼叫函式的分離,只有自己記住結論再用乙個簡單的printf函式列印出來才是最合適的答卷方式
定義fib()如下:
int fib(intn)由原來fib的地推公式得出求解次數的地推公式。
那麼count(fib(10)) = count(fib(9)) + count(fib(8)) + 1;
求解count( fib(n) ) 的次數,就是計算fib(n)遞迴樹(是乙個二叉樹),葉子結點的個數。
count( fib(0) ) = 1
count( fib(1) ) = 1
count( fib(2) ) = count ( fib(1) ) + count( fib(0) ) + 1 = 3
count( fib(3) ) = count ( fib(2) ) + count( fib(1) ) + 1 = 3+1+1 = 5
這個樣子計算的還是很快的
fib(10),一共呼叫了 177次。
其實上面是360的一道面試題
不,也是河南師範大學的考研真題,一小問,差點在程式裡再模擬一下fib讓程式自己算去了(也能出結果但是格式上看著好難受),但是這樣又明顯違背了主程式和被呼叫函式的分離,只有自己記住結論再用乙個簡單的printf函式列印出來才是最合適的答卷方式
遞迴與斐波那契數列
迭代實現 def fab n a1 1 a2 1 a3 1if n 1 print 輸入有誤 return 1 while n 2 0 a3 a1 a2 a1 a2 a2 a3 a 1return a3 result fab 20 if result 1 print 總共有 d對小兔子誕生 resu...
遞迴演算法斐波那契數列
有一對兔子,從出生後第3個月起,每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子。假如兔子都不死,求第n個月兔子對數 關於斐波那契數列的兔子繁殖問題其實如下 實際月份 123 4567 8幼仔對數 101 1235 8成兔對數 011 2358 13總體對數 112 35813 21幼仔對...
遞迴實現斐波那契數列
斐波那契數列 f 1 1,f 2 1,f n f n 1 f n 2 n 3,n n package com.algorithm.tiger.recursion 遞迴和非遞迴方法實現斐波那契數列 斐波那契數列 f 1 1,f 2 1,f n f n 1 f n 2 n 3,n n descripti...