http://www.erlang.org/course/exercises.html Erlang Programming Exercises 給了一個要找出 lists1:min(L) 的習題
http://www.zorched.net/2008/05/28/erlang-example-min-and-max-element-of-a-list/ Erlang Example: Min and Max Element of a List 給出了一個超簡單的答案
-module(mylists).
-export([max/1]).
max([H|T]) ->
    max(H, T).
max(M, []) ->
    M;
max(M, [H|L]) when M > H ->
    max(M, L);
max(_M, [H|L]) ->
    max(H,L).
簡單地說,就是把 List 拆成 M|T,然後再把 T 分成 H|L,也就是 M,H,L,如果M>H,就繼續計算 max(M,L),如果是其他狀況,就計算 max(H,L)
一開始,我沒辦法想出這個樣子的解法。
不過後來參考了 qsort
qsort([]) -> [];
qsort([Pivot|T]) ->
    qsort([X || X <- T, X < Pivot])
    ++ [Pivot] ++
    qsort([X || X <- T, X >= Pivot]).
想出了另一種解法
max([]) -> [];
max([H|[]]) -> H;
max([Pivot|T]) ->
    L = [X || X <- T, X >= Pivot],
    case length(L)>0 of
        true -> max(L);
        false -> Pivot
    end.
重點是 L = [X || X <- T, X >= Pivot] 可以取得所有比 Pivot還大的 list,但如果得到的結果是空的 list,那就代表,最大的元素是 Pivot。
文章標籤

yaocl 發表在 痞客邦 留言(0) 人氣(2)