题解 | #HJ37 统计每个月兔子的总数#
统计每个月兔子的总数
https://www.nowcoder.com/practice/1221ec77125d4370833fd3ad5ba72395
方法1-递归
def f(n):
if n == 1 or n == 2:
return 1
return f(n-1) + f(n-2)
while True:
try:
n = int(input())
print(f(n))
except:
break
# 最开始的分析思路:
# 出生满2月的兔子后面每次会生育小兔子,即上上月及之前新增的兔子,每过一个月都要累加进去。
# f(1) = 1
# f(2) = 1
# f(3) = 2
# f(4) = 2+(1-0)=3
# f(5) = 3+(1-0)+(2-1)=5
# f(6) = 5+(1-0)+(2-1)+(3-2)=8
# 这里(1-0)+(2-1)可以用5-3表示
# 所以,f(6) = 5+(5-3)+(3-2) = 5+5-2 = 2*f(5)-f(3) = 13
# ...
# f(n) = 2*f(n-1) - f(n-3)
'''
def f(n):
if n==1 or n==2:
return 1
elif n==3:
return 2
else:
return int(2*f(n-1) - f(n-3))
'''
方法2-动态规划
while True:
try:
n = int(input())
n0 = 1 # 刚出生的兔子数
n1 = 0 # 满一个月的兔子数
n2 = 0 # 满二个月及以上的兔子数
for n in range(1, n):
n2 += n1
n1 = n0
n0 = n2
print(n0 + n1 + n2)
except:
break
方法3-斐波那契
这是斐波那契数列问题,从第2项开始,每一项都是前两项的和。
这里是从第3个月开始,每个月的兔子总数是前两个月兔子总数的和。
def f(n):
if n <= 2:
return 1
a, b = 1, 1
for i in range(3, n + 1):
a, b = b, a + b
return b
n = int(input())
print(f(n))

