【问题标题】:Python runs more then it should for recursionPython 运行的次数超过了它应该用于递归
【发布时间】:2021-09-22 23:16:57
【问题描述】:

我正在尝试在 python 中编写一些递归。我想计算 A+b-A*B 并通过列表中的所有元素继续计算它。代码运行得比我预期的要多。我认为两个 0.5+add() 打印来自 0.4+add() 案例,因为它在表达式中有两个 add([0.5, 0.2]) 。如果我错了,请纠正我。但基本案例印刷最让我困惑。我不明白为什么它有 4 个。如果有人能解释这 4 个基数的来源和执行顺序,那就太好了。

这是我在这里的第一个问题。谢谢!

代码:

lst= [0.4,0.5,0.2]

def add(l):
    if len(l) == 1:
        print('base call:', l[0])
        return l[0]
    else:
        print('{zero}+add({one})-{zero}*add({one})'.format(zero=l[0], one=l[1:]))
        return l[0]+add(l[1:])-l[0]*add(l[1:])

print('result of add: ', add(lst))

壳牌:

0.4+add([0.5, 0.2])-0.4*add([0.5, 0.2])
0.5+add([0.2])-0.5*add([0.2])
base call: 0.2
base call: 0.2
0.5+add([0.2])-0.5*add([0.2])
base call: 0.2
base call: 0.2
result of add:  0.76

【问题讨论】:

    标签: python recursion functional-programming


    【解决方案1】:

    您的函数是双重递归的:每次调用都会再进行两次调用。当你第一次调用add 时,你给它所有三个元素的列表。这会进行两个调用,每个调用都使用[0.5, 0.2],正如您已正确跟踪的那样。

    现在,每个这些调用中的每一个调用了另外两个调用,使用[0.2] 作为列表l。在这个级别总共有 四个 调用,列表长度为 1。这四个调用中的每一个都是基本情况;每一个都会产生一个你的“基本案例”打印。

    如果您根据递归级别缩进print 语句,则更容易查看。然后,输出如下所示:

    0.4+add([0.5, 0.2])-0.4*add([0.5, 0.2])
      0.5+add([0.2])-0.5*add([0.2])
        base call: 0.2
        base call: 0.2
      0.5+add([0.2])-0.5*add([0.2])
        base call: 0.2
        base call: 0.2
    result of add:  0.76
    

    这是否消除了困惑?

    【讨论】:

    • 是的,我现在明白了。它来自 add([0.2]) ,其中有 4 个。感谢您的帮助。
    • 太棒了!请记住选择“最佳答案”,以便 Stack Overflow 可以正确归档问题。
    猜你喜欢
    • 1970-01-01
    • 2016-03-06
    • 2020-11-29
    • 2021-05-31
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    相关资源
    最近更新 更多