我想知道是否有人能够告诉我该程序如何得出正确的答案。我试图跟踪它,但不确定去哪里,因为它有一个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)
因此它返回False s == 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
。
如果您接听前四个电话,则可以看到流程如何进行以及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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句