求适合初学者的LISP元素差乘积函数暴力实现思路
LISP 差乘积函数实现讲解
需求说明
我们需要实现的函数输入为整数列表(x_1 x_2 ... x_n),计算所有满足i<j的元素差的乘积,公式如下:
Π (x_i - x_j), where i < j
示例:
- 输入列表
(4 3 2)时,函数应输出(4-3)*(4-2)*(3-2) = 2 - 输入为空列表时返回
1
现有代码问题
你当前编写的整合版本逻辑只计算了相邻元素的差,会遗漏第一个元素和后续所有非相邻元素的差。比如输入(4 3 2)时,现有代码只会计算(4-3)*(3-2)=1,和预期结果不符。
暴力解法思路(适合初学者)
暴力法的核心逻辑非常直接,就是遍历所有满足i<j的元素对,计算差之后相乘即可,我们可以用递归拆解实现:
- 边界条件:如果列表为空或者只有1个元素,返回1(没有符合条件的元素对,空乘积的数学定义就是1)
- 递归逻辑:
- 固定当前列表的第一个元素,计算它和后面所有元素的差,把这些差相乘得到第一部分结果
- 递归处理去掉第一个元素后的子列表,得到第二部分结果
- 两部分结果相乘就是整个列表的最终计算值
实现代码
我们可以先写一个简单的辅助函数,专门计算单个数值和列表中所有元素的差的乘积:
;; 辅助函数:计算 num 减去 lst 中所有元素的差的乘积 (defun diff-product (num lst) (if (null lst) 1 (* (- num (car lst)) (diff-product num (cdr lst)))))
主函数调用辅助函数完成递归计算即可:
(defun dprod (lst) (cond ;; 边界条件处理 ((or (null lst) (null (cdr lst))) 1) ;; 递归计算 (t (* (diff-product (car lst) (cdr lst)) (dprod (cdr lst))))))
测试验证
- 空列表输入:
(dprod '())→ 返回1,符合要求 - 单元素输入:
(dprod '(5))→ 返回1,符合要求 - 示例输入:
(dprod '(4 3 2))→ 返回2,符合要求
内容的提问来源于stack exchange,提问作者soamny12
相关产品推荐
相关产品推荐

