重复功能应用

时间:2011-05-26 07:59:56

标签: python recursion lambda

我遇到了以下问题的问题:重复编写一个递归函数,将函数作为参数 一个参数的f和一个正整数n。 repeatApply的结果是一个参数的函数,该参数将f应用于该参数n次。

所以,例如,我们会

repeatedlyApply(lambda x: x+1,10)(100) ==> 110

您可以假定已定义以下函数。您不必使用它,但它可以为一个漂亮的解决方案做出贡献。

def compose(f,g):
    return lambda x: f(g(x))

到目前为止我已经写了这个

def compose(f,g):
    return lambda x: f(g(x))

def recApply(f,n):
    for i in range(n):
        return recApply(compose(f,f), n-1)
    return f

我在某处出错了,因为使用上面的示例recApply(lambda x:x + 1,10)(100)我得到了1124.

非常感谢

4 个答案:

答案 0 :(得分:4)

正确答案是:

def recApply(func, n):
    if n > 1:
        rec_func = recApply(func, n - 1)
        return lambda x: func(rec_func(x))
    return func

输出:

>>>> print recApply(lambda x: x+1,10)(100)
110

答案 1 :(得分:2)

我有一个基于lambdas的解决方案:

>>> f = lambda x: x + 10
>>> iterate = lambda f, n, x : reduce(lambda x, y: f(x), range(n), x)
>>> iterate(f, 10, 3)
103
>>> iterate(f, 4, 4)
44
>>> f10 = lambda x: iterate(f, 10, x)
>>> f10(5)
105

答案 2 :(得分:2)

你的功能需要一些工作:

  • return循环中有for,因此您可以立即返回,而不是运行循环。
  • 你的for循环中有一个递归调用,所以你做了太多的迭代。选择其中一种。
  • 当你将功能组合叠加在一起时要小心,你正在做功率组合而不是线性组合。

你能告诉我们你究竟想要做什么吗?

编辑:由于其他人都在发布答案:

recApply = lambda f, n: lambda x: x if n == 0 else recApply(f, n-1)(f(x))

答案 3 :(得分:0)

我认为这是某种练习。有几种方法可以做到,这里有一个简短的方法:

>>> repeatedlyApply = lambda f, n: reduce(lambda f1, f2: compose(f1, f2), [f]*n)
>>> repeatedlyApply(lambda x: x+1,10)(100)
110