0

Common Lisp を使用して再帰的にハノイの塔を実装しようとしています。再帰呼び出しが何であり、どのように機能するかは知っていますが、あるリストの最後から別のリストの最後に何かを移動する方法についてはわかりません。これを行う方法についていくつかの調査を行おうとしていましたが、オンラインで何も見つかりませんでした。

どんな助けでも大歓迎です。

ありがとう!

4

1 に答える 1

2

butlastでリストの最後の要素を削除したり、 last で最後の要素を取得したり、 appendで別のリストにリストを cat 追加したりできます(追加する要素を 1 つの要素リストにするために、要素をコンスするだけです)。すべての関数が最後のリストを見つけるためにリストをトラバースする必要があるため、CL のリストの最後での作業は最適ではありませんが、両端で追加/削除する必要がある場合に行われます。

ハノイの塔では、ディスクを積み重ねていて、最後に置かれたディスクが最初に出されます。(cdr pole-a)Common Lisp (実際には Lisp のいとこ)では、再帰呼び出しで最上位の要素を削除し、再帰呼び出しでwithにpole-a追加することで、前に追加したり前から削除したりすることが簡単にできます。pole-b(cons (car pole-a) pole-b)

必要な移動を計算するためにそのような構造は必要ないため、各ステージでどのディスクが移動されたかを実際に確認できるようにするためにこれが必要だと思います。このようなシナリオでは、極の名前とレベル、再帰、およびこのラウンドで移動するディスクの数だけが必要です。

于 2013-11-09T19:53:22.857 に答える