【问题标题】:Prolog - Towers Of Hanoi, outputting the "towers" as they are after each stepProlog - 河内塔,在每一步之后输出“塔”
【发布时间】:2018-01-10 20:49:20
【问题描述】:

我已经看到多个问题展示了如何在 Prolog 中使用和不使用列表来解决河内塔问题,但是我还没有看到一种使用递归算法的方法,同时还能够输出每一步。

这是我的 Hanoi 算法代码:

move(1,[H|T],B,C,Origin,Dummy,Destination) :-  
            Origin = T,
            Destination = [H|C],
            Dummy = B.

move(Disks,Start1,Auxiliary1,End1,Sf,Af,Ef) :-   
            Disks>1, 
            M is Disks-1,
            move(M,Start1,End1,Auxiliary1,S1,E1,A1),
            printHanoi(S1,A1,E1),
            move(1,S1,A1,E1,S2,A2,E2),
            printHanoi(S2,A2,E2),
            move(M,A2,S2,E2,Af,Sf,Ef),
            printHanoi(Sf,Af,Ef).

printHanoi(Left,Centre,Right):-
    write('L = '), write(Left),
    write(' C = '), write(Centre),
    write(' R = '), write(Right), nl.

使用大小为 3 ( [1,2,3] ) 的列表,输出结果如下:

L = [2,3] C = [1] R = []
L = [3] C = [1] R = [2]
L = [3] C = [] R = [1,2]
L = [3] C = [1,2] R = []
L = [] C = [1,2] R = [3]
L = [2] C = [1] R = [3]
L = [] C = [1] R = [2,3]
L = [] C = [] R = [1,2,3]
L = [] C = [] R = [1,2,3]
L = [] C = [] R = [1,2,3]
yes

忽略原始输出(意味着 L 为 [1,2,3])和最后 3 个重复的列表(不是那么重要),输出似乎有问题。

在很多行中,列表似乎正在相互交换。我的首选/预期输出如下:

L = [2,3] C = [] R = [1]
L = [3] C = [2] R = [1]
L = [3] C = [1,2] R = []
L = [] C = [1,2] R = [3]
L = [1] C = [2] R = [3]
L = [1] C = [] R = [2,3]
L = [] C = [] R = [1,2,3]
yes

我不确定这是否可能,我希望它是可能的,但我会尽我所能得到的帮助,因为我找不到一个合乎逻辑的方法输出河内塔问题的正确步骤顺序...

【问题讨论】:

  • 取决于中间步骤的含义...
  • 为此,我假设 R 和 C 已交换。输出应该是L = [3] C = [2] R = [1]L = [3] C =[1,2] R = []
  • 哦等等,现在我明白你的意思了。诺诺,在这个问题中,一步就可以从最左边移动到最右边。您不必一次只能越过一座塔。
  • 你的 move 谓词中应该只有一个 printHanoi 调用。
  • 如果我这样做,那么一半的步骤甚至都不会显示。

标签: list recursion prolog towers-of-hanoi


【解决方案1】:

按照您的要求,最简洁的解决方法实际上是添加额外的参数......非常小心。

代码在这里:https://gist.github.com/fidelcoria/9a38309c82fbc829ae23f9f94a24aee6

额外的参数跟踪每个对应列表是哪个挂钩。我将钉子表示为原子abc。在打印方面,我使用 if-else-if 结构来选择首先打印哪个(X、Y 或 Z;请参见代码)、第二个和最后一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多