斐波拉契數列、漢諾塔,青蛙跳台階 的演算法實現
一.斐波那契數列 (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
function
hanoi(
$n
,
$x
,
$y
,
$z
)
else
}
function
move(
$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...