【问题标题】:Python recursion error when multiplying functions乘法时Python递归错误
【发布时间】:2018-11-13 08:45:36
【问题描述】:

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

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

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

【问题讨论】:

    标签: python function recursion


    【解决方案1】:

    循环中的赋值相当于:

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

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

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

    您可以使用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
    

    【讨论】:

    • 哦哈哈我自己写了这个练习,疯狂的时间。不过还是谢谢你的解释!
    【解决方案2】:

    我从未找到解决此问题的方法,但确实找到了解决方法。我没有尝试直接将其相乘,而是编写了一个函数来进行乘法运算。这似乎有效,所以我将使用它来代替。

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

    【讨论】:

      【解决方案3】:

      另一种语法:您可以使用嵌套的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))
      

      似乎比默认参数更通用的解决方案(语言方面)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多