代码之家  ›  专栏  ›  技术社区  ›  kahramani

递归函数不返回创建的字符串

  •  1
  • kahramani  · 技术社区  · 10 年前

    我是Python的新手,所以这可能是一个愚蠢的问题。

    我实现了一个简单的递归背包解决方案,最终返回一个比特序列。但有时它不会返回生成的序列。这是我的代码及其不同输入的结果。

    def knapsackRecursive(items, maxNum, bestResponse):
        print('items=' + str(items) + ', maxNum=' + str(maxNum))
        referenceIndex = 0
        editableMaxNum = maxNum
        if editableMaxNum == 0:
            bestResponse = '0'
        else:
            for i in reversed(items):
                item = int(i)
                if editableMaxNum >= item:
                    if referenceIndex == 0:
                        referenceIndex = items.index(str(item))
                    editableMaxNum -= item
                    bestResponse = '1' + bestResponse
                else:
                    bestResponse = '0' + bestResponse
            if editableMaxNum != 0:
                bestResponse = ''
                if referenceIndex != 0:
                    for k in range(0, len(items) - referenceIndex):
                        bestResponse = '0' + bestResponse
    
                    knapsackRecursive(items[:referenceIndex], maxNum, bestResponse)
                else:
                    bestResponse = '0'
    
        print('bestResponse=' + str(bestResponse))
        return bestResponse
    

    Items 是常数['1'、'2'、'4'、'10'、'20'、'40'、'63'、'105']。也是首字母 bestResponse 是空字符串。

    如果我设置 maxNum 作为41,输出为:

    items=['1', '2', '4', '10', '20', '40', '63', '105'], maxNum=41
    bestResponse=10000100
    

    但如果我设置 最大数量 输出为71:

    items=['1', '2', '4', '10', '20', '40', '63', '105'], maxNum=71
    items=['1', '2', '4', '10', '20', '40'], maxNum=71
    bestResponse=10011100
    bestResponse=00
    

    为什么 最佳反应 为输入71打印两次输出?尽管第一次打印是正确的,但为什么函数会返回第二个错误的结果?

    编辑

    我已经改变了 knapsackRecursive(items[:referenceIndex], maxNum, bestResponse) return knapsackRecursive(items[:referenceIndex], maxNum, bestResponse) 。似乎解决了。显然,我在使用递归时犯了一个错误。但我仍然不明白为什么函数返回第一次调用的结果,而不是第二次调用,因为预期第二次会生成正确的响应。

    1 回复  |  直到 10 年前
        1
  •  1
  •   DevLounge    10 年前

    我认为你应该:

    best_response = knapsackRecursive(items[:referenceIndex], maxNum, bestResponse)
    

    而不是

    knapsackRecursive(items[:referenceIndex], maxNum, bestResponse)