2016-01-31 215 views
-1

我是LISP的初学者。我遇到了以下错误** - IF:变量SUM-REC没有值,但不知道如何解决它。这是我的代码。使用递归计算的总和LISP

(defun sum-rec (n) 
    (if (not (eq n 0)) 

    (+ (sum-rec(-n 1))n) 
    0 
    ) 

(format t "ans = ~a~%" (sum-rec 4)) 

回答

2

不要使用eq比较数字,因为eq比较对象并没有保证,这将为数字按预期工作。改为使用eql,=,或在此情况下使用/=

功能调用表示为(func p1 p2 ...),而不是func(p1 p2 ...)

所以正确的代码是

(defun sum-rec (n) 
    (if (/= n 0) 
     (+ (sum-rec (- n 1)) n) 
     0)) 

测试:

CL-USER> (format t "ans = ~a~%" (sum-rec 4)) 
ans = 10 
NIL 

CL-USER> (+ 1 2 3 4) 
10 
+0

哦!谢谢。我可以问为什么? – Hero1134

+0

对不起,我不明白你的问题...为什么*什么*? – uselpa

+0

为什么“/ =”有效。 – Hero1134

-1
  1. 检查括号:他们是不平衡的。
  2. 请正确格式化代码:它有助于阅读并找到错误。
  3. 在Lisp空白中很重要:它将项目分开。在(sum-rec (-n 1))有一个空间缺少-n之间。 Lisp将其作为函数-n应用于1来读取,这显然不是那里的意思。

修复这些一切之后的工作原理:

(defun sum-rec (n) 
    (if (not (eq n 0)) 
    (+ (sum-rec(- n 1)) n) 
    0)) 

> (format t "ans = ~A~%" (sum-rec 4)) 
ans = 10 
+0

嘿,谢谢。天哪,LISP对于括号 – Hero1134

+0

@ Hero1134是件痛苦的事,它有助于使用突出显示匹配括号的编辑器。甚至不会让你把不平衡的括号。我知道Emacs + SLIME(+ Paredit或Smartparens)是一个(相当陡峭的)学习曲线,但它们的使用可以获得回报。 – mobiuseng

+0

好的。非常感谢。 – Hero1134