3、请分别用非递归方法和Fibonacci通项公式求出兔子繁殖问题(Fibonacci’s Rabbits)中第n个月小兔子的数量。要求如下: (1) 列出Fibonacci通项公式 (2)编程实现题目中的两种算法 (3)在程序中,n由使用者输入,当为负数或0时,报异常,提示用户输入值错误,并允许用户重新输入,直到用户输入正确为止。 (4)此程序允许用户不间断使用,即计算完毕一次询问用户是否继续计算,用户输入“是”,则继续;输入“否”,则退出程序。 (5)将实验题目1中的方法与本题中两种方法进行比较,说出它们的优劣。
时间: 2024-04-08 21:30:48 浏览: 70
(1) Fibonacci通项公式:
对于兔子繁殖,Fibonacci通项公式可以表示为Fn = Fn-1 + Fn-2,其中F1 = F = 1。
(2) 以下是使用非递归方法和Fibonacci通项公式计算n个月小兔子数量的代码:
```python# 非递归方法 fibonacci_non_recursive(n):
if n <=0:
raise ValueError("输入值错误,请输入正数。")
if n == 1 or n == 2:
return 1
prev_prev = 1
prev = 1
current = 0
for i in range(3, n+1):
current = prev + prev_prev
prev_prev = prev
prev = current
return current
# Fibonacci通项公式方法
def fibonacci_formula(n):
if n <= 0:
raise ValueError("输入值错误,请输入正整数。")
if n == 1 or n == 2:
return 1
sqrt_5 = 5 ** 0.5
phi = (1 + sqrt_5) / 2
return round((phi ** n - (-phi) ** -n) / sqrt_5)
# 主程序
while True:
try:
n = int(input("请输入月份n的值:"))
if n <= 0:
raise ValueError("输入值错误,请输入正整数。")
print("非递归方法计算结果:", fibonacci_non_recursive(n))
print("Fibonacci通项公式方法计算结果:", fibonacci_formula(n))
continue_or_exit = input("是否继续计算?(是/否):")
if continue_or_exit.lower() == "否":
break
except ValueError as e:
print(e)
```
(3) 在程序中,通过使用`try-except`块来捕获输入值错误的异常,并提示用户重新输入,直到输入正确为止。
(4) 程序会在计算完一次后询问用户是否继续计算,只有当用户输入"是"时才会继续计算,输入"否"时程序会退出。
(5) 方法比较和优劣势:
- 递归方法:递归方法的代码简洁易懂,但在计算大数值时会出现性能问题,因为计算过程中会重复计算相同的子问题。
- 非递归方法:非递归方法的代码相对复杂一些,但在计算大数值时性能较好,因为它避免了重复计算子问题。
- Fibonacci通项公式:该方法的代码简洁明了,计算速度非常快,但对于大数值可能会有精度问题。
综上所述,非递归方法在性能和可读性上都比较好,是较好的选择。Fibonacci通项公式在计算速度上表现出色,但可能对于大数值存在精度问题。递归方法在理解上比较容易,但在计算大数值时可能效率较低。
阅读全文