问题:
有一对兔子,从出生后第四个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子。
假如兔子都不死,计算第十个月兔子的总数?
正常递归解法
#-*- coding:utf-8 -*-
#----------------------------------------------------------------------
def rabbits(months):
""""""
if months < 2:
return 1
return rabbits(months-1) + rabbits(months-2)
if __name__ == "__main__":
n = input('months = ')
n = int(n)
for i in range(2,n+1):
print(f"第{i}个月有{rabbits(i)}只兔子")
months = 5
第2个月有2只兔子
第3个月有3只兔子
第4个月有5只兔子
第5个月有8只兔子
缓存机制解法一
def fib(N):
if N == 0:
return 1
if N == 1:
return 1
arr = [1 for i in range(N+1)]
for i in range(2, N+1):
arr[i] = arr[i-1] + arr[i-2]
return arr[N]
缓存机制解法二
大体思路:在递归的过程中添加一个缓存机制,这样就可以避免重复递归调用了
def rabbits(months,buffer):
if months < 2:
return 1
if months in buffer:
return buffer[months]
result = rabbits(months-1,buffer) + rabbits(months-2,buffer)
buffer[months] = result
return result
运行结果:
months = 50
第0个月有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个月有377只兔子
第14个月有610只兔子
第15个月有987只兔子
第16个月有1597只兔子
第17个月有2584只兔子
第18个月有4181只兔子
第19个月有6765只兔子
第20个月有10946只兔子
第21个月有17711只兔子
第22个月有28657只兔子
第23个月有46368只兔子
第24个月有75025只兔子
第25个月有121393只兔子
第26个月有196418只兔子
第27个月有317811只兔子
第28个月有514229只兔子
第29个月有832040只兔子
第30个月有1346269只兔子
第31个月有2178309只兔子
第32个月有3524578只兔子
第33个月有5702887只兔子
第34个月有9227465只兔子
第35个月有14930352只兔子
第36个月有24157817只兔子
第37个月有39088169只兔子
第38个月有63245986只兔子
第39个月有102334155只兔子
第40个月有165580141只兔子
第41个月有267914296只兔子
第42个月有433494437只兔子
第43个月有701408733只兔子
第44个月有1134903170只兔子
第45个月有1836311903只兔子
第46个月有2971215073只兔子
第47个月有4807526976只兔子
第48个月有7778742049只兔子
第49个月有12586269025只兔子
第50个月有20365011074只兔子