在python中递归定义函数

时间:2017-02-21 02:56:45

标签: python python-3.x loops lambda

我有一个关于lambda函数的简单问题。我想做一个循环,其中每个迭代都根据前一次迭代中的lambda函数定义一个新的lambda函数。

f = lambda x: x**2
j=0
J=2
while j<J:
    f2 = lambda x: 0.5*f(x)
    f = f2
    j+=1

我期望f(3)的结果为2.25 = 0.5 * 0.5 * 3 ** 2。但是,我收到以下错误:

RecursionError: maximum recursion depth exceeded

我认为lambda函数可以像这样灵活使用。我想有一种已知的pythonic方式如何正确地做到这一点?

2 个答案:

答案 0 :(得分:3)

lambda中的名称f在调用lambda时被查找 - 此时它引用lambda本身,因此是无限递归。

在特定时刻捕获值的通常习惯是使其成为lambda的默认参数,在定义时对其进行评估:

    f2 = lambda x, f=f: 0.5*f(x)

答案 1 :(得分:3)

创建lambda函数时,它会维护对本地环境的引用,以便在调用lambda时可以在lambda内查找变量。您需要将第一个f = lambda x: x**2 j=0 J=2 while j<J: f2 = lambda x, f=f: 0.5*f(x) f = f2 j+=1 函数作为参数传递给第二个函数:

Array
(
    [files] => Array
        (
            [0] => news/idENPYygDf.png
        )

    [metas] => Array
        (
            [0] => Array
                (
                    [date] => Tue, 21 Feb 2017 03:55:27 +0100
                    [extension] => png
                    [file] => news/idENPYygDf.png
                    [name] => idENPYygDf.png // Can't get this Name
                    [old_name] => lobat.png
                    [replaced] => 
                    [size] => 313342
                    [size2] => 306.00 KB
                    [type] => Array
                        (
                            [0] => image
                            [1] => png
                        )

                )

        )

)

请注意,Python docs FAQ

中介绍了这一点