Башни Ханоя в общем Lisp - PullRequest
       15

Башни Ханоя в общем Lisp

0 голосов
/ 12 октября 2011

Я думаю, что это будет неопределенный вопрос, потому что я не знаю точно, что я делаю в первую очередь, но здесь это происходит.

Мне нужно решить проблему Ханоя в общих списках, используя списки. В основном функция берет список строк (имен) и затем перемещает их из колышка A в колышек C, используя колышек B для хранения, сохраняя их в том же порядке, в котором они были в списке.

Я никогда раньше не использовал lisp, и мне очень сложно понять синтаксис. Это мой код до сих пор Goo функция является работа Ханоя

(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-LENG) ОТ VIA TO) должно быть лямбда-выражением

Это рекурсивный вызов, поэтому я не знаю, почему он так говорит.

По сути, я просто хочу несколько советов или уловок о том, где продолжить или когда перезапустить, потому что я даже не знаю, хороший ли мой подход. Все очень ценится. Спасибо

1 Ответ

1 голос
/ 12 октября 2011

Прежде всего, использование defparameter внутри DEFUN почти никогда не является правильным решением.

Если вы хотите иметь переменную с лексической областью, используйте LET (или просто назовите ваши формальные параметры так, как вы хотите, чтобы они назывались).

Во-вторых, у вас есть что-то в форме ((fun arg ..) (fun arg ...)) внутри вашей функции GOO. Вы хотите потерять самые удаленные скобки.

...