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

LISP实现欧几里得算法报错:#1#不是符号或lambda表达式

修正你的欧几里得算法Lisp代码

首先,咱们来拆解你遇到的错误提示:In the form (#1=(- X Y) Y), #1# is not a symbol or lambda expression. 这个错误的根源很直观——你在递归调用euklid的时候多套了一层不必要的括号!

在Lisp的语法里,函数调用的格式是(函数名 参数1 参数2 ...),你写的(euklid((- x y) y))相当于把(- x y)当成了一个函数来调用,然后把y作为它的参数,这显然不是你想要的逻辑。你真正想做的是把(- x y)作为第一个参数传给euklid,所以要去掉这层多余的括号。

另外,你的代码还有个逻辑漏洞:只处理了x > y的情况,没考虑y > x的场景,这样当y比x大的时候,函数会直接返回nil,不符合欧几里得算法的要求。

修正后的完整代码

(defun euklid (x y)
  (cond
    ((= x y) x)
    ((> x y) (euklid (- x y) y))
    ((< x y) (euklid x (- y x)))))

验证一下

比如调用(euklid 12 8),会一步步计算:

  1. 12 > 8,调用(euklid 4 8)
  2. 4 < 8,调用(euklid 4 4)
  3. 此时x=y,返回4,这正是12和8的最大公约数。

另外,如果你想用更高效的取模版本(欧几里得算法的标准优化版),也可以写成这样:

(defun euklid (x y)
  (if (zerop y)
      x
      (euklid y (mod x y))))

这个版本避免了多次减法操作,效率更高,尤其是当两个数差距很大的时候。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:55:08