第一个月小兔子没有繁殖能力,所以还是一对;
两个月后,生下一对小兔民数共有两对;
三个月以后,老兔子又生下一对,因为小兔子还没有繁殖能力,所以一共是三对;
------
依次类推可以列出下表:
经过月数:---0---1---2---3---4---5---6---7---8---9--10--11--12
兔子对数:---1---1---2---3---5---8--13--21--34--55--89-144-233
表中数字1,1,2,3,5,8---构成了一个数列。这个数列有个十分明显的特点,那是:前面相邻两项之和,构成了后一项。
这个特点的证明:每月的大兔子数为上月的兔子数,每月的小兔子数为上月的大兔子数,即上上月的兔子数,相加。
这个数列是意大利中世纪数学家斐波那契在中提出的,这个级数的通项公式,除了具有a(n+2)=an+a(n+1)/的性质外,还可以证明通项公式为:an=1/√[(1+√5/2) n-(1-√5/2) n](n=1,2,3。..)
这个通项公式又叫 “比内公式”(1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n}
所以只要了解这个很容易就会知道了~!渐渐地就把有关于这种问题吸收到脑海里去了,一问就知道了,无须再做不必要的证明了~!
最后祝你学习愉快~!!!
import datetime
def fib1(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fib1(n - 1) + fib1(n - 2)
known = {0: 0, 1: 1}
def fib2(n):
if n in known:
return known[n]
res = fib2(n - 1) + fib2(n - 2)
known[n] = res
return res
if __name__ == '__main__':
n = 40
print(datetime.datetime.now())
print('fib1(%d)=%d' % (n, fib1(n)))
print(datetime.datetime.now())
print('fib2(%d)=%d' % (n, fib2(n))