6

リストの最大値を返そうとしています。

私は次のコードを持っています

list_max([]) ->
    [];
list_max([H|T]) ->
    list_max(H, T).
list_max(Temp, []) ->
    Temp;
list_max(Temp, [H|T]) when H > Temp ->
    Temp = H;
list_max(Temp, T).

しかし、Erlangに関係するのに苦労しています。

温度に何かを割り当てて、それを最高に置き換えるにはどうすればよいですか?

4

5 に答える 5

6

Erlang は、説明するよりも示す方が簡単だと思う言語の 1 つです。

list_max([]   ) -> empty;
list_max([H|T]) -> {ok, list_max(H, T)}.

list_max(X, []   )            -> X;
list_max(X, [H|T]) when X < H -> list_max(H, T);
list_max(X, [_|T])            -> list_max(X, T).

そしてそれを次のように呼びます:

{ok, Max} = list_max(MyList).
于 2010-09-22T11:40:25.820 に答える
4

申し訳ありませんが、何かが足りないかもしれません。何方をお探しですか:

lists:max(List). %% Find the max in List
于 2010-09-26T11:45:52.793 に答える
4

何かを temp に割り当てて、それを最高のものに置き換えるにはどうすればよいですか?

短い答えは、あなたができないということです。Erlang の変数は、一度割り当てられると変更できません。

少し長い答えは、特定の関数呼び出し内で変数を変更することはできませんが、常に自己再帰を行うことができるということです。Erlang の末尾再帰が最適化されました。

あなたが提供したコード例では、list_max はリストの最初の 2 つの要素のみを調べます。4 番目と 5 番目の節では、最初のパラメーターに Temp の新しい値を指定して、それぞれ list_max を再度呼び出す必要があります。これは、関数型言語で行う一般的なことです。この場合、Temp はアキュムレータとして知られています (変数 Acc には、この用途を反映して名前を付けることがよくありますが、もちろん、好きな名前を付けることができます)。

マセロの答えとstmiの答えの「中間」と見なされる別の解決策を示しましょう。

list_max( [H|T] ) -> list_max( H , T ).

list_max( X , []    ) -> X;
list_max( X , [H|T] ) -> list_max( erlang:max(H, X) , T ).

(空のリストを検出する句も捨てました。実際にはあまりメリットがないと思うためです。ただし、空のリストで呼び出すと例外がスローされるようになりました。)

于 2010-09-22T15:48:55.650 に答える
1

Erlang は単一の代入であるため、「変数」を変更することはできません。新しいものしか作成できません。

私の推奨事項は、リストモジュールを見ることです。lists.erl の中には次のようなものがあります:

max([H|T]) -> max(T, H).

max([H|T], Max) when H > Max -> max(T, H);
max([_|T], Max)              -> max(T, Max);
max([],    Max)              -> Max.

Max 変数 (この例では Temp ) を更新するのではなく、新しい値で関数を呼び出すか、関数から返します。

簡単にピージー... :-)

于 2010-09-23T14:10:08.600 に答える
1

組み込み関数よりも表現することもできます。

-module(list_max).
-compile(export_all).

list_max([]) -> none;
list_max([H | T] = List) ->
    lists:foldl(fun erlang:max/2, H, T);
list_max(_) -> badarg.
于 2010-09-22T11:42:58.830 に答える