[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 08/08 14:06 / Filesize : 275 KB / Number-of Response : 1034
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

なあ、再帰関数好きな人いる?



1 名前:名無しのプログラマ [2015/08/09(日) 17:46:33.69 ID:Icb40LOY.net]
for,while使うの嫌いで基本的に再帰多用するんだが、だめなの?
皆から敬遠されてる気がする

101 名前:デフォルトの名無しさん [2015/08/12(水) 23:36:17.69 ID:ALDJfVhA.net]
>>95
mapをmapで定義してくださってどうもありがとうございます


>>94
触っちゃダメ

102 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:36:36.85 ID:S25mloU+.net]
>>97
> レスを読む限り、mapのがよく問題を分離できるし並列もできるから
> ループの方がよっぽど要らないような

mapとループの話じゃなくて、
ループと再帰の話で、再帰使うまでもない所で
再帰使う必要ないよって話をしてるんだよ。

要らないとは誰も行ってない。
シンプルな道具を適切に使いましょう。

103 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:38:07.01 ID:Pe25qO3w.net]
CPUの並列化機構がマルチスレッドぐらいしかないとか思ってると勘違いが起こる

104 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:38:19.63 ID:S25mloU+.net]
>>100
> mapをmapで定義してくださってどうもありがとうございます

どこがmap?

for...of ループの話?

ほれ、for...of ループ の説明
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for...of

105 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:39:14.64 ID:6ZXtaURL.net]
>>96
自分もコピーコンストラクタの再帰バグとかよくやりますw
C++は基本的部品は自分で書かず、
よくテストされてもの使った方がいいですね

106 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:39:27.31 ID:S25mloU+.net]
for...ofループを使ってダメなら、

function map(list, callback) {
 let ret = [];
 for(let i = 0; i < list.length; i++) {
  ret.push(callback(list[i]));
 }
 return ret;
}

って書くだけだけどね。

107 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:40:41.46 ID:6ZXtaURL.net]
>>101
いえいえ、ループを引き合いに出してるので、
その2者なら再帰よりもループのが要らないでしょうと

108 名前:デフォルトの名無しさん [2015/08/12(水) 23:40:57.52 ID:JsRAlNhV.net]
>>102
SIMDとかは更にまだまだ時代じゃないような気がする。
特定の環境に合わせてシコシコこさえるくらいの時代。

109 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:42:37.68 ID:S25mloU+.net]
>>106
「要らない」の理由がおかしいんだよ。
再帰でループが実現できるのは知ってる。

君は、大は小を兼ねる理論で、
大があれば小はいらないという考え方だろうけど、

俺は大には大を、小には小を使った方が
いい(わかりやすい)と言ってるわけ。



110 名前:デフォルトの名無しさん [2015/08/12(水) 23:44:25.03 ID:JsRAlNhV.net]
>>104
俺もそれはそうだと思う。

最初、イテレータを持つようにしてみたんだけど、何となく汚く見えたんで
std::shared_ptr使ってノードを表現したら、デストラクタがネストするバグを
こさえてしまった。

でも、結果的に、感動的にうまく動くアルゴリズムができて満足。
色々勉強になった。

111 名前:デフォルトの名無しさん [2015/08/12(水) 23:46:49.96 ID:JsRAlNhV.net]
まあ、俺に言えることは、HTMLを取り扱うなら、リンクリストが予想に反して最強ってこと。

112 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:53:27.52 ID:Pe25qO3w.net]
>>107
パイプライン

113 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:58:30.93 ID:6ZXtaURL.net]
>>108
私は再帰を代替にしろ、という話は一切してないですよ
率直に言って、あなたの主張は再帰を相手にしなくてもいい一般化ですし、
他人を下と決めつけてかかって煽ってるようにしか見えません。

114 名前:デフォルトの名無しさん [2015/08/13(木) 00:02:20.41 ID:AIiQbQBJ.net]
>>112
ひどいいいがかりだな

115 名前:デフォルトの名無しさん [2015/08/13(木) 00:03:45.02 ID:AIiQbQBJ.net]
〉他人を下と決めつけてかかって煽ってるようにしか見えません

レッテル張り

116 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 00:04:44.19 ID:Vkqae3ee.net]
>>108
ここは言語の違いだと思うけどjavascriptみたいな手続き型で再帰を特にサポートしていない言語は
再帰は基本的に使わない方がいいけど
関数型プログラミング言語だとむしろループより再帰の方が書きやすいし自然だから
よっぽど高速化したい時じゃないとループ使わないと思う(ループだとそのコードみたいに破壊的代入が含まれるし)

117 名前:デフォルトの名無しさん [2015/08/13(木) 00:09:22.93 ID:G0UckYXU.net]
>>114
レッテル貼りとは、太平洋戦争の頃に使われた言葉で、現代の若者は
ラべリング問題と言わないとわからないらしい。

あと、レッテル張りとは、レッテルを瓶に貼る前に水でピンと張る工程のことで、
それは、昭和初期のラべル職人以外には通じない言葉らしい。

118 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 00:14:19.60 ID:Vkqae3ee.net]
個人的にパターンマッチがない言語で再帰にはつらみを感じる

119 名前:デフォルトの名無しさん [2015/08/13(木) 00:15:41.46 ID:AIiQbQBJ.net]
>>116
常識で考えろよ、昭和初期のラベル職人以外には通じないことを
ここで言うと思うか?バカじゃね。



120 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 00:16:00.68 ID:NebXzry6.net]
>>116
もう何の話かわからないけど、無駄に知識がついてしまった

121 名前:デフォルトの名無しさん [2015/08/13(木) 00:17:24.90 ID:AIiQbQBJ.net]
>>117
パターンマッチはifで書けばいいし、再帰はループで書けばいい。
いきがるな。

122 名前:デフォルトの名無しさん [2015/08/13(木) 00:18:56.16 ID:AIiQbQBJ.net]
ループで書けるものを再帰で書くやつって結局ヒッピーなんだよね。
ラリってるだけ。

123 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 00:23:14.84 ID:Vkqae3ee.net]
>>120
ifはパターンマッチ漏れをコンパイラが警告してくれないんやで
val a = list match {
case Nil => Nil
case head :: tail => tail
}

をifで書くと
var a;
if(list.isEmpty){ a = Nil } else { a = list.tail }
だろ 辛い

124 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 00:24:32.15 ID:NebXzry6.net]
>>117
JavaScriptならswitch(true)で頑張れば、ある程度は代替できそうですが、
基本的に静的型言語じゃないと真価を発揮できない気がしますね

125 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 00:24:38.47 ID:Vkqae3ee.net]
>>121
言語の違い、データ構造の違い

126 名前:デフォルトの名無しさん [2015/08/13(木) 00:27:11.91 ID:AIiQbQBJ.net]
>>124
ループを再帰で書く奴はミーハーで頭の中ハコスカなだけ

127 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 00:28:36.37 ID:FUyksqfE.net]
アホばっか
再帰的なアルゴリズムなら再帰を使えばいいし
反復なアルゴリズムならループを使えばいいし
どちらでもいいなら気分でかけばいいじゃん?
どっちか一方しか使わない使えないでは話にならん

128 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 00:33:41.96 ID:Vkqae3ee.net]
ループを再帰で書くというのがなんか違う

むしろ最初に再帰が浮かび後からループにいやいや書き換えるのではないか

129 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 00:38:27.39 ID:FUyksqfE.net]
>>127
アルゴリズムの考え方が先行して考えられると思うけど



130 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 00:57:49.87 ID:NebXzry6.net]
>>128
ループや再帰処理それ自身がアルゴリズムなので、
強いて依存先として挙げるならデータ構造じゃないかと

131 名前:ID:JsRAlNhV mailto:sage [2015/08/13(木) 01:30:53.70 ID:1C0y4JfF.net]
ちょっと深夜のランニングをしてきたわけだが、誰にレスするべかな?
反論者と擁護してくれる人の両方がいるな。

132 名前:デフォルトの名無しさん [2015/08/13(木) 01:35:10.57 ID:G0UckYXU.net]
末尾再帰云々言ってる人は、コンパイラがループに変換してくれるから
再帰を使うべきって話ですか?

133 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 01:35:43.95 ID:1C0y4JfF.net]
>>113
> レッテル張り

全くだね〜w

>>115
> ここは言語の違いだと思うけどjavascriptみたいな手続き型で再帰を特にサポートしていない言語は
> 再帰は基本的に使わない方がいいけど

というか逆だね。(一部の?)関数型言語のような、
ループを再帰よりも書きづらくしているものに限って言えば、
再帰を使うしか無いよ。仕方なく。

そういう言語以外は、再帰よりもループのほうが簡単に書ける。
(データ構造自体が再帰に適している場合は除く)

> ループだとそのコードみたいに破壊的代入が含まれるし
破壊的代入はするよりもしないほうがいいのは確かで、
俺もコードレビューなどで破壊的代入はするなって言ってるけど、
それは方針であって絶対的なもんじゃない。
破壊的代入をしたほうがわかりやすい場合もある。
よく言われるように手段と目的を履き違えるな問題だよ。

134 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 01:37:43.32 ID:1C0y4JfF.net]
>>126
> どっちか一方しか使わない使えないでは話にならん

俺もそれを言ってる。

再帰を知った奴がなんでも再帰を使って
解こうとしている。それに対して警告してる。
まだまだだよって。

135 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 01:38:45.50 ID:1C0y4JfF.net]
>>131
> 末尾再帰云々言ってる人は、コンパイラがループに変換してくれるから

↓ 俺が最初のほうで書いたレスw

24 自分:デフォルトの名無しさん[sage] 投稿日:2015/08/11(火) 18:24:05.65 ID:Ghx6BuLg
ループで実装する

(意味なく)再帰にしたい!

再帰にするとスタックがー、関数呼び出しがー、どうのこうの

末尾最適化される再帰にすればいいんだぜ!フフン

末尾最適化されるような再帰コードを書く

コンパイラがループの実装に戻す


結論

人間がループを再帰に変換し、
コンパイラが再帰をループに戻すという無駄!

136 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 01:43:20.43 ID:1C0y4JfF.net]
>>127
> むしろ最初に再帰が浮かび後からループにいやいや書き換えるのではないか

女性の列の中から男の娘を探しなさいって言われた時、
前から一人づつ見ていくという方法を思いつく人は多くいると思うが、

俺「一人だけ確認した。あとは俺に頼む」→俺「はーい、わかりました。俺も同じことをしまーす。」→俺「以下同文」

という考え方をする人は滅多に居ないと思うが。

137 名前:まーた連続書き込み規制だよ mailto:sage [2015/08/13(木) 01:50:39.52 ID:kS/o56L+.net]
>>117とか>>120とか>>122とか>>123

そういう場合、switchを使うんだけど
ちょっと数が増えただけで、循環的複雑度を調べるツールで
複雑だって言われるんで、これぐらいいいじゃねーかと思いながら
(※注 そのツールを導入したのは俺wしきい値を8に設定してるのも俺w)

関数テーブル呼び出し的なコード(意味わかるよね?)に書き換えるんだけど、
そうしたらやっぱり前よりわかりやすくなって、
やっぱりswitchいらねーか、とか思ってしまうw

関数テーブル呼び出し的なコードにすれば、パターンマッチ漏れは
nullを関数呼び出しすることになって、実行時エラーになってはくれるよ。

138 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 01:54:14.37 ID:NebXzry6.net]
元から再帰で無理矢理書くことを勧めてる人は、そういないんじゃないかと

私は相手をその手の人間と決め付けて話す事が、
おかしいといってるだけですよ

139 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 01:59:57.44 ID:kS/o56L+.net]
>>137
> 元から再帰で無理矢理書くことを勧めてる人は、そういないんじゃないかと
うん、こいつらぐらいかな? 適切なものを選ぼうとせずに
何でも再帰、再帰のほうがわかりやすい。
再帰使うほうが頭いい、(理由ないけど)普通に再帰だわ
とか言ってる人。

25 名前:デフォルトの名無しさん[] 投稿日:2015/08/11(火) 20:07:51.21 ID:SPQSl72c [2/2]
再帰のほうがわかりやすいと思えない子が

26 名前:デフォルトの名無しさん[sage] 投稿日:2015/08/11(火) 20:55:40.81 ID:I9e7/X97 [1/2]
再起が得意かどうかで頭の良さが決まる

33 名前:デフォルトの名無しさん[] 投稿日:2015/08/11(火) 23:39:17.34 ID:BomPGBV/ [2/2]
再帰苦手なのは練習不足なだけ
理解が早いのは完全に地頭がいいだけじゃね?

74 返信:デフォルトの名無しさん[] 投稿日:2015/08/12(水) 23:00:43.40 ID:ALDJfVhA [5/11]
>>73
>だけどデータがリスト構造なだけなら
>普通にループを使ったほうがわかりやすい。

んなわけねーだろ
普通に再帰使うわ



140 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 02:00:23.27 ID:NebXzry6.net]
>>135
それってfoldかfilterで良くないですか?
そう言う意味で、再帰よりループのが不要に見えるんですが

141 名前:デフォルトの名無しさん [2015/08/13(木) 02:03:39.26 ID:G0UckYXU.net]
まだ関数型言語の時代は来てないんで、手続型前提で良いんじゃないですかね。

142 名前:デフォルトの名無しさん [2015/08/13(木) 02:06:24.18 ID:G0UckYXU.net]
関数型がうまく機能する時代にはC++のようなマルチパラダイムの言語に取り込まれて
結局、純粋な関数型言語の時代は来ないんじゃないですかね。

143 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 02:07:07.66 ID:kS/o56L+.net]
> それってfoldかfilterで良くないですか?
> そう言う意味で、再帰よりループのが不要に見えるんですが

え? 君、foldかfilterでいいにしても、再帰の話してないよね?
foldもfilterもループでも再帰でも書けるわけだから。

高階関数呼び出しを行うそれらの関数を使えば
ループ(または再帰)が不要になるっていう話なら別に否定してない。

俺もよく使うし、上の方でも書いたよ。

>>54
> 最近ではMIMEメールのパースとか、連想配列の
> 全ての値の処理とかで使ったかな。
>
> 再帰を使うことはめったにない。そしてミスをしやすい所でもある。
> だから再帰を使うときは、再帰を考慮しなくていい形に置き換えるようにしている。
> つまりJavaScriptでいうmapやreduceの形にする。再帰部分と処理部分に分けて再帰部分を隠ぺいする。
> 通常書くのはコールバックで呼ばれる処理部分のみ。
> そうすることで可読性も大きく上昇する。

再帰はわかりづらいからtraverseみたいな形にすることで再帰を内部に隠ぺいする。
ループを内部に隠蔽してfoldかfilterがあればループが不要だというのなら、
同じ理由で、再帰を内部に隠蔽したtraverseで良いから、再帰は不要だって言えばいいの?

144 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 02:13:00.97 ID:NebXzry6.net]
>>142
必要性の比較として、その手の関数で簡単に書き下せるloopの方が、
再帰より不要ではないですか?と言う意味ですよ

実装としては、さすがにループが完全になくなるとは思ってません

145 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 02:15:06.80 ID:kS/o56L+.net]
そういや高階関数使える言語ばっかりになったよな。

>>141
> 結局、純粋な関数型言語の時代は来ないんじゃないですかね。

俺もそう思う。

高階関数は便利だけど、純粋な関数型言語まではいらないかな。
あとScalaでいうval、再代入不可能な変数も欲しいけど。

146 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 02:19:20.99 ID:NFzWJ2Cc.net]
何でこんなに伸びてるの…

147 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 02:19:45.60 ID:kS/o56L+.net]
>>143
そもそもの話が、「ループで簡単に書けるようなもの」を
再帰でわざわざ書くなって話なんだよ。

正確に言うと、再帰を使わないでいいような処理に
再帰を使うなという話。

だから、その手の関数で簡単に書き下せる処理に
再帰を使うなっていう話でも有る。

148 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 02:20:52.90 ID:kS/o56L+.net]
>>145
話が再帰してるから

(ループをわざわざ再帰にしてみました!)

149 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 02:24:57.75 ID:NebXzry6.net]
>>146
では、それを踏まえた上でどう思います?



150 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 03:17:20.09 ID:kS/o56L+.net]
>>148
最初っからおんなじ
再帰は可読性悪いんで
使わずに済むなら使わない方がいい。

151 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 03:18:50.05 ID:WDxyRHha.net]
あとどうしても必要な場合は

152 名前:
内部に隠蔽して、再帰であると意識せずに
また再帰のコードを見ずに、処理できるようにした方がいい。
[]
[ここ壊れてます]

153 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 03:30:05.42 ID:NebXzry6.net]
>>149
いえ、そうではなく、二者択一で
再帰とループで、必要性が高いのはどっちだと思います?
もちろん、高階関数や各種操作関数での置き換えを踏まえた上での話です

必要と思うならどういう場面なのかなと

154 名前:>>150 mailto:sage [2015/08/13(木) 03:31:16.05 ID:NebXzry6.net]
最後の行は削除忘れです

155 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 03:36:08.86 ID:WDxyRHha.net]
>>151
お前バカじゃね?
足し算と掛け算どっちが必要かって
言ってるようにしか聞こえん。
適切なものを使えよ。

156 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 03:39:48.62 ID:WDxyRHha.net]
そういや実務で再帰使う必要せいってねーな。
あっても隠蔽するから両手で数えられるほどしか無い。
片手でもいけるかもw

157 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 03:51:07.78 ID:NebXzry6.net]
>>153
私はそこまで一般化はしてないですし、適材適所も否定してません
それと必要性の比較も関係ありませんよ
例えばgoto文も適材適所ですが、必要性は低いと思ってます

再帰がループと同程度に必要と思うなら、そう言ってくれればいいです
違う場合に、その先の話がしたいだけなので

158 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 04:15:21.85 ID:NebXzry6.net]
ループが本当に必要な部分というのを、議論してみたかったんですが
どうあっても再帰は不要といいつつ、ループが必要とは言わないんですね…

159 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 04:27:48.44 ID:WDxyRHha.net]
>>155
実践では再帰はあまり使いません。
必要性の話をするのなら
それが現実では?



160 名前:デフォルトの名無しさん [2015/08/13(木) 07:42:46.93 ID:GBQWWFg+.net]
クイックソートもループで書くんですか?

161 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 07:48:57.17 ID:FXSompvo.net]
アスペかよ

162 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 08:21:16.88 ID:Iax2S8IU.net]
>>158
実用的なクイックソートはループ。

まさか再帰でしか実現できないなんて考えとるんか?

163 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 08:52:19.31 ID:GBQWWFg+.net]
>>160
再帰より可読性の高い、ループでのクイックソートの実装は寡聞にして知りません。

164 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 09:30:01.18 ID:Iax2S8IU.net]
ループ方式も可読性は高い。
特別なことはやらないから、誰でもすぐ実現できるはず。

Cどころか昔のVBのようなへぼ環境でも
何百万ものデータを高速にソートできてしまう。

165 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 09:53:04.16 ID:GBQWWFg+.net]
例えばこれ
https://github.com/lattera/glibc/blob/master/stdlib/qsort.c
本来の再帰アルゴリズムを、非再帰で記述するために状態を自前のスタックで管理しなきゃならない。
余計なコードが必要な分、可読性は低いですね。

166 名前:デフォルトの名無しさん [2015/08/13(木) 10:07:42.74 ID:Q4WJ33HH.net]
>>163
FSF、Microsoft、そしてAppleが再帰を避けるのは何故か考えてみては。

167 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:10:35.79 ID:wsd38m6J.net]
再帰関数をスタック無視して設計するような馬鹿じゃなけりゃ、
どっちでもいいよ。
金太郎飴をループで切るか再帰で切るか、程度の話しかしてない
みたいだしな。その関数がその構造のどこまでのデータを扱うのか
ってことを意識してりゃ別にいい。
再帰でよその子をいじったりとかするのは馬鹿のやること。

168 名前:デフォルトの名無しさん [2015/08/13(木) 10:13:00.13 ID:1x08JE5T.net]
論点がずれてないか?
>>163は可読性について論じているのに

169 名前:デフォルトの名無しさん [2015/08/13(木) 10:27:03.54 ID:Q4WJ33HH.net]
>>166
わざわざglibcのソース引っ張り出してるとこからして、本人も言いたいことが自分で分かっていないのでは?

Cで再帰するコードを書けば、たいていのチェッカが警告するし、品質保証からお叱りを受けるはず。
やってはいけないことの一つとして、ほとんどの企業で明文化されているはずです。

そして良く知られるMISRA-Cも通りません。

こういう状況下で、glibcのソースを引用して再帰するべきと主張するのはおかしい。
glibcでも再帰は避けている、再帰するべきでないという主張になるのが当然だと思う。

そうなっていないという事は、本人が一番自分の主張をわかっていない。
と思うのです。



170 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:30:12.83 ID:NebXzry6.net]
さすがにこれを可読性が高いとは言うのは無茶じゃないかと

171 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:30:37.05 ID:Iax2S8IU.net]
可読性が悪いかどうかじゃなく、
再帰の場合よりも良くなくてはいけないと?

理解困難なコードでなく実用性があるのなら採用するでしょ。

プログラマはソート処理のコードは使いまわして
比較関数を用意すればいいだけだし。

172 名前:デフォルトの名無しさん [2015/08/13(木) 10:32:46.72 ID:GBQWWFg+.net]
>>167
可読性の話をしてるんですが?

173 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:38:27.46 ID:WDxyRHha.net]
>>163
> 本来の再帰アルゴリズムを、非再帰で記述するために状態を自前のスタックで管理しなきゃならない。

だから適切なものを選べって言ってるじゃん。

誰が、再帰が適切なものまで、
ループにしろって言ったよ?

ループで済むものを再帰でやるなって話。

ほんと>>42で書いた4の段階のやつだなお前は。

174 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:40:07.80 ID:WDxyRHha.net]
>>169
> プログラマはソート処理のコードは使いまわして
> 比較関数を用意すればいいだけだし。

そういう場合、そのソートは何に使われるかわからないから
往々にして、速度が一番早い方法を選ぶんだよね。
つまりループで実装。

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
それは、押すなよ、押すなよってやつですか?
それとも自分でコピペして、ほら俺の言ったとおりだった(ドヤ顔)を
やるための布石ですか?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<275KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef