使用lambda表达式的递归函数

皮埃尔

我需要创建一个递归函数重复,该重复函数接受一个函数,并使用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))

这显然是行不通的,因为递归将永远持续下去。但是我不确定我应该如何编写此代码,因为在进行下一步9 ^ 2之前,我首先需要计算3 ^ 2,依此类推。

阿巴内特

首先,您弄错了基本情况:

if n == 1:
    return fn

毕竟,repeat(fn, 1)仅是fn一次应用的函数-即fn

现在,如果基本案例是when 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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用 lambda 表达式实现递归函数

来自分类Dev

使用lambda表达式的函数

来自分类Dev

递归Lambda表达式查询

来自分类Dev

如何对需要委托列表的函数使用lambda表达式

来自分类常见问题

使用'key'和lambda表达式的python max函数

来自分类Dev

在lambda表达式中使用外部函数

来自分类Dev

在lambda表达式中使用外部函数

来自分类Dev

什么时候在lambda表达式前使用#'(函数)?

来自分类Dev

在解析lambda表达式中使用try函数

来自分类Dev

为什么我使用 lambda 表达式而不是函数?

来自分类Dev

在Tree Implementation Java中将递归函数调用转换为lambda表达式

来自分类Dev

Lambda表达式与过程样式函数

来自分类Dev

复制lambda表达式的构造函数

来自分类Dev

Java函数的Lambda表达式实现

来自分类Dev

使用条件表达式选择lambda表达式

来自分类Dev

如何编写递归lambda表达式(LINQ查询)

来自分类Dev

在 Scala 中定义递归 lambda 表达式

来自分类Dev

在会话中使用Lambda表达式

来自分类Dev

如何使用|| 在lambda表达式中

来自分类Dev

如何使用Lambda表达式求和

来自分类Dev

使用Lambda表达式的子查询

来自分类Dev

使用Lambda表达式设置方法

来自分类Dev

在会话中使用Lambda表达式

来自分类Dev

如何使用|| 在lambda表达式中

来自分类Dev

使用lambda表达式构造线程

来自分类Dev

尝试使用 Esper Lambda 表达式

来自分类Dev

递归函数以简化javascript中的表达式

来自分类Dev

什么是“使用函数”表达式?

来自分类Dev

使用lambda表达式在Scheme中定义函数的原因是什么?