python - 使用 lambda 的递归函数,为什么这不起作用?

标签 python recursion lambda

我有一个函数可以做一些计算,g(x)。我现在想编写一个函数来计算 g(g(g(...g(x)))),其中 g 被应用了 n 次。我尝试使用 repeat_fn(见下文)来执行此操作,但这不起作用。

根据 Recursive function using lambda expression解决方案是使用 functools.partial。这确实有效,但我不明白如何。另外,我不明白为什么我的方法不起作用。

g = lambda x: 2*x

# Function that returns the fˆn map
def repeat_fn(f, n):
     if n == 1:
         return f
    else:
        return lambda y: f( repeat_fn(f(y), n-1) )


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

def repeat_fn2(fn, n):
    return functools.partial(repeat_fn_base, fn, n)


j = repeat_fn2(g, 5)
print(type(j))
print(j(2))

k = repeat_fn(g, 5)
print(type(k))
print(k(2))

看起来 repeat_fn 在我使用 k = repeat_fn(g, 5) 时只被调用一次,而我预计它会被调用五次。显然,在我为 k 提供参数之前,递归不会开始。此外 print(k(2)) 给出以下错误:TypeError: unsupported operand type(s) for *: 'int' and 'function'

这让我感到惊讶,因为例如h = g(g(x) 工作得很好。

任何人都可以阐明这一点吗?谢谢!

最佳答案

使用 return lambda y: f( repeat_fn(f(y), n-1) ),您将使用 f 调用 repeat_fn > 参数是 f(y) 的结果,即 不是 函数。相反,您应该只传递 f,然后将 fn_repeat(一个函数)的结果应用到 f(y)(反之亦然)。

def repeat_fn(f, n):
    if n == 1:
         return f
    else:
        return lambda y: repeat_fn(f, n-1)(f(y))

k = repeat_fn(lambda x: 2*x, 5)
print(k(2))  # 64

关于python - 使用 lambda 的递归函数,为什么这不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48687138/

相关文章:

python - 打印数据框名称

java - 如何使用 Stream 拆分集合中的奇数和偶数以及两者的总和

lambda - Collectors.toMap 的 mergeFunction 是否允许修改其参数?

python - 关闭我在 fdopen 中使用的文件描述符

Python 脚本 - mysql.connector 不更新 MariaDB 表

iterator - 使用 python 连接上一句和下一句

php删除特定文件夹及其所有内容

recursion - "coin change"和 "Number of of ways of climbing staircase"的方法有什么区别

mysql - 在这种情况下递归是最佳解决方案吗?

c# - 检查 C# Action/Lambda/Delegate 是否包含任何代码/语句