在这段代码中
def maxVal(toConsider, avail):
if toConsider == [] or avail == 0:
result = (0, ())
elif toConsider[0].getCost() > avail:
result = maxVal(toConsider[1:], avail)
else:
nextItem = toConsider[0]
withVal, withToTake = maxVal(toConsider[1:],
avail - nextItem.getCost())
withVal += nextItem.getValue()
withoutVal, withoutToTake = maxVal(toConsider[1:], avail)
if withVal > withoutVal:
result = (withVal, withToTake + (nextItem,))
else:
result = (withoutVal, withoutToTake)
return result
withVal为什么不是某种无限循环,因为它从函数中获取赋值变量,这意味着它在没有第一个变量的情况下再次重复,所以它不应该一直重复下去吗?直到avail达到0,然后它也被添加到“nextItem”中,这会驱动我的头。你知道吗
所以我知道
withVal, withToTake = maxVal(toConsider[1:],
avail - nextItem.getCost())
在前面
withVal += nextItem.getValue()
对于一个无限循环来说不是这样的,所以我的问题是,考虑到第一个示例演示了它再次调用函数,withVal如何能够在2个赋值中保持有序?你知道吗
由于
avail == 0
不是唯一的停止条件,因此该函数保证会终止。有toConsider == []
就足够了。当你调用密码时请特别注意代码段
[1:]
。这表示您只传入了toConsider
列表的大部分内容。它每次都会变小1,最终它的长度会达到0。由于递归最终结束,因此您最终可以进入下一个赋值withVal += nextItem.getValue()
。你知道吗有时候,像这样的问题在一开始就很容易搞清楚pythontutor.com,它允许您一步一步地遍历和可视化代码,并查看哪些值按哪个顺序更改。我和他们没有关系,但是他们有一个很好的解决小问题的产品。你知道吗
相关问题 更多 >
编程相关推荐