斐波拉契數列 漢諾塔,青蛙跳台階

2021-07-29 02:56:47 字數 4475 閱讀 3116

斐波拉契數列、漢諾塔,青蛙跳台階  的演算法實現

一.斐波那契數列 (1,1,2,3,5,8,13,21,34 ......)f(

n)=⎧

⎩⎨⎪⎪

0,1,

f(n−

1)+f

(n−2

),n=

0n=1

n>

2遞迴解法(效率很低)

public 

function

fibonacci1($

n)

if($n == 1)

return

fibonacci1($n -

1) + fibonacci1($n - 2);

}

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

public

function

fibonacci($n)

;

if($n < 2)

return

$result[$n];

$one= 1;

$tow= 0;

for($

i =

2; $i <= $n ; ++$i)

return

$fibn;

}

二.漢諾塔

簡單的用

php實現了漢諾塔問題的求解,使用遞迴呼叫,但是用php實現要是盤子的個數很多的話,執行起來會很慢的...

漢諾塔主要是有三個塔座x,y,z,要求將三個大小不同,依小到大編號為1,2.....n的圓盤從a移動到塔座z上,要求

(1):每次只能移動乙個圓盤

(2):圓盤可以插到x,y,z中任一塔座上

(3):任何時候不能將乙個較大的圓盤壓在較小的圓盤之上

主要是運用了遞迴的思想,這裡使用php做個簡單的實現...... 1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

<?php

functionhanoi($n,$x,$y,$z)else

}

functionmove($x,$n,$z)

hanoi(10,'x','y','z');

?>

三.青蛙跳

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

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

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

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

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

假設n級台階是f(n)的乙個函式 ,當n = 1時候只有一種跳法,n=2時候 可以一次跳1台階 ,也可以一次跳兩個台階 有兩種跳法,但是當n>2時,第一次跳有兩種不同的選擇,選擇跳乙個台階,那麼就剩餘f(n-1)種選擇,如果第一次跳2台階 接下來有f(n-2)種選擇跳台階,所以n級台階的不同跳法f(n)=f(n-)+f(n-2)f(

n)=⎧

⎩⎨⎪⎪

1,2,

f(n−

1)+f

(n−2

),n=

1n=2

n>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級的台階總共有多少種跳法?
按照上面的推理:

n = 1 時, 只有一種跳法  f(n) = 1;

n = 2 時 ,  有兩種跳法,第一次跳乙個台階 ,第一次跳2台階f(2) =  f(1) + f(0) = 2;

n = 3 時,f(n)= 3;第一次跳1個台階,就剩餘f(3-1) 跳法,第一次跳二台階,就剩餘f(3-2) ,第一次跳出3台階,後面還有f(3-3) ,f(3) = f(2)+f(1)+f(0) = 4

......

n = n ,第一次共有n種跳法,第一次跳1台階,後面還有f(n-1),第一次跳2,後面還有f(n-2),第一次跳3 ,後面還有f(n-3),。。。。。。,第一次跳n台階,後面還有f(n-n)

f(n) = f(n-1) + f(n-2) + f(n-3) + f(n-4) + ......+f(n-n);

因為f(n-1) = f(n-2) + f(n-3) + f(n-4) + ......+f(n-n);

=> f(n) -f(n-1) = f(n-1)

=> f(n) = 2f(n-1)  n>2f(

n)=⎧

⎩⎨⎪⎪

1,2,

2∗f(

n−1)

,n=1

n=2n

>

2

所以:f(n

)=2∗

f(n−

1)=2

∗2(n

−2).

...=

2n−1

∗f(0

)=2n

−1非遞迴解法:

public function 

frogjump12nstep($n)

else

if (n == 1)

return

1; else

return

$fn;

}}

遞迴解法

public function 

frogjump12nsteprecursive($n)

else

if($n == 1)

return1;

else

if($n == 2)

return2;

else

return

2* frogjump12nsteprecursive($n - 1);

}

青蛙跳台階問題 斐波拉契數列 動態規劃

乙隻青蛙一次可以跳上1級台階,也可以跳上2級台階。求該青蛙跳上乙個 n 級的台階總共有多少種跳法。答案需要取模 1e9 7 1000000007 如計算初始結果為 1000000008,請返回 1。示例 1 輸入 n 2 輸出 2示例 2 輸入 n 7 輸出 21 0 n 100 看到這道題,彷彿似...

青蛙跳台階(斐波那契數列應用)

1 乙隻青蛙一次可以跳上 1 級台階,也可以跳上2 級。求該青蛙跳上乙個n 級的台階總共有多少種跳法。2 乙隻青蛙一次可以跳上1級台階,也可以跳上2 級 它也可以跳上n 級,此時該青蛙跳上乙個n級的台階總共有多少種跳法?問題1 題目描述 乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個...

C 實現斐波那契數列 青蛙跳台階

題目 寫乙個函式,輸入n,求斐波那契 fibonacci 數列的前n項。斐波那契數列的定義如下 1 方法1 迴圈的實現方法 include using namespace std int main int main int num 50 int data new int num memset dat...