【发布时间】: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