如何使用"fn",它生成一个计算黄金比例的函数



使用"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"是调用次数(以及连续分数中的项数(

一般来说,我完成了任务,以下是错误:

  1. 函数签名:def golden_ratio (n(,其中"n"是调用次数(以及连续分数中的项数(。

  2. 打印 (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

您选择了其典型的初始值01q, 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。因此,你会得到一个除以零的误差。

可能的解决方案

有三种可能的解决方案可以修复代码。

  1. 通过将 for 循环更改为for _ in range(n+1):,确保在第一次迭代中执行n = 0for _ in range(n):
  2. 或者调整初始函数参数f3(0, 1)为预期结果1, 1因为它是由return arg通过将q, w = f3(0, 1)更改为q, w = f3(1, 1)来返回
  3. 或者改变你的想法,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

最新更新