【问题标题】:Recursive function using lambda expression使用 lambda 表达式的递归函数
【发布时间】:2013-12-24 06:38:14
【问题描述】:

我需要创建一个递归函数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 等等。

【问题讨论】:

  • 你需要让它递归,还是需要它像那样工作?不必涉及递归。
  • 我需要它是递归的
  • 为什么不使用x 参数作为递归变量?
  • 如果你想要一个只做重复的函数实现repeat(fn, n, x)并使用functools.partial来实现柯里化。
  • 请注意,在 Python 3.3 中,您问题中的给定示例返回 81。

标签: python recursion lambda


【解决方案1】:

首先,你搞错了基本情况:

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

然而,正如电影人在 cmets 中指出的那样,在这里使用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)

【讨论】:

  • 感谢我尝试使用您的第一个示例,但返回 fn 时语法无效,我编辑了原始帖子。编辑:没关系,发现我的愚蠢错误。
【解决方案2】:

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

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

【讨论】:

  • 是的,但这不是递归的,他的问题的重点是如何递归地进行。 (另外,这只是写partial 的一种更冗长的方式。)
  • @abarnert: functool.partial 只会给你一层偏心,不是吗? partial 有什么简单的方法可以将f(x, y, z) 变成g(x)(y)(z),而不是使用g = lambda x: lambda y: lambda z: f(x, y, z)
  • 这就像是在说lambda 只允许你明确地写出一层偏心……你总是可以在partial 上调用partial
猜你喜欢
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 2011-03-09
相关资源
最近更新 更多