【发布时间】:2016-09-29 16:23:48
【问题描述】:
所以我正在学习prolog。
我要做的就是改变元素的顺序并得到新的列表作为结果。
在跟踪解决方案时,我得到了正确的答案,但是一旦我达到基本情况,Prolog 开始再次清空列表并返回并清空列表。
代码:
accRev([], [], _) :- !.
accRev([], A, R) :- accRev(A, [], R), !.
accRev([H, H2 |T], A, R):-
append(R, [H], R1),
append(A, [H2], A1),
accRev(T, A1, R1), !.
accRev([H], A, R):-
append(R, [H], R1),
accRev(A, [], R1), !.
accRevT([], [], _) :- !.
accRevT([], A, R) :- accRev(A, [], R), !.
accRevT([H, H2 |T], A, R):-
append(R, [H], R1),
append(A, [H2], A1),
accRevT(T, [H2 | A], [H | R]), !.
accRevT([H], A, R):-
append(R, [H], R1),
accRevT(A, [], [H | R]), !.
轨迹图像
注意它是如何达到 accRev([], [], [1, 3, 2, 4]) 的(这就是我希望 R 变成的样子,R = [1, 3, 2, 4])
那怎么了?
【问题讨论】:
-
见this answer。当你使用累加器时,你应该不在你的递归结束子句中有一个匿名变量
_。该子句通常读作foo([], Acc, Acc).,而不是foo([], [], _). -
您的代码的另一个主要问题:削减太多。你真的知道他们每个人是做什么的吗?您知道将它们排除在外是否会改变程序吗?
-
你到底想要什么作为输出——你的程序的目的是什么,因为“改变元素的顺序”不是很清楚......