そもそも自分が何をしているのか正確にはわからないので、これは漠然とした質問になると思いますが、ここで説明します。
私はリストを使って一般的なlispでハノイの塔の問題をしなければなりません。基本的に、関数は文字列(名前)のリストを取得し、それらをペグBを使用してペグAからペグCに移動し、リスト内の順序と同じ順序に保ちます。
私はこれまでlispを使ったことがなく、構文を理解するのが非常に難しいと感じています。これはこれまでの私のコードですgoo関数はhanoiの仕事です
(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:(GOO(1- LENG)FROM VIA TO)はラムダ式である必要があります
これは再帰的な呼び出しなので、なぜそう言っているのかわかりません。
基本的に、自分のアプローチが適切かどうかさえわからないため、どこで続行するか、どこで再開するかについて、いくつかのヒントやコツが必要です。何でも大歓迎です。ありがとう