Skip to main content
 首页 » 编程设计

python之如何跟踪这个递归程序

2025年05月04日66lexus

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

编写一个函数分区,它采用数字列表 xs、起始位置 i 和所需的总和 s 并返回 True 或 False 取决于是否可以找到从位置 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模块是帮助可视化递归函数的好工具:

The edges are numbered by the order in which they were traversed by the execution. 2. The edges are colored from black to grey to indicate order of traversal : black edges first, grey edges last.

如果您跟踪编号为 1-11 的调用,您可以准确地看到发生了什么,i 从 0 开始,然后转到1、2、3 最后是 4,左边的最后一个值是 partitition([1,2,3,4],4,-2) 所以它为 s == 返回 False 0。

接下来我们回到 i 是 2 的地方,然后又是 3,4 并以 partitition([1,2,3,4], 4,1) 所以 s == 1 又是 False。

接下来我们从步骤 6 开始,以 partitition([1,2,3,4],4,5) 结束,这里 s == 0 为假。

最后在右边,我们从 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