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

MTV DNA:

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

根据使用lambda表达式递归函数,解决方案是使用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)可以正常工作。

谁能对此有所启发?谢谢!

tobias_k:

使用时return lambda y: f( repeat_fn(f(y), n-1) ),您所调用repeat_fnf参数是的结果f(y),即不是函数。相反,您应该传递just 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

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

JavaScript Map:为什么这不起作用?

为什么我的递归不起作用?

为什么这不起作用?CountVectorizer中的停用词

为什么使用尾部递归的F#向量加法函数不起作用?

为什么对同时在lambda参数中使用的函数使用默认模板参数不起作用

向使用pvmismatch的函数传递参数:为什么这不起作用?

AJAX POST XHR失败-为什么这不起作用?

在textareas中使用标签?为什么这不起作用?

角度的包含和范围:为什么这不起作用?

为什么这不起作用EXCEL 2010

为什么这不起作用?Android中的空指针

为什么这不起作用?(Python)

了解python装饰器。为什么这不起作用?

JSON.parse:为什么这不起作用

为什么递归不起作用?

为什么这不起作用?-尝试将属性保存在变量中以在函数中多次使用

不知道为什么这不起作用

为什么这不起作用?在哪里

JavaScript 排列函数 - 为什么这不起作用?

为什么这不起作用?

构造单向链表。为什么这不起作用?

谁能解释为什么这不起作用?

为什么这不起作用?ZXing、位图、ImageSource

全球秒表 WPF - 如何/为什么这不起作用

SwiftUI 绑定错误:为什么这不起作用?

了解箭头函数 - 为什么这不起作用,而这样做呢?

当我使用递归函数时,为什么函数参数在方括号中不起作用

为什么我的递归函数不起作用,为什么我得到奇怪的结果

为什么这不起作用?(Java for 循环条件部分)