Erlang用「for」迴圈寫氣泡排序法

這次是將for/4擴充為for/5,用for-for結構來寫氣泡排序。

還蠻無聊的。不過,至少將for-loop的思維走過一遍。

-module(loop).
-export([bubble_sort/1]).

for(Data, I, Fe, Fi, Fc) ->
    case Fe(Data, I) of
	true ->
	    Data1 = Fc(Data, I),
	    I1 = Fi(I),
	    for(Data1, I1, Fe, Fi, Fc);
	false ->
	    Data
    end.

fe(List, I) ->
    L = length(List),
    I < L.

fe(I) ->
    fun(List, J) ->
	    L = length(List),
	    J < L-I
    end.

fi(I) ->
    I+1.

fc_i(List, I) ->
    for(List, 0, fe(I), fun fi/1, fc_j(I)).

fc_j(_I) ->
    fun (List, J) ->
	    swap(List, J, J+1)
    end.

bubble_sort(List) ->
    for(List, 1, fun fe/2, fun fi/1, fun fc_i/2).

swap([A,B|Rest], 0, 1) when A > B ->
    [B,A|Rest];
swap(List, 0, 1) ->
    List;
swap([A|Rest], M, N) ->
    [A|swap(Rest, M-1, N-1)].
廣告

About 黃耀賢 (Yau-Hsien Huang)

熱愛 Erlang ,並且有相關工作經驗。喜歡程式語言。喜歡邏輯。目前用 Python 工作。
本篇發表於 Erlang, Fun。將永久鏈結加入書籤。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s