使用lambda表达式的递归函数

时间:2013-12-23 21:45:45

标签: python recursion lambda

我需要创建一个递归函数repeat,它接受一个函数并使用函数n次,值为x。这是一个迭代版本,可以更详细地解释我的问题。

def repeat(fn, n, x):
    res = x
    for i in range(n):
        res = fn(res)
        print(res)
    return res

print(repeat(lambda x: x**2, 3, 3)) returns 6561

首先需要3 ^ 2,然后是3 ^ 2 ^ 2,这是81然后又是3 ^ 2 ^ 2 ^ 2 = 6561。 我怎样才能使这个递归,所以它可以像这样工作。

square_three_times = repeat(lambda x: x**2, 3)
print(square_three_times(3)) return 6561

我尝试过这样的事情,但我真的迷失了,不知道该怎么做。

def repeat(fn, n):
    if n == 1:
        return fn(n):
    else:
        def result(x):
            return fn(n)
    return repeat(fn,result(x))

这显然不会起作用,因为递归会永远持续下去。但我不知道我应该如何编写这段代码,因为我首先需要计算3 ^ 2才能进行下一步9 ^ 2,依此类推。

2 个答案:

答案 0 :(得分:4)

首先,您的基本情况有误:

if n == 1:
    return fn

毕竟,repeat(fn, 1)只是一次应用fn的功能 - fn

现在,如果基本案例是n == 1,那么递归案例几乎总是将n - 1传递给自己。

那么,repeat(fn, n)repeat(fn, n-1)之间的区别是什么?如果你无法解决这个问题,请在头脑中或纸上展开一个简单的案例:

repeat(fn, 3)(x): fn(fn(fn(x)))
repeat(fn, 2)(x): fn(fn(x))

现在很明显:repeat(fn, n)fn(repeat(fn, n-1))是一回事,对吧?所以:

else:
    def new_fn(x):
        return fn(repeat(fn, n-1)(x))
    return new_fn

然而,正如影片评论员在评论中指出的那样,在partial处使用会更容易:

def repeat3(fn, n, x):
    if n == 1:
        return fn(x)
    else:
        return fn(repeat3(fn, n-1, x))

def repeat(fn, n):
    return functools.partial(repeat3, fn, n)

答案 1 :(得分:-1)

您可以根据旧的重复功能简单地定义:

repeat_new = lambda fn, n: lambda x: repeat(fn, n, x)

square_three_times = repeat_new (lambda x: x**2, 3)
print(square_three_times(3))