描述
有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。
例子:假设一只兔子第3个月出生,那么它第5个月开始会每个月生一只兔子。
一月的时候有一只兔子,假如兔子都不死,问第n个月的兔子总数为多少?
数据范围:输入满足 1≤n≤31
输入描述:
输入一个int型整数表示第n个月
输出描述:
输出对应的兔子总数
示例1
输入:
3
复制
输出:
2
思路一:找找规律,发现符合斐波那契数列,所以可以使用递归
while True:
try:
m = int(input())
def count_rabit(m):
if m <= 2:
return 1
if m > 2:
return count_rabit(m - 1) + count_rabit(m - 2)
print(count_rabit(m))
except:
break
思路二:思路很重要,思维越抽象,代码越简单
我们可以假设num,num1,num2初始值为0,针对第n月的情况,我们可以使用for循环处理,在循环中,需要特别处理前两个月的情况,因为这两个月,没有成年的兔子可以生育,当到达第三个月以及以后时,我们可以按照正常的逻辑进行处理。
首先,我们先讨论特例的情况。当n=1时,此时三种兔子都是0,加入第一只小兔子,设num1=1;当n=2时,没有成年的兔子可以生产,此时有一只兔子的年龄增加一岁。
当n>=3时,此时,已有可以生产的成年兔子了,num2增加一月,此时成年兔子为num=num+num2,而num1中的兔子年龄增加一月,num2=num1。当月新出生的兔子num1=num。
while True:
try:
n = int(input())
num = 0
num1 = 0
num2 = 0
for i in range(n):
num += num2
num2 = num1
if num==0 and num2 == 0:
num1 = 1
elif num==0 and num2 == 1:
num1 = 0
else:
num1 = num
print(num+num1+num2)
except:
break
进一步优化:
a表示出生不低于两个月的兔子数量,b表示出生一个月的兔子数量,c表示刚出生的兔子数量,可知:每过一个月就有:
a = a + b
b = c
c = a
总数为a+b+c
n = int(input())
a = 1 # 出生不短于两个月的兔子
b = 0 # 出生一个月的兔子
c = 0 # 刚出生的兔子
for i in range(3, n+1):
a += b
b = c
c = a
print(a+b+c)