本篇文章有兩道題。
對於本題,前提只有 一次 1階或者2階的跳法。
a.如果兩種跳法,1階或者2階,那麼假定第一次跳的是一階,那麼剩下的是n-1個台階,跳法是f(n-1);
b.假定第一次跳的是2階,那麼剩下的是n-2個台階,跳法是f(n-2)
c.由a\b假設可以得出總跳法為: f(n) = f(n-1) + f(n-2)
d.然後通過實際的情況可以得出:只有一階的時候 f(1) = 1 ,只有兩階的時候可以有 f(2) = 2
e.可以發現最終得出的是乙個斐波那契數列:
——– | 1, (n=1)
f(n) = | 2, (n=2)
——– | f(n-1)+f(n-2) ,(n>2,n為整數)
public:
int jumpfloor(int number)
else
if (number == 1)
return jumpfloor(number - 1) + jumpfloor(number - 2);
}};
遞迴引起一系列的函式呼叫,並且有可能會有一系列的重複計算,遞迴演算法的執行效率相對較低.所以能使用迴圈的,就不要使用遞迴。
迭代法求斐波那契數列:
class solution
return i;}}
};
1)這裡的f(n) 代表的是n個台階有一次1,2,…n階的 跳法數。
2)n = 1時,只有1種跳法,f(1) = 1
3) n = 2時,會有兩個跳得方式,一次1階或者2階,這回歸到了問題(1) ,f(2) = f(2-1) + f(2-2)
4) n = 3時,會有三種跳得方式,1階、2階、3階,
那麼就是第一次跳出1階後面剩下:f(3-1);第一次跳出2階,剩下f(3-2);第一次3階,那麼剩下f(3-3)
因此結論是f(3) = f(3-1)+f(3-2)+f(3-3)
5) n = n時,會有n中跳的方式,1階、2階…n階,得出結論:
f(n) = f(n-1)+f(n-2)+…+f(n-(n-1)) + f(n-n) => f(0) + f(1) + f(2) + f(3) + … + f(n-1)
6) 由以上已經是一種結論,但是為了簡單,我們可以繼續簡化:
f(n-1) = f(0) + f(1)+f(2)+f(3) + … + f((n-1)-1) = f(0) + f(1) + f(2) + f(3) + … + f(n-2)
f(n) = f(0) + f(1) + f(2) + f(3) + … + f(n-2) + f(n-1) = f(n-1) + f(n-1)
可以得出:
f(n) = 2*f(n-1)
7) 得出最終結論,在n階台階,一次有1、2、…n階的跳的方式時,總得跳法為:
——- | 1 ,(n=0 )
f(n) = | 1 ,(n=1 )
——– | 2*f(n-1),(n>=2)
class solution
};
斐波那契數列(跳台階)
題目1 斐波那契數列 大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項 從0開始,第0項為0 n 39 斐波那契數列定義 1 1 2 3 5 8 13 21 34 我們最容易想到的是遞迴的方式,如下 public int fibonacci int n if n 1 re...
斐波那契數列及青蛙跳台階問題
都是 寫乙個函式,輸入n,求斐波那契 fibonacci 數列的第n項。斐波那契 fibonacci 數列定義如下 f n 0,1,f n 1 f n 2 n 0n 1 n 2 效率很低的解法 遞迴解法 效率很低 long long fibonacci solution1 unsigned int ...
斐波那契數列及青蛙跳台階問題
題目1 寫乙個函式,輸入n,求斐波那契 fibonacci 數列的第n項。斐波那契 fibonacci 數列定義如下 f n 0,1,f n 1 f n 2 n 0 n 1 n 2 效率很低的解法 遞迴解法 效率很低 objc view plain copy long long fibonacci ...