我想知道是否有人能够告诉我该程序如何得出正确的答案。我试图跟踪它,但不确定要去哪里,因为它有一个or,所以我很困惑应该如何跟踪它。感谢您的澄清。

编写一个函数分区,该分区接受一个由数字xs,起始位置i和所需和s组成的列表,并根据是否可以找到列表的子序列来返回TrueFalse从位置i开始的元素,其总和完全为s。请注意,总有可能产生总和正好为0的元素的子序列,即元素的空序列。

def partition(xs,i,s):
    print i,s
    if i == len(xs):
        return s == 0
    else:
        return partition(xs,i+1,s-xs[i]) or partition(xs,i+1,s)

最佳答案

rcviz模块是一个很好的工具,可帮助可视化递归函数:




  边按执行所遍历的顺序编号。 2.边缘从黑色变为灰色,以指示遍历的顺序:黑色边缘在前,灰色边缘在后。


如果遵循编号为1-11的呼叫,则可以准确了解正在发生的情况,i0开始,然后转到1、2 3,最后是4,左侧的最后一个值是partitition([1,2,3,4],4,-2),因此为s == 0返回False。

接下来,我们返回到i2的地方,然后又是3,4,最后是partitition([1,2,3,4],4,1),所以s == 1再次是False

接下来,我们从步骤6开始,以partitition([1,2,3,4],4,5)结尾,其中s == 0还是False。

最后,在右侧,我们从partitition([1,2,3,4],4,7)一直到partitition([1,2,3,4],4,0),其中s == 0为True,该函数返回True

如果您接听前四个电话,则可以看到流程如何进行以及s的更改方式。

 partitition([1,2,3,4],1,7)  # -> xs[i] = 1 s - 1 = 7
 partitition([1,2,3,4],2,5)  # -> xs[i] = 2 s - 2 = 5
 partitition([1,2,3,4],2,5)  # -> xs[i] = 3 s - 3 = 2
 partitition([1,2,3,4],2,5)  # -> xs[i] = 4 s - 4 = -2
 s == 0 # -> False

关于python - 如何跟踪此递归程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30291019/

10-09 18:48