如何修改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
相关产品推荐
相关产品推荐

