如何输出和为目标值的组合对应的原输入列表索引?
解决组合求和中的索引输出错误问题
我明白你的问题了——你的脚本能正确找到和为目标值的数值组合,但输出的索引是临时列表的位置,不是原输入数组的真实索引。咱们来一步步修复这个问题。
问题根源
你当前代码里的index = [[num,indices] for indices,num in enumerate(partial)]这行是关键错误:enumerate(partial)得到的是partial这个临时列表里元素的位置(比如partial=[2,4]时,索引是0和1),而不是这些元素在原输入数组中的原始索引。
修复方案:跟踪原始索引
我们需要在递归过程中始终跟踪每个数值对应的原数组索引,而不是只跟踪数值本身。这里有两种简洁的实现方式:
方法1:传递原始索引参数(推荐)
这种方法通过start_idx避免重复组合,同时直接收集原数组索引:
numbers = [1,2,3,4,5] target = 6 def calc_combo(start_idx, input_nums, target_sum, partial_vals=[], partial_indices=[]): total = sum(partial_vals) # 找到符合条件的组合,输出索引和数值 if total == target_sum: print(f"{partial_indices} = {partial_vals} = {target_sum}") return # 总和超过目标,直接返回 if total >= target_sum: return # 从start_idx开始遍历,避免重复组合 for i in range(start_idx, len(input_nums)): num = input_nums[i] # 递归调用:下一次从i+1开始,添加当前数值和索引到partial calc_combo(i + 1, input_nums, target_sum, partial_vals + [num], partial_indices + [i]) # 初始调用:从索引0开始 calc_combo(0, numbers, target)
运行后输出:
[0, 1, 2] = [1, 2, 3] = 6 [0, 4] = [1, 5] = 6 [1, 3] = [2, 4] = 6
方法2:绑定数值与原始索引
这种方法把数值和原始索引打包成元组,在递归中传递:
numbers = [1,2,3,4,5] target = 6 def calc_combo(numbers_with_indices, target_sum, partial=[]): total = sum(num for num, idx in partial) if total == target_sum: # 提取原始索引和数值列表 indices = [idx for num, idx in partial] values = [num for num, idx in partial] print(f"{indices} = {values} = {target_sum}") return if total >= target_sum: return for i in range(len(numbers_with_indices)): current_num, current_idx = numbers_with_indices[i] remaining = numbers_with_indices[i+1:] calc_combo(remaining, target_sum, partial + [(current_num, current_idx)]) # 初始调用:把数值和原始索引绑定 calc_combo([(num, idx) for idx, num in enumerate(numbers)], target)
这个方法的输出和上面完全一致,适合习惯用元组打包数据的场景。
针对你的示例验证
如果输入是([1,2,3,4], target_sum=6),把numbers改成[1,2,3,4]后运行代码,会输出:
[0, 1, 2] = [1, 2, 3] = 6 [1, 3] = [2, 4] = 6
完全符合你的期望。
内容的提问来源于stack exchange,提问作者Sean H.
相关产品推荐
相关产品推荐

