是否有可能只用两个参数来反转Prolog中的列表?如:
reverse_list(List, Reversed).
Run Code Online (Sandbox Code Playgroud)
这不是家庭作业,我在七周阅读七种编程语言,我很好奇.
使用三个参数可以使用累加器(很像函数式编程):
reverseList([], Accumulator, Accumulator).
reverseList([Head|Tail], Accumulator, Solution) :-
reverseList(Tail, [Head|Accumulator], Solution).
reverseList(List, Solution) :-
reverseList(List, [], Solution).
Run Code Online (Sandbox Code Playgroud)
澄清:我看到了一个附加的解决方案,我想知道你是否可以在没有其他prolog功能的情况下做到这一点
当然:
reverseList([[], Accumulator, Accumulator]).
reverseList([[Head|Tail], Accumulator, Solution]) :-
reverseList([Tail, [Head|Accumulator], Solution]).
reverseList([List, Solution]) :-
reverseList([List, [], Solution]).
Run Code Online (Sandbox Code Playgroud)
编辑:实际上只有一个:b
非作弊方法:
reverse([],[]).
reverse([H|T],L):-
reverse(T,R),
append(R,[H],L).
Run Code Online (Sandbox Code Playgroud)
问题是性能会非常糟糕:你将在列表中进行递归,对于每个元素,你将做一个追加/ 3.使用时间/ 1和1,000,000个元素的随机列表:
accumulator: % 2,000,003 inferences, 0.652 CPU in 0.652 seconds (100% CPU, 3066292 Lips)
arity-2 % 1,000,003 inferences, 0.178 CPU in 0.178 seconds (100% CPU, 5602426 Lips)
Run Code Online (Sandbox Code Playgroud)