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

如何修改Scheme的groupSum函数实现子集和判断功能?

实现Scheme的groupSum子集和函数

看起来你已经有了递归处理列表的基础,现在只需要把"计算总和"的逻辑改成"判断是否存在子集和等于目标值"的递归分支就可以啦。子集和问题的核心是对每个元素做两种选择:包含它或者不包含它,我们可以基于这个思路来修改代码:

(define (groupSum elemList target)
  (cond
    ; 终止条件1:列表为空时,只有目标和为0才说明找到符合条件的子集
    ((null? elemList) (= target 0))
    ; 递归分支:两种选择,只要其中一种成立就返回#t
    (else (or 
           ; 选择1:不包含当前元素,递归处理剩余列表,目标和不变
           (groupSum (cdr elemList) target)
           ; 选择2:包含当前元素,递归处理剩余列表,目标和减去当前元素的值
           (groupSum (cdr elemList) (- target (car elemList)))))))

代码解释

  • 首先调整了函数参数,让它接收两个参数:elemList(数字列表)和target(目标和),这是实现需求的基础
  • 第一个cond分支是终止条件:当列表为空时,只有目标和刚好减到0,才说明我们找到了一组元素的和等于初始目标,返回#t;否则返回#f
  • 第二个分支是递归核心:用or连接两种可能性——要么不选当前元素,直接递归处理剩下的列表;要么选当前元素,把目标和减去当前元素的值再递归处理剩下的列表。只要其中一种情况返回#t,整个函数就返回#t

测试示例

测试你给出的例子,结果完全符合预期:

(groupSum '(1 2 5) 7)
#t
(groupSum '(1 2 5) 4)
#f

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:52:03