は、単純な逆関数は深い機能せず、次のようになりどのように見てみましょう。
パラメータが1つの関数では十分ではありません。アキュムレータが必要です。この値は、次の再帰的ステップに持ち越されます。アキュムレータは、最初は空のリストであり、再帰の各ステップでは、連続して埋められます。
simple_reverse(List) -> simple_reverse(List, []).
だから、今、私たちはsimple_reverse(List, [])
を呼び出すことができるように、2パラメータの関数を定義する必要があります。
simple_reverse([H|T], Accu) ->
simple_reverse(T, [H] ++ Accu);
simple_reverse([], Accu) -> Accu.
コンテンツ定義の最初の部分は、内容のあるリストを処理します。 [H|T]
は、リストがあり、H
(Head)がその最初の要素であり、T
(テール)は残りのリストです。最初のパラメータとしてtailを使用してsimple_reverse
と呼びます。最初にアキュムレータヘッドでヘッド値を累積します。
2番目の部分では、リストが空の場合を扱います。それが起こると、アキュムレータ(最初に蓄積されたすべての値)を返すことができます。
ここで何が起こったかを理解すると、deep_reverse
の実装は比較的単純です。ここで何が起こるかわからない場合は、listsとrecursionについて少しお読みください。
deep_reverse(List) -> deep_reverse(List, []).
deep_reverse([H|T], Accu) ->
case H of
[_|_] -> deep_reverse(T, [deep_reverse(H)] ++ Accu);
_ -> deep_reverse(T, [H] ++ Accu)
end;
deep_reverse([], Accu) -> Accu.
ここでは、H
値を見ていきます。 H
は、リスト自体([_|_]
)またはその他のもの(_
)のいずれかです。再帰は、H
がリストである場合を除いて、実質的にsimple_reverse
と同じです。それがリストであれば、再帰が実行されたときにを再度H
に呼び出す必要があります。
ここではいくつかのリンクは、構文を理解するために苦労していた場合、次のとおりです。case-expressionsとpattern-matching
はあなたが何の助けが必要ですか? –
あなたは今まで何をしようとしていますか? –
私はその考えに従っています。まず、flatten関数を使用してリスト内のすべての要素を抽出します。次に、reverse関数を使用して逆のリストを作成します。現在の難しさは、逆リストの要素を入力リストの要素に置き換えることができないということです。 –