Elixir中输出异常问题及子列表收集需求求助
解决Elixir中收集和为目标值的子列表问题
原代码的核心问题
- 仅实现了递归终止逻辑,缺少遍历数组元素时选择/不选择当前元素的递归分支,无法覆盖所有可能的子列表情况
- 直接通过IO打印无法收集所有符合条件的结果,需要通过递归返回值来累积目标子列表
完整实现代码
defmodule SubsetSum do # 入口函数:接收原数组和目标和,初始化递归参数 def find_subsets(arr, target) do find_subsets(arr, 0, [], 0, target, []) end # 递归辅助函数:处理每个元素的选择逻辑,累积结果 defp find_subsets(arr, indx, current_list, sum_so_far, target, result) do cond do # 终止条件:遍历完所有元素 indx == length(arr) -> if sum_so_far == target do # 将符合条件的子列表反转(保持与原数组元素顺序一致),加入结果集 [Enum.reverse(current_list) | result] else result end # 递归分支:处理当前元素的两种选择 true -> current_element = Enum.at(arr, indx) # 情况1:不选当前元素,直接递归到下一个索引 result_without = find_subsets(arr, indx + 1, current_list, sum_so_far, target, result) # 情况2:选择当前元素,将元素加入当前列表、累加和后递归 find_subsets(arr, indx + 1, [current_element | current_list], sum_so_far + current_element, target, result_without) end end end
使用示例
调用函数获取目标子列表:
# 以原数组[2,2,5,3,4,7]、目标和12为例 SubsetSum.find_subsets([2,2,5,3,4,7], 12) # 返回结果:[[2,2,5,3], [4,5,3], [7,2,3]]
逻辑说明
- 递归遍历数组每个元素,分两种分支处理:
- 不选择当前元素:直接进入下一个索引,当前列表与累计和保持不变
- 选择当前元素:将元素加入当前列表、累加和后进入下一个索引
- 遍历结束时,若累计和等于目标值,将当前列表反转(保证元素顺序与原数组一致)后加入结果集
- 最终返回所有符合条件的子列表集合
内容的提问来源于stack exchange,提问作者Jadu
相关产品推荐
相关产品推荐

