2011-10-12 23 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 ...))。你想失去最外面的括号。