演算法入門兔子
Ⅰ 經典演算法題之兔子問題
就是那個遞歸演算法:f(1)=1;f(2)=1;f(3)=2;...f(n)=f(n-1)+f(n-2);程序是:(計算任一月兔子數)long fun(int x){ int i; if(x==1 || x==2) return 1; else return fun(x-1)+fun(x-2);}void main(){ int i,a; long s; scanf("%d",&a); printf("%ld\n",fun(a)); }
Ⅱ 生兔子的經典編程演算法
一般而言,兔子在出生兩個月後,就有繁殖能力,一對兔子每個月能生出一對小兔子來。如果所有兔都不死,那麼一年以後可以繁殖多少對兔子?
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種演算法是基於第一種演算法的原理的。只不過實在太復雜了,我自己腦子里只能粗略整理它的邏輯關系(其實也不是很懂),所以寫出來大家一定看不懂。。。
後記:這個經典的兔子數列其實還可以繼續玩下去。有非常復雜的遞推關系(自己說的,雖然沒學過什麼叫真正的遞推不過應該差不多吧)。每個參數影響非常復雜。我本來想繼續這個混亂的遞推邏輯,但想到再復雜的演算法的時候我差不多都要瘋掉了。。啊啊啊,暫時就這樣吧~~~大腦休息下。熄火。
Ⅲ 雞兔同籠的簡便演算法
最簡單的演算法
(總腳數-總頭數×雞的腳數)÷(兔的腳數-雞的腳數)=兔的只數
(94-35×2)÷2=12(兔子數) 總頭數(35)-兔子數(12)=雞數(23)
讓兔子和雞同時抬起兩只腳,這樣籠子里的腳就減少了頭數×2隻,由於雞只有2隻腳,所以籠子里只剩下兔子的兩只腳,再÷2就是兔子數。
假設法
假設全是雞:2×35=70(只)
雞腳比總腳數少:94-70=24 (只)
兔:24÷(4-2)=12 (只)
雞:35-12=23(只)
假設法(通俗)
假設雞和兔子都抬起一隻腳,籠中站立的腳:
94-35=59(只)
然後再抬起一隻腳,這時候雞兩只腳都抬起來就摔倒了,只剩下用兩只腳站立的兔子,站立腳:
59-35=24(只)
兔:
24÷2=12(只)
雞:
35-12=23(只)
假設全是兔:4×35=140(只)
如果假設全是兔那麼兔腳比總數多:140-94=46(只)
雞:46÷(4-2)=23(只)
兔:35-23=12(只)
方程法
1、一元一次方程
設兔有x只,則雞有(35-x)只.
4x+2(35-x)=94
4x+70-2x=94
2x=94-70
2x=24
x=24÷2
x=12
35-12=23(只)
或 設雞有x只,則兔有(35-x)只.
2x+4(35-x)=94
2x+140-4x=94
2x=46
x=23
35-23=12(只)
答:兔子有12隻,雞有23隻.
註:通常設方程時,選擇腿的只數多的動物,會在套用到其他類似雞兔同籠的問題上,好算一些.
2、二元一次方程
設雞有x只,兔有y只.
x+y=35
2x+4y=94
(x+y=35)×2=2x+2y=70
(2x+2y=70)-(2x+4y=94)=(2y=24)
y=12
把y=12代入(x+y=35)
x+12=35
x=35-12(只)
x=23(只).
答:兔子有12隻,雞有23隻.抬腿法
方法一
假如讓雞抬起一隻腳,兔子抬起2隻腳,還有94÷2=47(只)腳。籠子里的兔就比雞的腳數多1,這時,腳與頭的總數之差47-35=12,就是兔子的只數。
方法二
假如雞與兔子都抬起兩只腳,還剩下94-35×2=24隻腳,這時雞是屁股坐在地上,地上只有兔子的腳,而且每隻兔子有兩只腳在地上,所以有24÷2=12隻兔子,就有35-12=23隻雞。
方法三
我們可以先讓兔子都抬起2隻腳,那麼現在就有35×2=70隻腳,現在的腳數和原來差94-70=24隻腳,這些都是每隻兔子抬起2隻腳,一共抬起24隻腳,用24÷2得到兔子有12隻,用35-12得到雞有23隻。