ホームページ >バックエンド開発 >PHPチュートリアル >List_PHP チュートリアルを並べ替える Erlang のソリューション

List_PHP チュートリアルを並べ替える Erlang のソリューション

WBOY
WBOYオリジナル
2016-07-14 10:09:401358ブラウズ

最近、Erlang を体系的に読んでいて、現在「Erlang プログラミング」を教材として使用しています。最初の 7 ~ 8 章を読んだ後、何か書こうとしましたが、非常にたくさんありました。役立つ資料やドキュメントがほとんどありません。

実際、誰かが私と勉強したり議論したりできることを願っています。
今日のトピック: リストをシャッフルする
方法 1: より洗練されたアウトオブオーダーのソリューション。
[php]
-モジュール(シャッフル)。
-エクスポート([do/1])。
ド(L) ->
Len = 長さ(L),
NL = lists:map(fun(X) -> {random:uniform(Len), X} end, L),
NLL = リスト:ソート(NL),
[ V || {_,V}
実際、この問題は私を非常に悩ませます。変数に値が割り当てられると、その値は変更できなくなります。この機能により、プログラムを書くときの本来の考え方がまったく違ってきます。上記で行ったのは、乱数を使用して [{Rand1,Elem1},...,{RandN,ElemN}] のようなリストを生成することです。
次に、sort を使用して並べ替えてから、Elem を再度出力することで、順不同の効果を実現します。
結果はおおよそ次のようになります:
[php]
45>c(シャッフル)。
{OK、シャッフル}
46>シャッフル:do([1,2,3,4,5])。
[4,5,1,2,3]
47>シャッフル:do([1,2,3,4,5])。
[2,1,5,3,4]
48>シャッフル:do([1,2,3,4,5])。
[3,1,2,4,5]
49>シャッフル:do([1,2,3,4,5])。
[1,5,2,3,4]
50>シャッフル:do([1,2,3,4,5])。
[5,1,4,3,2]
51>
方法 2: ユニバーサルシャッフルアルゴリズム
上記の続きですが、List をシャッフルしたい場合は、元の一般的なシャッフル アルゴリズムが実行可能だと思います。別の関数を書いてみてください。テスト済みで動作しますが、最適化の余地は確実にあると思います。コードのスタイルは依然として強力な手続き的思考を示しています。
%シャッフルアルゴリズムを使用したスキーム
[php]
do2(L) ->
do2(L,[])。
do2([],L) ->
L;
do2(L1,L2) ->
%io:format("L1=~w L2=~w~n",[L1,L2]),
Len = 長さ(L1),
もし
レン>1->
NL = lists:split(random:uniform(Len-1), L1),
{[H1|T1],[H2|T2]} = NL,
NL2 = lists: flatten([T1],[H1|T2]),
L11 = リスト:append(L2,[H2]),
do2(NL2, L11);
本当です ->
do2([],lists:append(L2,L1))
終わり
結果は次のとおりです:
128>c(シャッフル)
{OK、シャッフル}
129>シャッフル:do2(リスト:seq(0,9))。
[9,2,5,1,8,0,7,3,6,4]
130>シャッフル:do2(リスト:seq(0,9))。
[8,3,6,5,7,4,9,0,2,1]
131>シャッフル:do2(リスト:seq(0,9))。
[5,3,7,8,1,9,0,6,2,4]
132>シャッフル:do2(リスト:seq(0,9))。
[3,0,5,2,1,6,8,4,9,7]
133>
これら 2 つのソリューションが実際のシャッフル アルゴリズムであるかどうかについては、考慮に値する点がいくつかあります。各数字が特定の位置に出現する可能性は同じですか?
他の方法もありますので、ご相談ください。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/477638.html技術記事最近 Erlang を体系的に読んでいて、最初の 7 ~ 8 章を読んだ後、何かを書こうとしたのですが、途中で迷ってしまいました。役立つ資料やドキュメントを見つけてください...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。