首页 > 解决方案 > 如何多次应用一个功能?

问题描述

  1. 对于给定的函数(具有一个参数,参数类型和返回值类型相等)生成另一个多次应用原始函数的函数。例子:

     from math import sin
     f1 = fn(lambda x: "sin(%s)" % x, 5)
     f2 = fn(lambda x: sin(x), 5)
     print("%s = %f" % (f1("1"), f2(1)))
     >>sin(sin(sin(sin(sin(1))))) = 0.587181
     print("%s = %f" % (f1("2"), f2(2)))
     >>sin(sin(sin(sin(sin(2))))) = 0.606464
     print(fn(lambda x: sin(x), 0)(1000))
     >> 1000
    

函数签名:def fn (f, n)

  1. 使用“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' 是调用次数(以及连分数中的项数)

这就是我所做的,黄金比例很好地计算了一切。但是对于任务的第一部分,出现了问题,如示例中...

第一个函数 fn 将应用类似函数给定的次数

第二个函数 - 黄金比例,应该使用 fn 来计算

代码:

n = 100
def golden_ratio(f,n):
    def wrap(*arg):
        for _ in range(n+1):
            arg = f(*arg)
        return arg
    return wrap
 
def fib(q, w):
    q, w = w, q + w
    return q, w
 
f3 = golden_ratio(fib, n)
q, w = f3(0, 1)
# gold section
print(w / q)

它被执行,但并不完全正确,如示例中所示

标签: python

解决方案


尝试使用这个:

def fn(f, n):
    r = 1/2
    for i in range(n):
        r = f(r)
    return r
    
    f = lambda x: 1+(1/x)

fn(f, 20)   # answer: 1.6180339789779863

推荐阅读