You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

回溯时如何存储递归结果?递归排列生成代码无法留存结果求助

我明白你的问题了——这段回溯代码能正确打印排列,但没法把结果持久存储下来,本质是因为你操作的是同一个可变列表对象,回溯时的修改会覆盖之前的内容,对吧?

问题根源

原代码里的result是一个可变的列表,所有递归调用共享同一个列表的引用。当递归终止时打印,此时列表内容是正确的排列,但如果直接把result添加到收集列表里,你存的只是这个列表的"指针"——后面回溯修改元素时,之前存的所有条目都会跟着变化,最后得到的全是最后一次修改的结果。

修改方案:存储结果的副本

解决的核心是在递归终止时,存储result的副本而非原引用。下面给你两种可行的修改方式:

方式1:传入外部列表收集结果(更直观)

def permute_util(str_list, count, result, level, output):
    if level == len(result):
        # 把当前排列转成字符串(不可变)或者创建列表副本存入
        current_perm = ''.join(result)
        print(current_perm)
        output.append(current_perm)
        return
    for i in range(len(str_list)):
        if count[i] == 0:
            continue
        result[level] = str_list[i]
        count[i] -= 1
        permute_util(str_list, count, result, level + 1, output)
        count[i] += 1

# 调用示例(修正了你之前count数组的笔误,假设每个字符出现1次)
input_str = "ABC"
count_arr = [1] * len(input_str)
result_temp = [None] * len(input_str)
output_list = []
permute_util(list(input_str), count_arr, result_temp, 0, output_list)

print("\n存储的所有排列:")
print(output_list)

方式2:让函数返回收集到的结果(更函数式)

def permute_util(str_list, count, result, level):
    output = []
    if level == len(result):
        current_perm = ''.join(result)
        print(current_perm)
        output.append(current_perm)
        return output
    for i in range(len(str_list)):
        if count[i] == 0:
            continue
        result[level] = str_list[i]
        count[i] -= 1
        # 递归收集子问题的排列结果
        sub_results = permute_util(str_list, count, result, level + 1)
        output.extend(sub_results)
        count[i] += 1
    return output

# 调用示例
input_str = "ABC"
count_arr = [1] * len(input_str)
result_temp = [None] * len(input_str)
output_list = permute_util(list(input_str), count_arr, result_temp, 0)

print("\n存储的所有排列:")
print(output_list)

关键说明

  • 不管用哪种方式,核心都是避免直接存储原result列表:用''.join(result)转成不可变的字符串,或者用result.copy()创建新列表,这样后续回溯修改不会影响已经存储的内容。
  • 你之前count数组里的[2,...应该是笔误,如果是处理重复字符的排列(比如"AAB"),只需要把count_arr改成对应字符的出现次数(比如[2,1])即可,原有的去重逻辑是有效的。

内容的提问来源于stack exchange,提问作者static_class

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:35:04