递归运算顺序

2024-06-16 11:20:55 发布

您现在位置:Python中文网/ 问答频道 /正文

在这段代码中

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个赋值中保持有序?你知道吗


Tags: 代码ifresultelse赋值getvalueavailmaxval
1条回答
网友
1楼 · 发布于 2024-06-16 11:20:55

由于avail == 0不是唯一的停止条件,因此该函数保证会终止。有toConsider == []就足够了。当你调用密码时

withVal, withToTake = maxVal(toConsider[1:],
                             avail - nextItem.getCost())

请特别注意代码段[1:]。这表示您只传入了toConsider列表的大部分内容。它每次都会变小1,最终它的长度会达到0。由于递归最终结束,因此您最终可以进入下一个赋值withVal += nextItem.getValue()。你知道吗

有时候,像这样的问题在一开始就很容易搞清楚pythontutor.com,它允许您一步一步地遍历和可视化代码,并查看哪些值按哪个顺序更改。我和他们没有关系,但是他们有一个很好的解决小问题的产品。你知道吗

相关问题 更多 >