斐波那契數列及青蛙跳台階問題

2021-07-25 11:43:29 字數 3446 閱讀 9880

都是

寫乙個函式,輸入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 n)

2 迴圈解法:改進的

演算法:從下往上計算。首先根據f(0)和f(1)算出f(2),再根據f(1)和f(2)算出f(3)。。。。。依此類推就可以算出第n項了。很容易理解,這種思路的時間複雜度是o(n)。實現**如下:

long long fibonacci(unsigned n)

; if(n < 2)

return result[n];

long long fibminusone = 1;

long long fibminustwo = 0;

for(unsigned int i = 2 ; i <= n ; ++i)

return fibn;

}

乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法。

可以把n級台階時的跳法看成是n的函式,記為f(n)。當n>2時,第一次跳的時候就有兩種不同的選擇:一是第一次只跳1級,此時跳法數目等於後面剩下的n-1級台階的跳法數目,即為f(n-1);另一種選擇是第一次跳2級,此時跳法數目等於後面剩下n-2級台階的跳法數目,即為f(n-2)。因此,n級台階的不同跳法的總數f(n)=f(n-1)+f(n-2)。分析到這裡,不難看出這實際上就是斐波那契數列了。

與斐波那契數列不同的是,其初始值定義稍有不同, 

當n=1時,只能跳一級台階,一種跳法 

當n=2時,一次跳一級或兩級,兩種跳法 

所以,關於青蛙跳台階的定義如下: f

(n)=

⎧⎩⎨⎪

⎪1,2

,f(n

−1)+

f(n−

2),n

=1n=

2n>2

非遞迴寫法

long long frogjump12step(int n)

if (n == 1)

return 1;

if (n == 2)

return 2;

int frognminusone = 2;//f(n-1)=2

int frognminustwo = 1;//f(n-2)=1

int frogn = 0;

for (unsigned int i = 3; i <= n;++i)

return frogn;

}

遞迴解法

long long frogjump12steprecursive(int n)

if (n == 1)

return 1;

if (n == 2)

return 2;

return frogjump12steprecursive(n - 1) + frogjump12steprecursive(n - 2);

}

乙隻青蛙一次可以跳上1級台階,也可以跳上2級。。。。。它也可以跳上n級,此時該青蛙跳上乙個n級的台階總共有多少種跳法?
用數學歸納法可以證明:f(

n)=2

n−1.

遞迴式證明: 

當n = 1 時, 只有一種跳法,即1階跳:fib(1) = 1; 

當n = 2 時, 有兩種跳的方式,一階跳和二階跳:fib(2) = fib(1) + fib(0) = 2; 

當n = 3 時,有三種跳的方式,第一次跳出一階後,後面還有fib(3-1)中跳法; 第一次跳出二階後,後面還有fib(3-2)中跳法;第一次跳出三階後,後面還有fib(3-3)中跳法 

fib(3) = fib(2) + fib(1)+fib(0)=4; 

當n = n 時,共有n種跳的方式,第一次跳出一階後,後面還有fib(n-1)中跳法; 第一次跳出二階後,後面還有fib(n-2)中跳法……………………..第一次跳出n階後, 後面還有 fib(n-n)中跳法. 

fib(n) = fib(n-1)+fib(n-2)+fib(n-3)+……….+fib(n-n)=fib(0)+fib(1)+fib(2)+…….+fib(n-1) 

又因為fib(n-1)=fib(0)+fib(1)+fib(2)+…….+fib(n-2) 

兩式相減得:fib(n)-fib(n-1)=fib(n-1) 

*****》 fib(n) = 2*fib(n-1) n >= 2 

遞迴等式如下:  f

(n)=

⎧⎩⎨⎪

⎪1,2

,2∗f

(n−1

),n=

1n=2

n>2

所以:f(

n)=2

∗f(n

−1)=

2∗2(

n−2)

....

=2n−

1∗f(

0)=2

n−1

非遞迴解法:

long long frogjump12nstep(int n)

else if (n == 1)

return 1;

else

return fn;

}}

遞迴解法

long long frogjump12nsteprecursive(int n)

else if (n == 1)

return 1;

else if (n == 2)

return 2;

else

return 2 * frogjump12nsteprecursive(n - 1);

}

小矩形覆蓋大矩形,用2*1的小矩形橫著或豎著去覆蓋各大矩形。
思路:設題解為f(n),

第一步:若第一塊矩形豎著放,後邊還有n-1個2*1矩形,即此種情況下,有f(n-1)種覆蓋方法。

第二部:若第一塊橫著放,後邊還有n-2個2*1矩形,此種情況下,有f(n-2)種覆蓋方法。

第三部:可得 f(n)=f(n-1)+f(n-2)

可知,此題可以轉化為其斐波那契數列第n項的值。

斐波那契數列及青蛙跳台階問題

題目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 ...

斐波那契數列及青蛙跳台階問題

題目1 寫乙個函式,輸入n,求斐波那契 fibonacci 數列的第n項。1斐波那契 fibonacci 數列定義如下 效率很低的解法 遞迴解法 效率很低 function fibonacci solution1 n 2 迴圈解法 改進的演算法 從下往上計算。首先根據f 0 和f 1 算出f 2 再...

斐波那契額數列及青蛙跳台階問題

題目 寫乙個函式,輸入n,求斐波那契 fibonacci 數列的第n項。斐波那契 fibonacci 數列定義如下 效率很低的解法 long long fibonacci solution1 unsigned int n 改進的演算法 從下往上計算。首先根據f 0 和f 1 算出f 2 再根據f 1...