重复函数python

时间:2014-06-17 12:55:24

标签: python

我在python中遇到了高阶函数。我需要编写一个重复函数repeat,它将函数f n次应用于给定的参数x

例如,repeat(f, 3, x)f(f(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。我读到了How to repeat a function n times,但我需要以这种方式完成它,我无法弄明白......

2 个答案:

答案 0 :(得分:5)

你有两个问题:

  1. 您的递归次数错误(如果n == 1,则应调用该函数一次);和
  2. 您没有对递归调用的返回值调用f,因此该函数只应用一次。
  3. 尝试:

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

答案 1 :(得分:1)

你在那里得到了一个非常简单的错误,在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