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

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]]

逻辑说明

  1. 递归遍历数组每个元素,分两种分支处理:
    • 不选择当前元素:直接进入下一个索引,当前列表与累计和保持不变
    • 选择当前元素:将元素加入当前列表、累加和后进入下一个索引
  2. 遍历结束时,若累计和等于目标值,将当前列表反转(保证元素顺序与原数组一致)后加入结果集
  3. 最终返回所有符合条件的子列表集合

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:01:01