问题描述:有一头母牛,它每年年初生一头小母牛。
每头小母牛从第四个年头开始,每年年初也生一头小母牛。
请编程实现在第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)))