我需要在Scheme中为河内塔建立一个递归解决方案。这与之前在此处提出的许多其他河内计划问题不同,因为我需要实际更改列表,而不仅仅是返回指令列表。
函数调用应如下所示:
(define towers '((1 2 3)()()))
(hanoi towers)
每次移动挂钩时我都应该返回列表。
我完成了两个难题:
更改Scheme中的列表,我只需使用cons或list构建一个新列表即可。
河内塔的逻辑。这个逻辑无处不在,我理解这个谜题应该如何运作。
我很难将它们组合在一起。
(define (first-flip Tower)
(list (return-stack 1 Tower)
(return-stack 3 Tower)
(return-stack 2 Tower)))
(define (second-flip Tower)
(list (return-stack 3 Tower)
(return-stack 2 Tower)
(return-stack 1 Tower)))
(define (hanoi height Tower)
(if (= height 1)
(move Tower)
(hanoi (decrement height)
(second-flip
(move
(hanoi (decrement height) (first-flip Tower)))))))
您可以对我的代码采取以下措施:
返回堆栈将返回一个未列出的列表(1个源,2个目标,3个辅助/临时)。
因此(return-stack 1 '((1 2 3)()()))
会返回'(1 2 3)
。
移动会将最左边列表的顶部引脚移动到中间列表的顶部。
因此(move '((1 2 3)()()))
会返回'((2 3)(1)())
。
递减将返回参数-1。
最后,不要担心这里列出的hanoi函数所需的参数与所需的hanoi函数略有不同,我将创建一个带有适当参数的shell来调用它。
我几乎可以肯定问题在于我的河内功能。我打电话的逻辑有些不对劲。我已经有几个TA看了代码,由于缺乏对计划和河内塔的了解,他们无法提供相关的帮助。我希望互联网上的好公民可以帮助我。