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

求适合初学者的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(没有符合条件的元素对,空乘积的数学定义就是1)
  2. 递归逻辑:
    • 固定当前列表的第一个元素,计算它和后面所有元素的差,把这些差相乘得到第一部分结果
    • 递归处理去掉第一个元素后的子列表,得到第二部分结果
    • 两部分结果相乘就是整个列表的最终计算值

实现代码

我们可以先写一个简单的辅助函数,专门计算单个数值和列表中所有元素的差的乘积:

;; 辅助函数:计算 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:27:01