【发布时间】:2017-04-12 19:30:14
【问题描述】:
我正在尝试使用最后一个元素作为枢轴在 Prolog 中实现快速排序,但不知何故我的谓词进入了无限循环。我正在使用累加器来确定到目前为止排序的部分(最终应该等于它应该寻找的排序列表 S)。
quicksort([], S, S).
quicksort(L, S, A ) :-
lastElement(L, P), /*last element P as pivot*/
split(L, P, Greater, Smaller), /* splits L into set Greater (than) and Smaller (than) by pivot P */
quicksort(Greater, Greater_S, A), /* require Greater to be sorted as well, calling this Greater_S */
quicksort(Smaller, S, [P|Greater_S]). /* same for Smaller, but accumulator should already have P and Greater_S sorted -> [P|Greater_S] as accumulator */
quicksort(L, S) :-
quicksort(L, S, []).
不知何故,在quicksort(G, G_S, A) 中,G_S 列表的大小似乎会随着相同的元素迭代增加,即[X, X, X, X, ...]。
我做错了什么?
如果有人可以帮助我,将不胜感激!
提前致谢。
编辑:谓词split/4 和lastElement/2 的定义:
lastElement([X], X).
lastElement([_|T], X) :- lastElement(T, X).
split([], _, [], []).
split([H|T], P, G, K) :-
H > P,
G = [H|T_],
split(T, P, T_, K).
split([H|T], P, G, K) :-
H =< P,
K = [H|T_],
split(T, P, G, T_).
【问题讨论】:
-
重命名您的 S 变量之一。
-
您还记得
deel/4的第一个参数中的最后一个元素将枢轴作为最后一个元素,对吧?无论如何,这个蓄能器到底是干什么用的? -
添加
lastElement/2和deel/4的定义! -
@Skyfe 对这个问题很抱歉,但你为什么要做 a) 快速排序和 b) 使用最后一个元素?两者都是糟糕的选择,主要是因为列表在 Prolog 中的表示方式(基本上,
cons对)。 -
@Skyfe 顺便说一句,我查看了维基百科 Prolog 快速排序 here;这不使用累加器;它使用正常的尾递归和差异列表。