2013-11-09 68 views
0

我試圖實現河內的塔遞歸與Common Lisp的。我知道遞歸調用是什麼以及它們是如何工作的,但是我只是想知道如何將某個列表從一個列表的末尾移動到另一個列表的末尾。我試圖做一些研究如何做到這一點,但我無法在網上找到任何東西。如何移動元素從一個列表到另一個Common Lisp中 - CLISP

任何幫助將不勝感激。

謝謝!

+2

添加/從列表的末尾刪除元素/是不是在Lisp的一個好主意。這是一個緩慢的操作。 –

回答

2

您可以butlast刪除列表的最後一個元素,獲得最後一個元素與last,和你的貓追加一個列表與append另一個列表(你只是負面因素的元素被添加,以便它的一個元素列表) 。在CL中列表的末尾工作並不是最佳的,因爲每個函數都需要遍歷列表才能找到最後一個列表,但在需要在兩端添加/刪除時完成。

隨着漢諾塔你在對方最後一個看跌的頂部堆疊盤是第一位的。在Common Lisp中(其實任何Lisp的表弟),你可以輕鬆地添加到前面,從正面用遞歸調用做(cdr pole-a)pole-a除去頂部元素,並在遞歸調用添加到pole-b(cons (car pole-a) pole-b)刪除。

我想你需要這實際上能夠看到哪個磁盤中每個階段的移動,因爲你不需要這樣的結構來計算所需要的移動。在這種情況下,您只需要極點的名稱和遞歸級別以及您希望在此輪中移動的磁盤數量。

+0

我同意這可能應該使用列表作爲堆棧來實現。如果解不是遞歸的,而是迭代的,你也可以使用'(push(pop-pole-a)pole-b)'將元素從'pole-a'頂部移動到'pole-b' ,將'pole-a'和'pole-b'留下期望值。 –

相關問題