- なあ、再帰関数好きな人いる? パート2 [転載禁止]©2ch.net
333 :デフォルトの名無しさん[sage]:2015/09/12(土) 15:11:48.96 ID:eSqErBQB - オレオレ定義の再帰がどんな役に立っているのかも、オレオレ定義の再帰が好きかどうかも、全く見えてこないんだよな
ただ繰り返しを再帰と言い直しているだけ。共有すべき前提が共有できてないから、感想も結論もコードのコピペも無意味 普通の人なら話の土台は他の人と協調して擦り合わせ、その上で立場や経験の違いから異なってくる意見を交わすんだが、 誰と言葉を共有しない時点で話題に入ることすら出来ないんだから、煽り荒らしより劣悪 枯れ木も山の賑わいと言うが、文字化けレベルのノイズは要らんわなあ
|
- なあ、再帰関数好きな人いる? パート2 [転載禁止]©2ch.net
340 :デフォルトの名無しさん[sage]:2015/09/12(土) 20:22:48.64 ID:eSqErBQB - 変数のスコープが分かりやすくても安全そうに見えないのはいいのか。int[] aを汚すことに抵抗は無いのか。
求める配列の長さが本質的に不明なら、泥臭いことをせずにArrayListを使うべきじゃないのか。 recursiveを動かしてみたのか。loopバージョンを機械的に変形させようとして失敗しているがいいのか。 ADTもパターンマッチも無い言語で、対象が再帰的な型でない処理は無理して再帰にする必要性は無い。loopバージョンで十分。 けど再帰が使いやすい言語で再帰に適した処理を行うとき、変数のスコープが云々っていう主張はよく分からなくなる。 >>338のloopと同じ挙動のコードを再帰で素直にOCamlで書くと、 http://ideone.com/ItSSmZ みたいになる。 添字outer, innerのような何を指しているのか見づらい変数や、a[outer++] = a[inner]というような破壊的代入が無い分、 何がしたいのか>>338より分かりやすくないか?分かりやすい分だけ、信頼性の向上にも寄与していると思うがな。
|
- なあ、再帰関数好きな人いる? パート2 [転載禁止]©2ch.net
343 :デフォルトの名無しさん[sage]:2015/09/12(土) 22:09:02.83 ID:eSqErBQB - 具体的に、どこが分からない?
let FOO = ...で関数または値FOOの定義ができること let rec FOO =で再帰関数FOOの定義ができること let FOO = EXPR_B in EXPR_AはEXPR_A中でbindが呼び出せること match EXPR with X::XSはEXPRの先頭要素をX、残りをXSとして->より右の式で使えること リストlsの先頭にeを加える操作は(e::ls)と書けること if EXPR then X else Yは EXPRがtrueならXを、falseならYと書けること auxはauxiliary、つまり補助関数という意味で、アキュムレータを使った末尾再帰の内部関数によくつけられる名前 aux内のaccは逆順になっているので、最後にList.revでひっくり返すという定石 これらが分かれば何をしたいのか分かる。そしてOCamlなら↑に書いてあることは全て基本事項であり、学び始めてすぐに教わること。 一方>>342の意図を汲み取るには、Javaの構文が分かっている人間であっても、 innerとは何か?対になっていそうなouterとは何か?ただの添字i,jを使わないのは何を意図しているのか? これを理解するにはメソッドloopの中全てを読み、どこで使われ、どこで変更されているか、どこで変更されていないかを読まないといけない。 (containsは名前と引数とコードを読めば意図がすぐ読めるからいい。) a[outer++] = a[inner]って一体何をしているのか?他にaを参照している場所は?outerが変動するのはここだけか? 最後に配列のコピーをしているのは何故か? そういうのを全部読み取って初めて、このメソッドloopの意図 「ある整数の配列aの要素のうち、整数の集合values(ただしint[]として表現)にあるものだけを順に並べた新しい配列を返す」 が分かる。引数aがぐちゃぐちゃにされることが本質ではないこととか、最後まで確認しないと分からない。 そういう意味で可読性が低い、意図が読みづらい、と思うの。
|