重复函数应用

6 投票
4 回答
6821 浏览
提问于 2025-04-16 18:22

我遇到了一道问题,内容是这样的:写一个递归函数,叫做 repeatedlyApply,它需要两个参数,一个是接收一个参数的函数 f,另一个是一个正整数 n。这个 repeatedlyApply 的结果是一个接收一个参数的函数,它会把 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 个回答

3

我有一个基于lambda表达式的解决方案:

>>> 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
5

正确的答案是:

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
4

你的函数需要一些改进:

  • 你在 for 循环里面放了一个 return,这样会让你立刻返回结果,而不是继续执行循环。
  • 你在 for 循环里面又调用了自己,这样会让你重复做很多次,建议你选择其中一个方式来做。
  • 当你把多个函数组合在一起时要小心,你现在的组合方式有点复杂,像是强力组合,而不是简单的线性组合。

你能告诉我们你具体想要做什么吗?

编辑:因为其他人都在回答:

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

撰写回答