斐波那契數列又因數學家萊昂納多·斐波那契以兔子繁殖為例子而引入,故又稱為“兔子數列”。
題目描述
設有一對兔子;每月都生一對兔子(一雌一雄)新生的兔子兩月後也每月生一對兔子;那麼由一對兔子開始滿一年後有多少對?
分析:
第一個月小兔子沒有繁殖能力,是以還是一對
兩個月後,生下一對小兔對數共有兩對
三個月以後,老兔子又生下一對,因為小兔子還沒有繁殖能力,是以一共是三對
幼仔對數=前月成兔對數
成兔對數=前月成兔對數+前月幼仔對數
總體對數=本月成兔對數+本月幼仔對數
可以看出幼仔對數、成兔對數、總體對數都構成了一個數列。這個數列有關十分明顯的特點,那是:前面相鄰兩項之和,構成了後一項。
若記第n個月的兔子數為fn,就有
f0+f1=f2,f1+f2=f3,f2+f3=f4……
一般的,有fn-2+fn-1=fn。有了這個規律,填這個表就很容易了。
你看,養一對兔子,一年之後就會發展壯大成了一個養兔場了。
按這個規律,可以把兔子數一直寫下去:
1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,……。
代碼
寫法1
def fbnq(m):
n1 = 1
n2 = 1
n = 1
if m < 1 :
print('輸入錯誤')
while m > 2:
n = n1 + n2
n2 = n1
n1 = n
m -= 1
return n
def count1(m):
print('月份 ',end ='')
for i in range(1,m+1):
print('{:^5d}'.format(i),end = '')
print()
print('兔子數',end ='')
for i in range(1, m+1):
print('{:^5d}'.format(fbnq(i)), end='')
count1(21)
寫法2
def fbnq2(m):
if m <= 0:
print('輸入錯誤')
return -1
elif m == 1 or m == 2:
return 1
else:
return fbnq2(m-1) + fbnq2(m-2)
def count2(m):
print('月份 ',end ='')
for i in range(1,m+1):
print('{:^5d}'.format(i),end = '')
print()
print('兔子數',end ='')
for i in range(1, m+1):
print('{:^5d}'.format(fbnq2(i)), end='')
count2(21)
結果
月份 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
兔子數 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946