【发布时间】:2014-10-30 08:50:05
【问题描述】:
我有以下快速排序的序言代码:
gt(X,Y):- X @> Y.
conc([], List, List).
conc([Head|Tail], List1, [Head|List2]):- conc(Tail, List1, List2).
quicksort([], []).
quicksort([X|Tail], Sorted):-
split(X,Tail,Small,Big),
quicksort(Small,SortedSmall),
quicksort(Big, SortedBig),
conc(SortedSmall, [X|SortedBig], Sorted).
split(X,[],[],[]).
split(X,[Y|Tail],[Y|Small],Big):-
gt(X,Y),
!,
split(X,Tail,Small, Big).
split(X,[Y|Tail],Small,[Y|Big]):-
split(X,Tail,Small,Big).
例如数组是[3,2,4,1,5]。快速排序([3,2,4,1,5],排序)。我需要了解程序的运行轨迹。我几乎做到了,但有一点我没有:(这只是跟踪的一部分):
Redo: (11) split(3, [5], _G3785, _G3782) ? creep
Call: (12) split(3, [], _G3785, _G3788) ? creep
Exit: (12) split(3, [], [], []) ? creep
Exit: (11) split(3, [5], [], [5]) ? creep
Exit: (10) split(3, [1, 5], [1], [5]) ? creep
Exit: (9) split(3, [4, 1, 5], [1], [4, 5]) ? creep
Exit: (8) split(3, [2, 4, 1, 5], [2, 1], [4, 5]) ? creep
为什么我们有 Exit: (11) split(3, [5], [], [5]) ?爬到第 11 行,5 从哪里来? 有人可以帮助我吗!!我真的很感激。
【问题讨论】:
-
明确地说,
(11)不是对行号的引用,而是目标的级别或深度。调用子目标时,级别会增加 1。在子目标成功并将控制权返回给调用者后,级别会降低。
标签: sorting prolog quicksort trace