问题描述:有一头母牛,它每年年初生一头小母牛。
每头小母牛从第四个年头开始,每年年初也生一头小母牛。
请编程实现在第n年的时候,共有多少头母牛?Input输入数据由多个测试实例组成,
每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。

(1)刚开始觉得很简单,直接下手写,第一个程序很快写完,测试一下10年以内,

      也能正确完成,但是当输入年数在40以后时,运算速度变很慢,看了下内存占用很大

(2)想了下可能是第一种方法list无法释放,又写了第二种方法,性能和第一种相差不大

(3)拿纸列了写了下这个数列,终于发现了规律,原来后面每两年之间的差正好是三年前的数

各年的母牛数如下:

第一年:1

第二年:2

第三年:3

第四年:4

第五年:6

第六年:9

第七年:13

第八年:19

第九年:28

第十年:41

第十年数=第九年数+第七年数

第九年数=第八年数+第六年数

再写出来的程序,不需要递归,速度就很快了,三种方法都记录如下

 1 class Caw:
 2     total=0
 3     def __init__(self,age=1):
 4         self.age=age
 5 
 6 #method1
 7 def cal(year,cawlist):
 8     for i in range(year-1):
 9         cplist=[]
10         cplist.extend(cawlist)
11         for caw in cplist:
12             caw.age+=1
13             if caw.age>=4:
14                 newcaw=Caw()
15                 cawlist.append(newcaw)
16     return len(cawlist)
17 #method2
18 def calnew(year,cawlist):
19     if len(cawlist)==0:
20         return 0
21     count=len(cawlist)
22     for caw in cawlist:
23         for i in range(caw.age-3):
24             #print 'i:'+str(i)
25             cawchild=Caw(i+1)
26             #if cawchild.age>=4:
27             cawChildList=[]
28             cawChildList.append(cawchild)
29             count+=calnew(year,cawChildList)
30             cawlist=None
31     return count
32 
33 #method2
34 def calgood(year,cawlist):
35     if year<5:
36         return len(cawlist)+(year-1)*len(cawlist)
37     else:
38         return calgood(year-1,cawlist)+calgood(year-3,cawlist)
39 
40 while True:
41     year=input('input year:')
42     if year==0:
43         break
44         #good method
45     cawlist=[Caw()]
46     print ('len:'+str(calgood(year,cawlist)))
47     #new method
48     cawlist=[Caw(3+year-1)]
49     print ('len:'+str(calnew(year,cawlist)))
50     #yuan method
51     cawlist=[Caw(3)]
52     print ('len:'+str(cal(year,cawlist)))