生兔子演算法循環
一般而言,兔子在出生兩個月後,就有繁殖能力,一對兔子每個月能生出一對小兔子來。如果所有兔都不死,那麼一年以後可以繁殖多少對兔子?
1 1月
1 2月
2 3月
3 4月
5 5月
8 6月
13 7月
21 8月
34 9月
55 10月
89 11月
144 12月
233 13月
第1種:
Private Sub Command1_Click()
i = 0
x = 1
y = 1
b = x & "," & y
For n = 3 To 13 Step 1
i = x + y
x = y
y = i
b = b & "," & i
Next
Print b
End Sub
這個演算法是最經典的。其實a月的數量也就是老兔子加上新生兔子。老兔子這么算的:因為當月的生產數量為上個月的兔子總數,而這個生產數量就是由老兔子生的。所以老兔子的數量就是a-1月的數量也就是上一個月的數量。新兔子這么算的:因為新兔子就是上一個月的繁殖數量,即a-1月的繁殖數量,而這個繁殖數量就是由a-2月的總數決定的,所以新兔子就是a-2月了。所以根據這個原理,第一種方法成立。
第2種:
Private Sub Command1_Click()
i = 0
x = 1
y = 1
z = 2
b = x & "," & y & "," & z
For n = 4 To 13 Step 1
i = y * 2 + x
x = y
y = z
z = i
b = b & "," & i
Next
Print b
End Sub
第2種演算法的邏輯是:
(a月-2的月總數)* 2 + (a月-3月總數)
因為當月的生產數量為上個月的兔子總數,而當月的新兔子(即上個月新生的兔子,這個月還未能生產)數量為上上個月的總數。
第3種:
Private Sub Command1_Click()
i = 0
x = 1
y = 1
z = 2
b = x & "," & y & "," & z
For n = 4 To 13 Step 1
i = z * 2 - x
x = y
y = z
z = i
b = b & "," & i
Next
Print b
End Sub
(a月總數*2) - (a-2月總數)
這第2種演算法和第3種演算法是基於第一種演算法的原理的。只不過實在太復雜了,我自己腦子里只能粗略整理它的邏輯關系(其實也不是很懂),所以寫出來大家一定看不懂。。。
後記:這個經典的兔子數列其實還可以繼續玩下去。有非常復雜的遞推關系(自己說的,雖然沒學過什麼叫真正的遞推不過應該差不多吧)。每個參數影響非常復雜。我本來想繼續這個混亂的遞推邏輯,但想到再復雜的演算法的時候我差不多都要瘋掉了。。啊啊啊,暫時就這樣吧~~~大腦休息下。熄火。
㈡ 用兔子的增長來講迭代演算法
這個月的兔子,等於上個月的兔子數加上這個月新生的兔子數;
而這個月新生兔子數,剛好又是前兩個月已經存在兔子所生,所以等於前兩個月的兔子數;
可以得到,f(x)=f(x-1)+f(x-2),x>2
㈢ 兔子生兔子問題 pascal語言!!
program work(input,output);
var
i:integer;{循環變數}
total:integer;{兔子總量}
answer:integer;{兔子對數}
begin
total:=2;
for i:=3 to 12 do
begin
total:=total+1;{第一代三月後每月生一隻}
if (i-2)>=3 then total:=total+1;{第二代五月後每月生一隻}
if (i-4)>=3 then total:=total+1;
if (i-6)>=3 then total:=total+1;
if (i-8)>=3 then total:=total+1;
end;
answer:=total div 2;{有多少對兔子}
writeln(answer);
end.
這個方法很簡單
便於理解