1

Lisp での私のコードは次のとおりです。

(defun solve-hanoi(from) (hanoi (length from) from '() '()))    

(defun hanoi(height from to aux) (when (>= height 1) 
                   (hanoi (- height 1) from aux to)
                   (format t "~%Move ~a from ~a to ~a" (nth 0 from) from to)
                   (push (pop from) to) 
                   (hanoi (- height 1) aux to from)))

私はLispが初めてで、何が間違っているのか手がかりがありません。私は何時間もこれに携わってきたので、これを手伝っていただければ幸いです。

ありがとう。

4

1 に答える 1

1

再帰アルゴリズムは次のとおりです。

ペグ A からペグ C に n 個のディスクを移動するには:
1. n-1 個のディスクを A から B に移動します。これにより、ペグ A にはディスク n だけが残ります
。 2. ディスク n を A から C に
移動します。 C 彼らはディスク n に座るように

( http://en.wikipedia.org/wiki/Tower_of_Hanoi#Recursive_solutionより)

A、B、および C (あなたのfromauxおよびto) の意味は現在のイテレーションに関連しており、変化し続けるため、ゲームの状態を渡してそれが何を意味するのかを理解しようとするのではなく、単純に解決の指示を生成する方が簡単です。

上記のアルゴリズムをこのように実装するには、 内に次のものが必要です(when (>= height 1):
1. B と C を交換する n-1 による再帰呼び出し。
2. たとえば、移動に関する情報を出力します(format t "~%Move ~a to ~a" from to)
3. n-1 による再帰呼び出し、A と B の交換。これも正解です。

次に(solve-hanoi)、最初のロッドのディスクの数を引数として受け取るように変更し、この数とロッドに必要な名前 (たとえば、4 つのディスク) を使用して (hanoi) を呼び出し(hanoi 4 'A 'B 'C)ます(hanoi 4 1 2 3)

于 2011-10-13T06:31:11.933 に答える