天天看點

算法:兔子數列問題題目描述代碼結果

斐波那契數列又因數學家萊昂納多·斐波那契以兔子繁殖為例子而引入,故又稱為“兔子數列”。

題目描述

設有一對兔子;每月都生一對兔子(一雌一雄)新生的兔子兩月後也每月生一對兔子;那麼由一對兔子開始滿一年後有多少對?

分析:

第一個月小兔子沒有繁殖能力,是以還是一對

兩個月後,生下一對小兔對數共有兩對

三個月以後,老兔子又生下一對,因為小兔子還沒有繁殖能力,是以一共是三對

幼仔對數=前月成兔對數

成兔對數=前月成兔對數+前月幼仔對數

總體對數=本月成兔對數+本月幼仔對數

可以看出幼仔對數、成兔對數、總體對數都構成了一個數列。這個數列有關十分明顯的特點,那是:前面相鄰兩項之和,構成了後一項。

若記第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