Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用lambda表达式的递归函数_Python_Recursion_Lambda - Fatal编程技术网

Python 使用lambda表达式的递归函数

Python 使用lambda表达式的递归函数,python,recursion,lambda,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

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

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

首先,基本情况是错误的:

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

然而,正如filmor在评论中指出的,在这里使用
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)

您可以根据旧的repeat函数非常简单地定义它:

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

您需要让它递归,还是需要它像那样工作?递归不必涉及。我需要它是递归的。你为什么不为递归变量使用
x
参数?如果你想要一个只实现重复的函数
repeat(fn,n,x)
并使用
functools.partial
实现currying。请注意,在Python 3.3中,您问题中给出的示例返回81。感谢我尝试使用您的第一个示例,但返回fn时语法无效,我编辑了我的原始帖子。编辑:没关系,我发现了我愚蠢的失误。是的,但那不是递归的,他的问题的关键是如何递归地做。(另外,这只是一种更为详细的编写
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