我想知道是否有人能够告诉我该程序如何得出正确的答案。我试图跟踪它,但不确定要去哪里,因为它有一个or
,所以我很困惑应该如何跟踪它。感谢您的澄清。
编写一个函数分区,该分区接受一个由数字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模块是一个很好的工具,可帮助可视化递归函数:
边按执行所遍历的顺序编号。 2.边缘从黑色变为灰色,以指示遍历的顺序:黑色边缘在前,灰色边缘在后。
如果遵循编号为1-11的呼叫,则可以准确了解正在发生的情况,i
从0
开始,然后转到1、2 3,最后是4,左侧的最后一个值是partitition([1,2,3,4],4,-2)
,因此为s == 0
返回False。
接下来,我们返回到i
是2
的地方,然后又是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/