计划中的河内改变嵌套列表

时间:2017-02-14 07:31:49

标签: scheme nested-lists towers-of-hanoi

我需要在Scheme中为河内塔建立一个递归解决方案。这与之前在此处提出的许多其他河内计划问题不同,因为我需要实际更改列表,而不仅仅是返回指令列表。

要求

函数调用应如下所示:

(define towers '((1 2 3)()()))
(hanoi towers)

每次移动挂钩时我都应该返回列表。

状态

我完成了两个难题:

  1. 更改Scheme中的列表,我只需使用cons或list构建一个新列表即可。

  2. 河内塔的逻辑。这个逻辑无处不在,我理解这个谜题应该如何运作。

  3. 我很难将它们组合在一起。

    相关代码

    (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看了代码,由于缺乏对计划和河内塔的了解,他们无法提供相关的帮助。我希望互联网上的好公民可以帮助我。

0 个答案:

没有答案