1 名前:名無しのプログラマ [2015/08/09(日) 17:46:33.69 ID:Icb40LOY.net] for,while使うの嫌いで基本的に再帰多用するんだが、だめなの? 皆から敬遠されてる気がする
175 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:41:21.58 ID:A9RCljrX.net] ソースがコンパイラにどう最適化されて実行時にどう動かされるかを考えてると 可読性の基準が変わってくるでしょ 再帰で触感的に記述できるのは再帰構造持ったアルゴであって 本来行うべき実行じゃないから非直観的なんよ 可読性として表現したい対象がそもそも違うのよね
176 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:42:13.58 ID:96XWMJC8.net] 実用向けだと可読性だけと言うわけにはいかないからなぁ スタックオーバーフローを検出して適切にエラー処理するために自前のスタックにするとかは普通にあるし
177 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:43:10.07 ID:NebXzry6.net] >>167 中身ちゃんと読んでますか? このソース要素数が一定以上の場合、どうやらquicksortしない仕様で、 quicksort処理部もスタック使ってるようですよ 要素数で分けて安全性を保っているだけで、 処理そのものの安全性そのものは再帰と変わってません
178 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:47:32.08 ID:Iax2S8IU.net] >このソース要素数が一定以上の場合、どうやらquicksortしない仕様で、 何言っとるんだ?
179 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:47:43.55 ID:WDxyRHha.net] >>173 > ソースがコンパイラにどう最適化されて実行時にどう動かされるかを考えてると > 可読性の基準が変わってくるでしょ 可読性の読みやすさって 人間の読みやすさだからw コンパイラにとっては可読性関係ないよ どんなに読みづらいコードでも 書いてあるとおりに解釈してくれる。
180 名前:デフォルトの名無しさん [2015/08/13(木) 10:48:35.29 ID:Q4WJ33HH.net] >>175 自前のスタックを使っています。 確かにあなたのおっしゃる通り*自前の*スタックを使っています。 ですが再帰ではありません。
181 名前:デフォルトの名無しさん [2015/08/13(木) 10:48:36.95 ID:Q4WJ33HH.net] >>175 自前のスタックを使っています。 確かにあなたのおっしゃる通り*自前の*スタックを使っています。 ですが再帰ではありません。
182 名前:デフォルトの名無しさん [2015/08/13(木) 10:51:04.09 ID:Q4WJ33HH.net] C/C++で再帰を使うことが良くないマナーであることは、とっくの昔に 明文化された事実なんですよ。 手間がかかろうがなんだろうが、再帰を無くさなければならない。 そんなこと当たり前じゃないですか。
183 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:51:19.49 ID:GBQWWFg+.net] >>164 glibcのqsortでもstack_node stack[STACK_SIZE]が溢れますね。 メモリ消費量は、再帰で書くとそれに加えて、リターンアドレスやフレームの保存領域が余計に必要になるだけですよね。
184 名前:デフォルトの名無しさん [2015/08/13(木) 10:53:38.16 ID:Q4WJ33HH.net] >>181 じゃあ品証にそう言って噛みついてみては?
185 名前:デフォルトの名無しさん [2015/08/13(木) 10:55:16.00 ID:Q4WJ33HH.net] こんな当たり前のことで今更何議論してるんだって話。
186 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 11:01:18.21 ID:Iax2S8IU.net] >stack_node stack[STACK_SIZE]が溢れますね。 これは指定の番号のデータが、ソート結果として 第何番目になるかを出力させるといい。 つまり順番に数値を格納した配列を用意して その要素をクイックソートの置き換え処理の対象にさせる。 また、
187 名前:比較関数もこれに対応したものを用意する。 この方式なら int stack[STACK_SIZE] を用意すればいいので、件数は多くても メモリ消費量はそんなに必要にならない。 [] [ここ壊れてます]
188 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 11:01:20.46 ID:GBQWWFg+.net] >>171 >>54 が言い出した「再帰は可読性が悪い」に対する反論なのですが。
189 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 11:01:38.29 ID:NebXzry6.net] >>176 コメントとMAX_THRESHで追えば解ると思います 全くしないわけではないです
190 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 11:13:50.27 ID:GBQWWFg+.net] >>184 非再帰版は再帰を自前のスタック管理でエミュレートしているだけなんだから、 同一データを、再帰版と非再帰版で実行すると再帰版の再帰の深さと、 非再帰版のstackの使用個数は同じになるに決まってるじゃないですか。
191 名前:デフォルトの名無しさん [2015/08/13(木) 11:15:13.87 ID:1x08JE5T.net] 再帰は普通につかうでしょ OSとかの制作には向いてないってことで 普通のソフトならオーバーフローしない限り問題ない
192 名前:デフォルトの名無しさん [2015/08/13(木) 11:22:16.59 ID:Q4WJ33HH.net] >>188 使いません。
193 名前:デフォルトの名無しさん [2015/08/13(木) 11:24:47.30 ID:Q4WJ33HH.net] CERT C Secure Coding Standard、ISO/IEC TR 24772:2013、MISRA-C。 よく使われるガイドライン、規約で明示的に禁止されています。 C/C++で再帰は邪悪なのです。 再帰を使う人は悪人です。
194 名前:デフォルトの名無しさん [2015/08/13(木) 11:26:18.86 ID:1x08JE5T.net] おれたちにとってそれを書いた人の意見が正しいわけじゃないから
195 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 12:51:43.10 ID:GBQWWFg+.net] >>190 ウソつき。 禁止してるのってMISRA-Cだけですね。 CERT C Secure Coding Standard Recursion can also lead to large stack allocations. Recursive functions must ensure that they do not exhaust the stack as a result of excessive recursions. ISO/IEC TR 24772:2013 6.37.5 Avoiding the vulnerability or mitigating its effects Software developers can avoid the vulnerability or mitigate its ill effects in the following ways: + Minimize the use of recursion. + Converting recursive calculations to the corresponding iterative calculation. In principle, any recursive calculation can be remodeled as an iterative calculation which will have a smaller impact on some computing resources but which may be harder for a human to comprehend. The cost to human understanding must be weighed against the practical limits of computing resource. + In cases where the depth of recursion can be shown to be statically bounded by a tolerable number, then recursion may be acceptable, but should be documented for the use of maintainers.
196 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 12:54:40.29 ID:V/aggySn.net] Scala だと末尾再帰が推奨されてる感じだけど
197 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:05:26.51 ID:WDxyRHha.net] 特定の言語特有の例外でしょうね
198 名前:デフォルトの名無しさん [2015/08/13(木) 13:06:35.36 ID:t3mydoM3.net] 特有というか関数型言語
199 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:12:01.20 ID:WDxyRHha.net] でも推奨してるのはScalaだけなのでしょう?
200 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:12:01.28 ID:A9RCljrX.net] おれの予想だとそろそろ 糞みたいな本のコピペ宣伝がくるね
201 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:13:19.26 ID:WDxyRHha.net] >>197 それは、押すなよ、押すなよってやつですか? それとも自分でコピペして、ほら俺の言ったとおりだった(ドヤ顔)を やるための布石ですか?
202 名前:デフォルトの名無しさん [2015/08/13(木) 13:13:33.60 ID:GBQWWFg+.net] クイックソートは再帰版の方が可読性が高い。 これに異論はありますか?
203 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:14:50.27 ID:aB+CmHXz.net] >>195 も言ってるが関数型言語のような破壊的代入を避けることが推奨の言語は、 ループは再帰で表現するのが推奨 Scala特有とか意味わからん
204 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:19:18.15 ID:WDxyRHha.net] >>199 中途半端な質問するなよw クイックソートは再帰版の方が可読性が高い。 バブルソートは再帰版の方が可読性が高い。 マージソートは再帰版の方が可読性が高い。 これに異論はありますか? やるならこれぐらいやれよw その言い方だとクイックソートだけしか勝ち目がないと 自覚しているかのようだぞ。 なお、ソートの種類には以下の様なものが有るらしい。 https://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%BC%E3%83%88 バブルソート、シェーカーソート、コムソート、ノームソート、選択ソート、挿入ソート シェルソート、2分木ソート、ライブラリソート、マージソート、In-place マージソート ヒープソート、スムースソート、クイックソート、イントロソート、ペイシェンスソート ストランドソート、奇偶転置ソート、シェアソート 半分も知らんなw
205 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:20:57.51 ID:WDxyRHha.net] >>200 推奨とか、破壊的代入を禁止するという制約のために 選択肢がないだけに見えますが。 破壊的代入を禁止することが、 必ずしも可読性を高めるとは限らないので。
206 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:24:34.58 ID:NebXzry6.net] >>201 fold mapでループは消えますので、再帰より不要ですね(煽り)
207 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:27:20.56 ID:WDxyRHha.net] >>203 fold mapによって消えるものがなぜループだと? fold mapによって再帰が消えるのではないのですか?
208 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:28:32.66 ID:W1EX3EBl.net] やっぱりfold mapの実装はループであるべきだって 自覚してるんでしょうね(煽り)
209 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:30:40.85 ID:GBQWWFg+.net] >>201 >>54 > 普段はやはり再帰のコードは書くべきじゃないよ。 > 可読性悪いからね。 これが間違いであることは、反例を1つ示せば十分ですよね。足りないというなら、 ID:Q4WJ33HH氏がドヤ顔で言い出したISO/IEC 24772:2013にも In principle, any recursive calculation can be remodeled as an iterative calculation which will have a smaller impact on some computing resources but which may be harder for a human to comprehend. The cost to human understanding must be weighed against the practical limits of computing resource. って明記されてるし。
210 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:34:22.81 ID:W1EX3EBl.net] "普段は" って書いてあることから 普段に当てはまらない場合は違うと言ってるわけで、 反例があるってことは、最初から言ってることですね。
211 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:43:25.91 ID:GBQWWFg+.net] >>207 その「普段」は発言者の彼によると、「再帰を繰り返しに置き換える」ので、クイックソート非再帰版が「普段」ですよね。 > 再帰を使うことはめったにない。そしてミスをしやすい所でもある。 > だから再帰を使うときは、再帰を考慮しなくていい形に置き換えるようにしている。
212 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:44:15.15 ID:W1EX3EBl.net] >>208 その発言者は私ですが、普段というのは 日々の仕事の話ですよw 普段あなたは何をしてるのですか? の普段です。
213 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:47:30.00 ID:W1EX3EBl.net] クイックソートの話で言えば、 普段はクイックソートの実装などせずに 予め用意されたソート関数、つまり高階関数を引数にしたソート関数を 呼び出すだけなので普段は再帰を使ったコードを書きません。 >>203 の発言風に言うと、 sortで再帰は消えますので、再帰は不要ですね(煽り)
214 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:47:49.82 ID:GBQWWFg+.net] >>209 「普段」はクイックソートのように再帰版の方が可読性の高いものを、非再帰版に書き直さないのですか?
215 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:50:17.90 ID:W1EX3EBl.net] >>211 普段は再帰は可読性が低いので、 再帰だとわからないように sort関数のようなものを作ります。 再帰が可読性高かったら、 わざわざsort関数なんて作りませんよw
216 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 14:02:03.63 ID:GBQWWFg+.net] >>212 再帰版クイックソートは可読性が低いという主張ですね。 >>207 と矛盾しますが。 > 普段に当てはまらない場合は違うと言ってるわけで、
217 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 14:09:44.52 ID:NebXzry6.net] >>204 え…?再帰構造にmap使うんですか? かなり効率悪いと思いますが
218 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 14:23:38.44 ID:W1EX3EBl.net] >>214 え?そんな話してませんよ。 話の内容を整理しましょう。 fold mapによって消えるものがなぜループだと 思っているということは、fold mapが再帰ではなく ループで実装されていると思っているからでしょう? fold mapを使えば、ループが要らないっていうのはそういうことですね。 もしfold mapの中身が、ループではなく再帰で実装されていると思っているのなら、 fold mapで消えるのは再帰だと考えるはずです。 だから、ははん、こいつはループを使ったほうが適切な問題だって わかっていると言ったんです。 最初っから言ってるように、適切なものを使う。 単なるリスト構造であればループで良い。 再帰的な構造であれば再帰使えばいいと言ってます。
219 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 14:27:29.97 ID:W1EX3EBl.net] >>213 > 再帰版クイックソートは可読性が低いという主張ですね。 全く違います。 再帰を使ったコードは可読性が低いので、 sort等の関数を使って再帰を隠蔽するというのが 私の主張です。 何回も説明したはずですが? 「普段」というのは>>209 で書いたように、 日々の仕事のことですから、普段は再帰は使いません。 使うことがあっても内部で隠蔽されたsort関数などを使うし、 自分で隠蔽するので、普段は再帰は使いません。
220 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 14:29:35.52 ID:NebXzry6.net] >fold mapによって消えるものがなぜループだと >思っているということは、fold mapが再帰ではなく >ループで実装されていると思っているからでしょう? 全然違います ループに代替可能、かつ効率が上がる可能性があるからです mapの実装がループって…ループや再帰で実装はできますが、 逐次処理に書き下したらmapの優位性なくなりますよ その下は間違った前提で話してるのでスルーします
221 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 14:31:12.41 ID:NebXzry6.net] 安価忘れ >>215 間違い訂正:ループに代替可能 → ループを代替可能
222 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 14:39:15.29 ID:W1EX3EBl.net] >>217 もしかして、mapの実装をmapで書いてると言った人ですか?w mapというのは写像のことです。 f: A → B のことです。 プログラミング的に書くならば、 B = f(A) という形になってないとmapではありません。 ループもしくは再帰でmapを実装するのですよ。 もっともこの場合は、ループで実装するのが適切だから 再帰は使いません(何度も私が言ってます。道具は適切に使いましょう。) そして逐次処理に書き下しするって何の話してるのですか? 逐次処理の反対は並列処理ですが、今並列か逐次かの話なんかしていましたかね? ループも再帰も逐次処理ですし。
223 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 14:49:38.43 ID:NebXzry6.net] >>219 mapはあなたの言う通りただの写像ですから、 それだけで逐次か並列かを縛るものじゃないですよ 再帰処理という意味なら、必然的に並列化して分割統治できるので、 どう見ても再帰が有利ですね
224 名前:デフォルトの名無しさん [2015/08/13(木) 14:52:27.40 ID:t3mydoM3.net] >>215 いやだからリストは最も基本的な再帰的なデータ型だから。。 木より
225 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 14:56:24.24 ID:W1EX3EBl.net] 全てのループは再帰で表現した方がいいというのであれば 全てのループは再帰で変換可能なので、 全てのループは並列化して分割統治できるということになりますが? 何度も言ってるように、適切なものを使いましょう? ループを使ったほうが良い場合は わざわざ再帰にする必要はないのですよ。 ちょっと出かけなきゃならないので、wikipedia貼って終わらすけど、 再帰だからって並列化できるとは限りません。 https://ja.wikipedia.org/wiki/%E4%B8%A6%E5%88%97%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0 再帰的でありながら並列化が非常に難しい問題もある。例えば、グラフにおける深さ優先探索がある。
226 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 14:57:39.52 ID:W1EX3EBl.net] >>229 再帰の中でも一番シンプルなデータ構造です。 シンプルなデータ構造にはシンプルなループを使いましょう。
227 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 15:00:06.78 ID:W1EX3EBl.net] あ、一応煽っておこう。 再帰、再帰ばかり言ってないで、 最近何処かに出かけたか?w 引きこもってばかりだと、 体が細菌だらけになっちゃうぞw
228 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 15:09:12.83 ID:NebXzry6.net] >>222 主張してない事を主張として反論する事が多いですね… 逐次処理が必須なものは、並列化できなくて当然ですね あえて挙げる意味ありますか? ループと逐次処理で、並列の分割統治はできません 並列した時点でもうループではなく、並列、または再帰的処理です そもそも自分で高階関数でいいと言ってるんですから、 逐次処理のループは消しましょう >>224 もう本当ただの煽りですねw
229 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 15:16:09.30 ID:GBQWWFg+.net] >>216 > 全く違います。 これと > 再帰版クイックソートは可読性が低いという主張ですね。 これ > 再帰を使ったコードは可読性が低いので、 > sort等の関数を使って再帰を隠蔽するというのが の、どこが違うのでしょう? 再帰版クイックソートは非再帰版に比べて、可読性が低いのですか? 高いのですか?
230 名前:デフォルトの名無しさん [2015/08/13(木) 15:44:30.69 ID:t3mydoM3.net] >>223 いやどっちがシンプルな方法かは状況によりますし そもそもリストの再帰でシンプルにならなかったら別のデータ構造使うべし
231 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 15:53:27.98 ID:uKHAyuPa.net] 仮想関数もだが 再帰関数は自己満足でしかないな
232 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 16:00:20.34 ID:Iax2S8IU.net] 仮想関数は自己満足じゃないぞ。 実用的なプログラミング手法
233 名前:デフォルトの名無しさん [2015/08/13(木) 16:13:22.44 ID:t3mydoM3.net] 普通のオブジェクト指向言語だったらデフォルトで仮想関数
234 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 16:29:24.52 ID:wsd38m6J.net] どっちも相手の言い分を聞く気はなく、反論する付け入りどころを つくだけの議論に価値はないから、メアドでも交換して、 勝手にメールでやってくんない?
235 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 17:14:18.17 ID:dAU/S6bT.net] 再起なんてプログラマの基礎知識だろ。 デザイナか底辺コーダーみたいなヤツらばっか
236 名前:デフォルトの名無しさん [2015/08/13(木) 17:41:32.08 ID:FeXmcCf7.net] 探索も書かないようなウンコーダーに再帰は不要
237 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 17:55:50.75 ID:A9RCljrX.net] あーいえばコーダー
238 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 19:13:46.18 ID:ZdpNokWx.net] >>18 ループはコンパイル時に最適化かかるから高速化しやすい
239 名前:デフォルトの名無しさん [2015/08/13(木) 19:38:20.24 ID:4z/i7w/x.net] 再帰完全否定してるダメプログラマはとりあえずハノイの塔ループで解いて来いよwwww
240 名前:デフォルトの名無しさん [2015/08/13(木) 23:05:53.46 ID:TPLbUV1y.net] gcc の qsort が非再帰なのは単に速度を重視した結果じゃないの? 速度も含めて、再帰と非再帰でそんなに大騒ぎするほどの違いがあるかなあ。
241 名前:デフォルトの名無しさん [2015/08/13(木) 23:12:53.85 ID:WInk48Wa.net] 何言ってんだコイツ。
242 名前:デフォルトの名無しさん [2015/08/13(木) 23:47:23.70 ID:WInk48Wa.net] >>192 再帰使うなと書いてあるだろ。 何言ってんだお前。
243 名前:デフォルトの名無しさん [2015/08/14(金) 00:02:47.08 ID:She38G+m.net] 何言ってんだおじさんこんばんわ
244 名前:デフォルトの名無しさん [2015/08/14(金) 00:31:35.66 ID:bS+eLMvH.net] 再帰は使うな。 これが国際ルール。
245 名前:デフォルトの名無しさん [2015/08/14(金) 00:38:24.26 ID:30JcjEEE.net] >>237 ID:W1EX3EBl氏曰く、可読性が悪いから許容出来ない。らしい。
246 名前:デフォルトの名無しさん [2015/08/14(金) 00:45:15.19 ID:She38G+m.net] つまり、再帰を使うやつっていうのはジュリアナでケンメリなんだよね
247 名前:デフォルトの名無しさん [2015/08/14(金) 00:49:42.60 ID:EjQiuBiC.net] だから言語によるっつーの
248 名前:デフォルトの名無しさん [2015/08/14(金) 00:53:34.88 ID:She38G+m.net] そんなバナナ
249 名前:デフォルトの名無しさん [2015/08/14(金) 02:23:00.05 ID:bS+eLMvH.net] >>244 再帰を使わなければならない言語は実用性ないからやめとけ。 煽ってるように思うかもしれないが、10年後に思い返してみ。 その通りだったとわかるから。
250 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 03:21:13.76 ID:EMHxFo3V.net] 結局関数モデルより命令型計算モデルのほうが直感的で素直なんだよね 関数型を選ぶのはコンプレックスとか本来の目的以外がモチベーションになってる
251 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 04:02:13.98 ID:wyMAq0xx.net] と、コンプレックスこじらせてた人が申しております
252 名前:デフォルトの名無しさん [2015/08/14(金) 04:50:19.83 ID:MLcHO6rW.net] 関数型モデルより命令型が直観的とかいうやつがいることが信じられん
253 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 05:07:39.58 ID:QRcaU/9J.net] このスレの再帰のキティ害はレベル低すぎ 英語は読み間違えるし、コードを読む力が皆無だし 再帰のコードをループに直せないし、 何よりも再帰を使用してはいけないことが理解できない。 プログラマの基礎学力を欠いてる。
254 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 05:20:19.69 ID:wyMAq0xx.net] この人何ですぐID変えるん?
255 名前:デフォルトの名無しさん [2015/08/14(金) 05:46:48.29 ID:SrkbsMCI.net] >>250 読み間違えるんじゃなくて、読んでないんだろ。 何となくそれっぽいこと書けばいいみたいな。 再帰の危険性を指摘した文章を引用して、再帰するべきであると主張してるし。 自前スタックによる実装を示して、再帰してると主張するし。 しかも、読んでないだろとか言いがかりつけてくるし。 打ち負かすのが目的だから話にならない。 CERT CC読むだけでも再帰がなぜいけないのかわかるだろうに。
256 名前:デフォルトの名無しさん [2015/08/14(金) 05:53:10.80 ID:SrkbsMCI.net] それじゃそろそろまとめます。 2chコーディング規約第一条、再帰の禁止。 再帰を用いる者は、50万円以上の過料、あるいは10年以上の禁固刑と処す。
257 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 05:55:31.01 ID:wyMAq0xx.net] >>252 その人禁止されてないって言ってるだけじゃない 言いがかりばっかりだね
258 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 05:56:35.55 ID:wyMAq0xx.net] 本物のキチガイだった
259 名前:デフォルトの名無しさん [2015/08/14(金) 06:03:17.11 ID:SrkbsMCI.net] ユーザー入力において、0終端文字列を仮定してはならないだろ? 再帰の禁止はそれと同じレベルの話。 紀元前においてはそれで良かった。 古い教科書には、再帰による例だって載っているだろう。 昔、0終端を仮定していたようにな。 しかし、現在ではそれは良くないマナー。 全てのセキュリティ勧告が再帰を警告し、すべての規約が再帰を禁止している。 2chにおいては禁固刑になるほどの悪徳とされている。
260 名前:デフォルトの名無しさん [2015/08/14(金) 09:48:40.23 ID:IQ5ciGpN.net] だから言語によるっつーの
261 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 13:36:50.53 ID:S4Thnq8W.net] 再帰を禁止しているのはMISRA-Cだけですね。そしてMISRA-Cはmallocも禁止していますね。 あれはC言語のサブセット。
262 名前:デフォルトの名無しさん [2015/08/14(金) 15:18:36.00 ID:MLcHO6rW.net] 禁止してるんじゃなくてスタック溢れがないように保証せよ、でしょ 普通にTCRで書けばいいだけ。それどころかそこに > In principle, any recursive calculation can be remodeled as an iterative > calculation which will have a smaller impact on some computing resources but > which may be harder for a human to comprehend. > The cost to human understanding must be weighed against the practical > limits of computing resource. ループは人間が理解するのが先より難しいけど人間が理解するコストは 計算機資源の限界と衡量しなきゃだめよ、って書かれてる。 再帰のほうが人間には読みやすい、ってさ
263 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 15:42:19.07 ID:S4Thnq8W.net] ああ、読解力の無い人は | ウソつき。 禁止してるのってMISRA-Cだけですね。 | CERT C Secure Coding StandardもISO/IEC 24772:2013も禁止なんかしていませんね。 | 証拠↓ って書かなきゃ読み取れないのか。
264 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 16:12:00.57 ID:yjzzXtw+.net] MISRA-Cみたいに制限だらけの言語で仕事するぐらいならプログラマやめる
265 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 17:36:18.62 ID:lAGFmjya.net] そりゃ助かる
266 名前:デフォルトの名無しさん [2015/08/14(金) 21:22:39.45 ID:JKvGE0+H.net] 2chコーディング規則読め。 第一条で再帰が禁止されている。
267 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 21:42:25.71 ID:tycV63/U.net] >>261 アレを規定せざるを得なかった闇がある MISRA本はその闇のエピソード、笑いあり涙ありの 感動ストーリーを綴っているんだ
268 名前:デフォルトの名無しさん [2015/08/14(金) 23:59:17.48 ID:XChvySBs.net] こいつを見てくれ。どう思う? static void sort(int[] a) { sort(a, a.length - 1); } static void sort(int[] a, int i) { if (i < 0) { return; } sort(a, i, 0); sort(a, i - 1); } static void sort(int[] a, int i, int j) { if (j >= i) { return; } if (a[j] > a[j + 1]) { swap(a, j, j + 1); } sort(a, i, j + 1); } static void swap(int[] a, int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t; }
269 名前:デフォルトの名無しさん [2015/08/15(土) 00:18:15.82 ID:f9Sa8wCp.net] ずいぶん効率悪そうなソートだね。 たとえ正しく動くとしてもこれはないだろう。 でも聞きたいのはそういうことじゃないのかな。
270 名前:デフォルトの名無しさん [2015/08/15(土) 00:22:42.84 ID:JxzjZBTN.net] >>266 どうしてこれはないと思うのかね?(ヒント:再帰だから)
271 名前:デフォルトの名無しさん [2015/08/15(土) 01:24:19.54 ID:f9Sa8wCp.net] >>267 馬鹿馬鹿しいけど返事してやるよ。 O(n^2) だからだ。コード書く以前の問題だよ。
272 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 01:34:17.46 ID:vCc4fVXG.net] せめてクイックソート
273 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 01:44:24.34 ID:+Mrs40dU.net] 再帰推奨の奴の程度が知れてしまったな。 こんなひどいアルゴリズムでドヤ顔とかw
274 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 01:48:48.57 ID:WFfeEk5g.net] バブルソートは再帰だと汚い!って言いたかったのに 再帰どころか分割しすぎのクソコードで自爆ww static void sort(int [] a){ sort(a, a.length -1, 0); } static void sort(int [] a, int i, int j){ if( j < i ){ int t = a[i]; a[i] = a[j]; a[j] = t; sort(a,i,j+1); } else if( i > 0 ){ sort(a,i-1, 0); } }
275 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 01:49:45.86 ID:WFfeEk5g.net] おっと、ミスってた static void sort(int [] a, int i, int j){ if( j < i ){ int t = a[j]; a[j] = a[j+1]; a[j] = t; sort(a,i,j+1); } else if( i > 0 ){ sort(a,i-1, 0); } }