2016-01-31 146 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