2011-10-12 4 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 함수에 전달 된 변수를 사용해야한다고 생각하지만 변수를 변경하면 변수가 변경되지 않기 때문에 변수를 편집하는 방법을 알 수 없습니다.

는 지금은 오류

*으로 실행하고 - SYSTEM : % EXPAND-FORM : (VIA까지 GOO (1 LENG))를

이 인 람다 식을해야한다 재귀 호출 그래서 왜 그것을 말하고 있는지 몰라요.

기본적으로 나는 계속해서 또는 어디에서 다시 시작해야하는지에 대한 팁이나 트릭을 원한다. 내 접근 방식이 좋은지조차 알지 못하기 때문에. 뭐든지 크게 환영합니다. 감사합니다

답변

1

먼저 DEFUN에서 defparameter를 사용하는 것은 거의 불가능합니다.

어휘 범위 변수를 사용하려면 LET을 사용하거나 이름을 지정할 때 공식 매개 변수 이름을 지정하십시오.

두 번째로, GOO 기능 내부에 ((fun arg ..) (fun arg ...)) 형식의 항목이 있습니다. 가장 바깥 쪽 괄호를 잃고 싶습니다.