求斐波那契數列第n項,最簡單的方法
intf(
int n)
但顯然這很低效,因為會重複計算很多次前面的值,比如算f(10),要得到f(9),和f(8),而求f(9)要求f(8) 和f(7),求f(8)要求f(7)和f(6),就重複計算了f(8)和f(7),越往後重複的越多,總複雜度為指數級,效率極低
我們可以將前面的計算結果存起來,避免重複計算
intf(
int n)
return arr[n -1]
;}
這樣效率雖高,但占用額外的空間,仔細想想,每次結果只與前兩次結果有關,可以優化優化
intf(
int n)
return ans;
}
這被稱為迭代,無論是在時間上還是在空間上都很高效。
運用上述思想,來看下經典的爬樓梯問題
題目描述
假設你正在爬樓梯。需要 n 階你才能到達樓頂
每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?
輸入: 2
輸出: 2
解釋: 有兩種方法可以爬到樓頂。
1.1 階 +
1 階2.
2 階輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂。
4.1 階 +
1 階 +
1 階5.
1 階 +
2 階6.
2 階 +
1 階
法一
//方法一,記憶化遞迴
intans
(int i,
int n,
int arr)
intclimbstairs
(int n)
return
ans(
0,n,arr)
;}
法二
int
climbstairs
(int n)
法三
int
climbstairs
(int n)
return third;
}
斐波那契數列 遞迴和遞迴優化
斐波那契數列 經典數學問題之一 斐波那契數列,又稱 分割數列,指的是這樣乙個數列 1 1 2 3 5 8 13 21 想必看到這個數列大家很容易的就推算出來後面好幾項的值,那麼到底有什麼規律,簡單說,就是前兩項的和是第三項的值,也許你會想到的是迭代,也學你想到的是遞迴。簡單分析一下遞迴 int fi...
斐波那契數列 遞迴和遞迴優化
斐波那契數列,即兔子問題 演算法筆試題可能會出現 function fun n return fun n 1 fun n 2 效能問題 1,自身巢狀太深,可能會引起堆疊溢位 堆疊溢位 函式呼叫會使用棧來儲存臨時變數。每呼叫乙個函式,都會將臨時變數封裝為棧幀壓入記憶體棧,等函式執行完成返回時,才出棧。...
遞迴與斐波那契數列
迭代實現 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...