函数乘法时的Python递归错误

时间:2018-11-12 22:07:31

标签: python function recursion

我正在使用python 3并尝试在for循环中将函数相乘。我编写了一个简单的示例代码来演示我的问题。我要这段代码要做的是从函数x ^ 2开始,然后在第一个循环中将其乘以x ^ 2,得到x ^ 4。然后再将x ^ 4与x ^ 2乘以得到x ^ 6等。

fun = lambda x: x**2

function = lambda x: x**2
for i in range(2):
    function = lambda x: function(x) * fun(x)

print(function(2))

但是代码出了递归错误。我不知道这如何导致递归?任何帮助都感激不尽。

3 个答案:

答案 0 :(得分:1)

循环中的分配等同于:

def function(x):
    return function(x) * fun(x)

这是没有停止条件的递归函数。由于python's binding rules,您对function的初始定义被遮盖了:

  

以下构造将名称绑定:形式参数到函数,   导入语句,类和函数定义(这些绑定   定义块中的类或函数名称)

您可以使用python3 -m trace --trace script.py进行跟踪并验证这种行为:

--- modulename: script, funcname: <lambda>
script.py(6):     function = lambda x: function(x) * fun(x)
--- modulename: script, funcname: <lambda>
script.py(6):     function = lambda x: function(x) * fun(x)

# Repeated until a RecursionError is thrown

您可以将函数作为lambda的参数绑定:

fun = lambda x: x**2
function = lambda x: x**2
for i in range(2):
    function = lambda x, y=function: y(x) * fun(x)

print(function(2))

这将产生以下跟踪:

--- modulename: script, funcname: <module>
script.py(3): fun = lambda x: x**2
script.py(4): function = lambda x: x**2
script.py(5): for i in range(2):
script.py(6):     function = lambda x, y=function: y(x) * fun(x)
script.py(5): for i in range(2):
script.py(6):     function = lambda x, y=function: y(x) * fun(x)
script.py(5): for i in range(2):
script.py(8): print(function(2))
--- modulename: script, funcname: <lambda>
script.py(6):     function = lambda x, y=function: y(x) * fun(x)
--- modulename: script, funcname: <lambda>
script.py(6):     function = lambda x, y=function: y(x) * fun(x)
--- modulename: script, funcname: <lambda>
script.py(4): function = lambda x: x**2
--- modulename: script, funcname: <lambda>
script.py(3): fun = lambda x: x**2
--- modulename: script, funcname: <lambda>
script.py(3): fun = lambda x: x**2
64

答案 1 :(得分:0)

我从未找到解决方案,但确实找到了解决方法。我没有尝试立即对其进行乘法运算,而是编写了一个函数来进行乘法运算。这似乎可行,所以我只使用它。

def multiplyFun(fun1,fun2):
    fun = lambda x: fun1(x) * fun2(x)
    return fun


fun = lambda x: x**2

function = lambda x: x**2
for i in range(5):
    print(i)
    function = multiplyFun(function,fun)

print(function(2))

答案 2 :(得分:0)

另一种语法:您可以使用嵌套的lambda(其中对外部变量进行评估以返回内部变量),而不是将第二个参数传递给lambda

squared = lambda x: x**2
function = lambda x: x**2

for i in range(2):
    function = (lambda f: lambda x: f(x) * squared(x))(function)

print(function(2))

似乎比默认参数更通用(在语言上)。