Python 中的重复函数

6 投票
2 回答
45820 浏览
提问于 2025-04-18 10:04

我在学习Python中的高阶函数时遇到了困难。我需要写一个叫做repeat的函数,这个函数可以把另一个函数f在给定的参数x上执行n次。

举个例子,repeat(f, 3, x)的意思就是f(f(f(x))),也就是把f这个函数连续应用三次在x上。

这是我目前写的代码:

def repeat(f,n,x):
    if n==0:
        return f(x)
    else:
        return repeat(f,n-1,x)

当我尝试运行以下这行代码时:

plus = lambda x,y: repeat(lambda z:z+1,x,y)
assert plus(2,2) == 4

它给我返回了一个AssertionError错误。我看过关于如何重复执行一个函数n次的内容,但我需要按照这种方式来实现,结果我还是搞不定……

2 个回答

2

你这里有个很简单的错误。在else的部分,你只是把x传递过去,但并没有对它做任何处理。而且当n等于0的时候,你也在使用x,这样是不对的。

def repeat(f,n,x):
    """
    >>> repeat(lambda x: x+1, 2, 0)
    2
    """
    return repeat(f, n-1, f(x)) if n > 0 else x
5

你遇到了两个问题:

  1. 你递归调用的次数不对(如果 n == 1,这个函数应该只调用一次);
  2. 你没有对递归调用返回的值再调用一次 f,所以这个函数实际上只被应用了一次。

试试这个:

def repeat(f, n, x):
    if n == 1: # note 1, not 0
        return f(x)
    else:
        return f(repeat(f, n-1, x)) # call f with returned value

或者,你也可以试试这个:

def repeat(f, n, x):
    if n == 0:
        return x # note x, not f(x)
    else:
        return f(repeat(f, n-1, x)) # call f with returned value

(感谢 @Kevin 提供的后者,它支持 n == 0 的情况)。

举个例子:

>>> repeat(lambda z: z + 1, 2, 2)
4
>>> assert repeat(lambda z: z * 2, 4, 3) == 3 * 2 * 2 * 2 * 2
>>> 

撰写回答