0
所以我正在学习序言的过程。达到结果然后返回到初始状态
我想要做的就是改变元素的顺序,并得到新的列表作为结果。
在追踪解决方案时,我找到了正确的答案,但是一旦我到达基本案例,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])
那么最新错误?
请参阅[此答案](http://stackoverflow.com/a/15259282/1812457)。当你使用累加器时,你应该在你的递归结束子句中不要有一个匿名变量'_'。该子句通常读取'foo([],Acc,Acc).',而不是'foo([],[],_)。 – 2016-09-29 06:42:59
您的代码的另一个主要问题:切割太多。你真的知道他们每个人做什么吗?你知道如果将他们离开改变程序吗? – 2016-09-29 06:44:13
你想要什么作为输出 - 你的程序的目的是什么,因为“改变元素的顺序”不是很清楚...... – coder