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

Posted

技术标签:

【中文标题】递归函数不返回创建的字符串【英文标题】:Recursive function doesn't return created string 【发布时间】:2016-04-19 18:53:07 【问题描述】:

我是 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

但如果我将maxNum 设置为 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

为什么bestResponse 输出会为输入 71 打印两次?而且虽然第一次打印是对的,为什么函数返回的第二个结果是错误的?

编辑

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

【问题讨论】:

【参考方案1】:

我认为你应该这样做:

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

而不是

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

【讨论】:

以上是关于递归函数不返回创建的字符串的主要内容,如果未能解决你的问题,请参考以下文章

子串递归算法不起作用

尾递归

尾递归

将递归函数分配给python中的变量

递归的调用

递归向量返回