【发布时间】:2015-01-21 03:34:40
【问题描述】:
我已经实现了一个递归归并排序算法:
-module(ms).
-import(lists,[sublist/3,delete/2,min/1,reverse/1]).
-export([mergesort/1]).
mergesort([])->
[];
mergesort([N])->
N;
mergesort(L)->
mergesort(split(1,L),split(2,L),[]).
mergesort(L1,L2,[])->
case {sorted(L1),sorted(L2)} of
{true,true}->
merge(L1,L2,[]);
{true,false}->
merge(L1,mergesort(split(1,L2),split(2,L2),[]),[]);
{false,true}->
merge(mergesort(split(1,L1),split(2,L1),[]),L2,[]);
{false,false}->
merge(mergesort(split(1,L1),split(2,L1),[]),mergesort(split(1,L2),split(2,L2),[]),[])
end.
merge([],[],R)->
reverse(R);
merge(L,[],R)->
merge(delete(min(L),L),[],[min(L)|R]);
merge([],L,R)->
merge([],delete(min(L),L),[min(L)|R]);
merge([H1|T1],[H2|T2],R) when H1 < H2 ->
merge(T1,[H2|T2],[H1|R]);
merge([H1|T1],[H2|T2],R) when H1 >= H2 ->
merge([H1|T1],T2,[H2|R]).
split(1,L)->
sublist(L,1,ceiling(length(L)/2));
split(2,L)->
sublist(L,ceiling(length(L)/2+1),length(L)).
ceiling(X) when X < 0 ->
trunc(X);
ceiling(X) ->
T = trunc(X),
case X - T == 0 of
true -> T;
false -> T + 1
end.
但是,mergesort/3 不是尾递归 (TR),而且很冗长,这让我感到厌烦。
我想这里的问题是我并不特别了解我将在此处使用的 TR '模板' - 我了解如何实现可以根据系列定义的 TR 函数,例如 -这只会将函数的参数移到系列中,但是对于我们有条件地将子列表合并到列表其余部分的自然递归的情况,我是无知的。
因此,我想问一下:
1) 如何制作mergesort/3TR?
2) 我可以使用哪些资源来深入了解 erlang 尾递归?
【问题讨论】:
标签: erlang mergesort tail-recursion