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),会一步步计算:
12 > 8,调用(euklid 4 8)4 < 8,调用(euklid 4 4)- 此时
x=y,返回4,这正是12和8的最大公约数。
另外,如果你想用更高效的取模版本(欧几里得算法的标准优化版),也可以写成这样:
(defun euklid (x y) (if (zerop y) x (euklid y (mod x y))))
这个版本避免了多次减法操作,效率更高,尤其是当两个数差距很大的时候。
内容的提问来源于stack exchange,提问作者user9815351
相关产品推荐
相关产品推荐

