使用"fn"生成计算黄金比例近似的函数。
最终公式: 1
+ 1/(1 + 1/(1 + 1/(...(((一些结果:
golden_ratio(0) = 1
golden_ratio(1) = 2
golden_ratio(2) = 1.5
golden_ratio(100) = 1.6180...
函数签名:def golden_ratio (n(,其中"n"是调用次数(以及连续分数中的项数(
一般来说,我完成了任务,以下是错误:
函数签名:def golden_ratio (n(,其中"n"是调用次数(以及连续分数中的项数(。
打印 (w/q( 结果不正确。
当 n = 1000 时,它显示大约 1.62,这是应该的。
golden_ratio(0) = 1
golden_ratio(1) = 2
golden_ratio(2) = 1.5
但是有了这些 n - 它不起作用。 请帮帮我(
这是我的代码:
n=1000
def fn(f,n):
def wrap(*arg):
for _ in range(n):
arg = f(*arg)
return arg
return wrap
def fib(q, w):
q, w = w, q + w
return q, w
f3 = fn(fib, n)
q, w = f3(0, 1)
# gold section
print(w / q)
定义斐波那契函数时
def fib(q, w):
q, w = w, q + w
return q, w
您选择了其典型的初始值0
和1
q, w = f3(0, 1)
假设函数的第一次调用导致q = 1, w = 1
导致w / q = 1.0
。
您的问题
给定n = 0
和您的代码,您的问题是fib(0, 1)
不会由arg = f(*arg)
执行,因为您的 for 循环for _ in range(n):
不会执行(n = 0 -> range(0, 0)
(!
然后,以下return arg
返回初始函数参数0, 1
(未更改(,结果为q = 0, w = 1
。因此,你会得到一个除以零的误差。
可能的解决方案
有三种可能的解决方案可以修复代码。
- 通过将 for 循环更改为
for _ in range(n+1):
,确保在第一次迭代中执行n = 0
for _ in range(n):
- 或者调整初始函数参数
f3(0, 1)
为预期结果1, 1
因为它是由return arg
通过将q, w = f3(0, 1)
更改为q, w = f3(1, 1)
来返回
的 - 或者改变你的想法,
golden_ratio(0)
实际上是近似的第一次迭代,因此你迭代变量n
是基于 1 而不是从 0 开始的,即在你的代码n >= 1
中强制执行。
选择第一个选项,你会得到
n=0
def fn(f,n):
def wrap(*arg):
for _ in range(n+1): # <-- fix for-loop
arg = f(*arg)
return arg
return wrap
def fib(q, w):
q, w = w, q + w
return q, w
f3 = fn(fib, n)
q, w = f3(0, 1)
# gold section
print(w / q)
这给你
golden_ratio(0) = 1.0
golden_ratio(1) = 2.0
golden_ratio(2) = 1.5
golden_ratio(3) = 1.6666666666666667
golden_ratio(4) = 1.6
golden_ratio(5) = 1.625
...
golden_ratio(100) = 1.618033988749895
...
golden_ratio(999) = 1.618033988749895
golden_ratio(1000) = 1.618033988749895