2011-10-12 56 views
0

我認爲這將是一個模糊的問題,因爲我不知道我到底是在做什麼,但在這裏它走了。河內共同lisp的塔樓

我不得不用普通的lisp來做一個河內問題的塔。基本上,一個函數需要一個字符串(名稱)列表,然後使用掛鉤B將它們從掛鉤A移動到掛鉤C以存儲,並保持它們與列表中的順序相同。

我從來沒有使用過lisp,我覺得這個語法很難理解。 這是到目前爲止我的代碼 咕功能是河內工作

(defparameter A '()) 
(defparameter B '()) 
(defparameter C '()) 


(defun findPeg (p1 p2) (cond ((= 0 (- 3 p1 p2))A) 
    ((= 1 (- 3 p1 p2))B) ((= 2 (- 3 p1 p2))C))) 

(defun getnum (x) (cond ((equalp x A) 0)((equalp x B)1)((equalp x C) 2))) 

(defun hanoi (x) (defparameter A x) (setlength A)(goo len A C B)) 

(defun setlength(x) (defparameter len (list-length x))) 


(defun goo (leng from to via) 

    (cond ((= leng 1)(push (pop A) C)) ;base case 


((goo (1- leng) from via to)(push (pop A) B) ;say/do something i think 


((goo (1- leng) via to from)(push (pop B) C) ;say/do something i think 


)))) 

我的問題是用遞歸調用。對於我應該做什麼,我感到非常困惑。我知道我顯然必須將第一個列表中的第一個字符串移動到另一個掛鉤,但我不知道哪個掛鉤,甚至不知道如何操作列表。我覺得我應該使用傳遞給goo函數的變量,但我不知道如何編輯它們,因爲當我在函數中更改它們時,外部變量不會更改。

現在我遇到了錯誤

* - 系統::%EXPAND-FORM:(GOO(1冷)FROM VIA TO)應該是lambda表達式

這是遞歸調用,所以我不知道它爲什麼這麼說。

基本上我只想要一些提示或技巧,以瞭解哪裏可以繼續或何時重新啓動,因爲我甚至不知道我的方法是否合適。 任何事情,非常感謝。謝謝

回答

1

首先,在DEFUN中使用defparameter幾乎從來都不是正確的做法。

如果你想有一個詞法範圍的變量,使用LET(或者只是命名你的形式參數,因爲你想命名它們)。

其次,你在GOO函數中有一些形式((fun arg ..) (fun arg ...))。你想失去最外面的括號。