题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月
后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
这是一个经典的 Fibonacci 数列问题,可以通过递归或循环来解决。
递归方法:
由题意可知,第 n 个月的兔子数等于第 n-1 个月的兔子数加上第 n-2 个月的兔子数。设 f(n) 表示第 n 个月的兔子数,则有:
f(n) = f(n-1) + f(n-2)
同时,边界条件为 f(1) = f(2) = 1。
使用 Python 实现递归方法:
- def rabbit(month):
- if month == 1 or month == 2:
- return 1
- else:
- return rabbit(month-1) + rabbit(month-2)
-
- month = int(input("请输入月份:"))
- total_rabbits = rabbit(month)
- print("{}个月后,兔子的总数为{}".format(month, total_rabbits))
-
循环方法:
同样,可以使用循环的方式计算 Fibonacci 数列。用变量 a 表示前一个数,b 表示当前数,将每次计算得到的数赋值给 b,同时将 a 赋值为之前的 b,直到计算到第 n 个数,即为所求的兔子总数。
使用 Python 实现循环方法:
- month = int(input("请输入月份:"))
- rabbits = [1, 1]
-
- for i in range(2, month):
- rabbits.append(rabbits[i-1] + rabbits[i-2])
-
- total_rabbits = rabbits[-1] * 2
- print("{}个月后,兔子的总数为{}".format(month, total_rabbits))
-
方法三:使用生成器
- def rabbits():
- a, b = 0, 1
- while True:
- yield b
- a, b = b, a+b
-
- month = int(input("请输入月份:"))
- total_rabbits = 0
- for i, r in enumerate(rabbits()):
- if i >= month:
- break
- total_rabbits += r
-
- print("{}个月后,兔子的总数为{}".format(month, total_rabbits*2))
-