Scheme编写列表元素连乘程序始终返回0的问题排查
逻辑错误定位
核心错误是递归终止条件的返回值不符合乘法运算的规则:乘法的恒等元是1,不是0。
原代码在递归到空列表(也就是遍历完所有元素的终止节点)时返回0,所有上层递归的乘法计算最终都会乘到这个0,不管列表里的元素是什么,最终结果必然是0。比如计算(mult-list '(2 3))的展开过程为:
(* 2 (mult-list '(3))) = (* 2 (* 3 (mult-list '()))) = (* 2 (* 3 0)) = 0
和你观察到的始终返回0的现象完全吻合。
修正方案
将空列表分支的返回值从0修改为1即可。数学上连乘操作的空值(空乘积)默认就是1,任何数和1相乘都不会改变原值,能保证递归计算的正确性。
修正后的代码:
(define (mult-list lst) (if (null? lst) 1 (* (car lst) (mult-list (cdr lst)))) )
简单测试用例验证:
- 执行
(mult-list '(1 2 3 4))返回24,结果正确 - 执行
(mult-list '(6 7))返回42,结果正确 - 执行
(mult-list '())返回1,符合空乘积的数学定义,不会影响嵌套调用的计算结果。
内容的提问来源于stack exchange,提问作者Munvith Katpelly
相关产品推荐
相关产品推荐

