Python 回溯时如何存储递归结果?

Python 回溯时如何存储递归结果?,python,recursion,backtracking,Python,Recursion,Backtracking,我目前正在学习通过递归生成置换 我发现下面的代码非常适合打印排列,但我似乎无法存储值:堆栈中的所有值在升级时都会丢失 def permute_util(str, count, result, level): if level == len(result): print(result) return for i in range(len(str)): if count[i] == 0: continue;

我目前正在学习通过递归生成置换

我发现下面的代码非常适合打印排列,但我似乎无法存储值:堆栈中的所有值在升级时都会丢失

def permute_util(str, count, result, level):

    if level == len(result):
        print(result)
        return

    for i in range(len(str)):
        if count[i] == 0:
            continue;
        result[level] = str[i]
        count[i] -= 1
        permute_util(str, count, result, level + 1)
        count[i] += 1

permute_util(list("ABC"), [2,1,1], [None]*len("AABC"), 0)

结果:

['A', 'A', 'B', 'C']
['A', 'A', 'C', 'B']
['A', 'B', 'A', 'C']
['A', 'B', 'C', 'A']
['A', 'C', 'A', 'B']
['A', 'C', 'B', 'A']
['B', 'A', 'A', 'C']
['B', 'A', 'C', 'A']
['B', 'C', 'A', 'A']
['C', 'A', 'A', 'B']
['C', 'A', 'B', 'A']
['C', 'B', 'A', 'A']

在基本情况下,我尝试将结果添加到全局列表中,但只有最新的级别将得到存储,而所有其他以前的值将被覆盖,如下所示

 def permute_util(str, count, result, level):
    global glob 
    if level == len(result):
        **glob += [result]**
        return

    for i in range(len(str)):
        if count[i] == 0:
            continue;
        result[level] = str[i]
        count[i] -= 1
        permute_util(str, count, result, level + 1)
        count[i] += 1

permute_util(list("ABC"), [2,1,1], [None]*len("AABC"), 0)

['C', 'B', 'A', 'A']
['C', 'B', 'A', 'A']
['C', 'B', 'A', 'A']
['C', 'B', 'A', 'A']
['C', 'B', 'A', 'A']
['C', 'B', 'A', 'A']
['C', 'B', 'A', 'A']
['C', 'B', 'A', 'A']
['C', 'B', 'A', 'A']
['C', 'B', 'A', 'A']
['C', 'B', 'A', 'A']
['C', 'B', 'A', 'A']
['C', 'B', 'A', 'A']
也尝试了同样的效果:

 def permute_util(str, count, result, level, lists):
    global glob 
    if level == len(result):
        return [result]


    for i in range(len(str)):
        if count[i] == 0:
            continue;
        result[level] = str[i]
        count[i] -= 1
        foo = permute_util(str, count, result, level + 1, lists)
        lists = lists + foo
        count[i] += 1

   lists = []
   permute_util(list("ABC"), [2,1,1], [None]*len("AABC"), 0, lists)

将基本情况中的所有“结果”存储在列表中并在完成时返回的最佳方法是什么?

随着递归的进行,您会不断地反复修改结果。
你可以这样做:

def permute_util(string, count, result, level):

    if level == len(result):
        print(result)
        res.append(tuple(result))   # stores current result as a copy in an immutable tuple
        return

    for i in range(len(string)):
        if count[i] == 0:
            continue;
        result[level] = string[i]
        count[i] -= 1
        permute_util(string, count, result, level + 1)
        count[i] += 1


if __name__ == '__main__':

    res = []

    permute_util(list("ABC"), [2, 1, 1], [None]*len("AABC"), 0)
    print(res)

Python将指针附加到列表而不是实际的列表。因此,您拥有的是许多指向结果最终状态的指针,因此是重复值。尝试在每次追加时创建副本,如下所示:

final_ans = []
def permute_util(str, count, result, level):

    if level == len(result):
        final_ans.append(result[:])    # if you don't explicitly want list, try final_ans.append(''.join(result))
        return

    for i in range(len(str)):
        if count[i] == 0:
            continue;
        result[level] = str[i]
        count[i] -= 1
        permute_util(str, count, result, level + 1)
        count[i] += 1

permute_util(list("ABC"), [2,1,1], [None]*len("AABC"), 0)
for ans in final_ans:
    print(ans)

向我们展示您如何尝试将结果添加到全局列表。很可能是您做错了什么,但这很快就会起作用,我们可以向您展示如何修复它,但是如果我们看不到它,没有人可以为您修复它。同时,甚至比全局的更好:要么传递另一个
结果
列表(从
[]
开始,但您可以重复
结果。追加(结果)
),或者
返回
结果,而不只是
打印
并在备份的过程中收集。我试过了。Append也不起作用,堆栈弹出时会覆盖上一个Append,如果有帮助的话,我找到的一个解决方法是使用
glob.Append('''.join(result))
谢谢,问题似乎是只追加了指向对象的指针,而不是它本身的实际值谢谢,这就成功了!我根本没想到会有指针式的行为