[表示 : 全て 最新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使うの嫌いで基本的に再帰多用するんだが、だめなの?
皆から敬遠されてる気がする

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);
 }
}



276 名前:デフォルトの名無しさん [2015/08/15(土) 05:15:13.18 ID:IGI9KIAb.net]
再帰が有能なことはハノイの塔が証明してるって。
再帰
# coding: utf-8

def hanoi(disk_number, f, t, w, tower_dict):

if disk_number > 0:
hanoi(disk_number-1, f, w, t, tower_dict)
tower_dict[t].insert(0, tower_dict[f].pop(0))
print((tower_dict['left'], tower_dict['center'], tower_dict['right']))
hanoi(disk_number-1, w, t, f, tower_dict)


if __name__ == '__main__':
disk_number = int(input())
tower_dict = {'left': [i for i in range(1, disk_number+1)], 'center': [], 'right': []}
print((tower_dict['left'], tower_dict['center'], tower_dict['right']))
hanoi(disk_number, 'left', 'right', 'center', tower_dict)

277 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 08:34:36.98 ID:pcfePhGh.net]
趣味のプログラミングのお題だな。

278 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 08:40:27.84 ID:WFfeEk5g.net]
寝ぼけ過ぎてた
何やってんだ俺

static void sort(int[] a, int i, int j){
 if( j < i ){
  if (a[j] > a[j+1]) {
   int t = a[j];
   a[j] = a[j+1];
   a[j+1] = t;
  }
  sort(a,i,j+1);
 }
 else if( i > 0 ){
  sort(a,i-1, 0);
 }
}

型変えてgccで末尾再帰最適化確認した

279 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 08:43:31.65 ID:aV490TlT.net]
再帰は可読性悪いとか言ってる人、数学的帰納法で落ちこぼれたのかな。

280 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 09:51:49.02 ID:9roGQVeV.net]
>>276
再帰に向かない物まで再帰にするのが良くないだけだろ?

281 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 11:26:39.03 ID:LE4LycT3.net]
末尾再帰にできるんならガンガン再帰使えばいいんでね
最適化してくれないjsみたいなのは除くとして

282 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 12:06:13.60 ID:oUuKlgWM.net]
>278
その台詞はオプティマイザのご機嫌とって
オブジェダンプかけながらソースを書いていた事があって言ってるのか

283 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 17:28:44.82 ID:7X/ZNWxV.net]
>>276
こういう必死さみても再帰の有害さがわかる

284 名前:デフォルトの名無しさん [2015/08/15(土) 17:33:32.28 ID:OJGJ2QAv.net]
>>279
すいません
関数型プログラミング言語でしか再帰書いた事ありません><

285 名前:デフォルトの名無しさん [2015/08/15(土) 23:44:57.75 ID:KDDvbpTi.net]
>>268
どや?

static void sort(int[] a) {
 for (int i = a.length - 1; i > 0; i--) {
  for (int j = 0; j < i; j++) {
   if (a[j] > a[j + 1]) {
    swap(a, j, j + 1);
   }
  }
 }
}

static void swap(int[] a, int i, int j) {
 int t = a[i];
 a[i] = a[j];
 a[j] = t;
}



286 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 02:27:58.97 ID:LltgmYR9.net]
void死すべし
副作用死すべし

287 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 02:31:35.69 ID:ysqlqGaE.net]
ループ原理主義者はオーダーの話を理解できない池沼

288 名前:デフォルトの名無しさん [2015/08/16(日) 03:05:47.99 ID:IVc263H9.net]
>>284
オーダーはデータ量が増えればこの項は無視できると
いうふうに項を消した残りかすなんだからデータ量が少ない
情況を仮定するとバブルソートがクイックソートより高速なのは常識。
オーダーを理解できてないアルツハイマーはお前の方。はいバブルソート論破。

289 名前:デフォルトの名無しさん [2015/08/16(日) 03:08:28.72 ID:IVc263H9.net]
結局さあ、再帰厨っていうのはオーダーの意味さえわかってない知恵遅れなんだよね。
「早すぎる最適化は諸悪の根源である」というプログラムの常識を理解してない池沼の根源。

290 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 03:21:51.10 ID:ysqlqGaE.net]
>>285
お、そうだな
www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/speed-compare.html

291 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 03:35:29.90 ID:ysqlqGaE.net]
ガチで理解していないようだから説明しておくと
バブルソート{約(1/2)*n(n+1)}は10個以下でquicksortのオーダーを下回る

292 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 07:52:21.53 ID:42LjL2Kj.net]
ソートの計算オーダーかよ
学校で習った知識を自慢したかったのか?
そーいや夏休みだったなあ

293 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 08:10:34.59 ID:ysqlqGaE.net]
こいつ無様すぎるw

294 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 11:35:18.70 ID:t2Jj+if9.net]
ループは読み難いですね。

295 名前:デフォルトの名無しさん [2015/08/16(日) 13:14:51.24 ID:6UxdI0kW.net]
>>291
絶望的に長くなって読み難くなるものがある。

全員に訊こう。
例えば、多重再帰じゃないと簡潔に書けないものは存在する。イエスかノーか。



296 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 13:28:24.19 ID:onk31F/8.net]
再帰では簡潔に書けないものもある。
再帰だとと簡潔に書けるものもある。

だからすべての場合で同じ方法を使わず
適切に使えというのは最初から言われていること。

その再帰万能って考え方はいつになったら治るのかね?

297 名前:デフォルトの名無しさん [2015/08/16(日) 13:32:21.21 ID:IVc263H9.net]
>>293
そういうことだな。

298 名前:デフォルトの名無しさん [2015/08/16(日) 13:38:08.54 ID:6UxdI0kW.net]
二人ともイエスな。ノーの意見の人はいないか?

299 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 13:41:10.33 ID:iyw7PDsu.net]
きっとノーって言ったら
ほら見ろ、再帰万能じゃねーか。
って言うつもりだろう?

面白そうだから俺がノーと
言ってやろうw
ノーだ。ノー。

300 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 13:45:55.82 ID:H2axMdYb.net]
言語特定しないでyes/noとか。
バカも休み休み言え。

301 名前:デフォルトの名無しさん [2015/08/16(日) 13:47:02.94 ID:6UxdI0kW.net]
>>296
俺は「ものもある」「ものは存在する」と訊いてるんだから、「ノー」なら完全否定派なだけだ。
別に面白い展開は無いぞ。

>>297
じゃあCにしよう。

302 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 13:49:00.82 ID:iyw7PDsu.net]
>>297
なんか、策でもあるんだろ。
誘導尋問だか、屁理屈や揚げ足だか、重箱の隅や失言狙いかしらんけど。
言葉尻を捕らえようとする戦略なんだろうから
生暖かく見てやろうぜ。

303 名前:デフォルトの名無しさん mailto:sage [2015 ]
[ここ壊れてます]

304 名前:/08/16(日) 13:51:11.93 ID:iyw7PDsu.net mailto: 俺は「ノー」と言った。完全否定派なだけだ。

その後の展開(レス)は無いのかよw
[]
[ここ壊れてます]

305 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 14:07:57.73 ID:t2Jj+if9.net]
再帰では簡単に書けないものもある、というところに、
どんなケース?
という疑問を抱くから、ノーかな。



306 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 14:16:38.84 ID:bhCkQFe7.net]
木の探索を書くとして、深さ優先なら再帰にするし幅優先ならループにする。
深さ優先でもスタックオーバーフローを考慮しなきゃいけない状況ならループで書く。

要は、状態を自分で管理して関数のパラメータとして引き回すくらいならループにする。

307 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 14:20:58.92 ID:H2axMdYb.net]
バカには再帰は理解できない
これが、このスレのこれまでの結論なので、

答えはノー
∵ 全ての再帰は簡潔でない

308 名前:デフォルトの名無しさん [2015/08/16(日) 14:28:14.30 ID:6UxdI0kW.net]
なるほどみんなありがとう。

309 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 15:06:07.80 ID:LltgmYR9.net]
トランポリン使えば末尾再帰にしなくても
スタックオーバーフローしないよ
ヒープ使いまくるけどね

310 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 17:45:23.08 ID:t2Jj+if9.net]
>>302 なるほど。

311 名前:デフォルトの名無しさん [2015/08/16(日) 20:22:40.46 ID:kniDeEJc.net]
>>302
>要は、状態を自分で管理して関数のパラメータとして引き回すくらいならループにする。

再帰使う人間はまさにこれがいやだから再帰使うんだが

そもそも、深さ優先か幅優先かで書き方変えるとかあり得ない
抽象化に失敗してるだけだ

312 名前:デフォルトの名無しさん [2015/08/16(日) 21:43:54.44 ID:IVc263H9.net]
>>307
幅優先探索をループで書いて、深さ優先探索を再帰で書くのはよくあるケースだと思うけどな
抽象化は関係ないw

313 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 22:39:02.64 ID:ysqlqGaE.net]
>>308
お前あれだけ恥ずかしい事書いておいてよくまた出てこれるなw

314 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 22:47:59.54 ID:bhCkQFe7.net]
ペチパーなのでPHPで書くけど、実際、深さ優先と幅優先の違いは大した問題じゃない。
単にスタックかキューかの違いなので、このコードなら $strategy を array_pop にすれば深さ優先で array_shift にすれば幅優先。
ループでも再帰でも、そこの戦略は簡単に抽象化できる。

<?php
class tree {
  public $value;
  public $children;
  function __construct($value, $children = []) {
    $this->value = $value;
    $this->children = $children;
  }
}

// [1, [2, [3, 4]], [5, [6, 7]]]
$sample = new tree(1, [new tree(2, [new tree(3), new tree(4)]), new tree(5, [new tree(6), new tree(7)])]);

function traverse($tree, $strategy) {
  $task = [$tree];
  while ($task) {
    $node = $strategy($task);
    echo $node->value;
    foreach ($node->children as $c) array_push($task, $c);
  }
}
traverse($sample, 'array_shift'); echo "\n"; // 幅優先
traverse($sample, 'array_pop'); echo "\n"; // 深さ優先。right to left になるのはご愛嬌。foreach の走査に array_reverse を入れれば left to right になる。

315 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 22:55:01.73 ID:bhCkQFe7.net]
今のコードで $task が >>302 でいう「状態」になるわけだけど、
まず深さ優先なら再帰で書くってのは、次の depth_first_rec のように書けば $task をコードから消せる。状態管理なんてのは本質じゃないので消せるならそう書く。

function depth_first_rec($node) {
  echo $node->value;
  foreach ($node->children as $c) depth_first_rec($c);
}
depth_first_rec($sample); echo "\n";

一方、幅優先を再帰で書こうとしたら、$task を再帰のパラメータに乗せなきゃならない。
関数のシグネチャはアルゴリズムの本質を表明すべきだと思うので、$task みたいなものを出したくない。これならループで書く。
もちろん関数型言語で書く人は、綺麗な関数でラップして traverse_rec みたいなのは内部に隠蔽するだろうけど、
見比べてみればそれって、>>310 の traverse が「綺麗な」外側の関数で traverse_rec が while ループに対応する。全く同じことやってる。

function traverse_rec($strategy, $task) {
  if ($task) {
    $node = $strategy($task);
    echo $node->value;
    foreach ($node->children as $c) array_push($task, $c);
    traverse_rec($strategy, $task);
  }
}
traverse_rec('array_shift', [$sample]); echo "\n";
traverse_rec('array_pop', [$sample]); echo "\n";



316 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 22:57:42.02 ID:bhCkQFe7.net]
とまあ、この程度のことは >>307 本人には釈迦に説法だろうけど、ROM ってる誰かの役に立てばと思って一応書いてみた。
おやすみ。

317 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 23:04:29.84 ID:qX4pihue.net]
>>311
> 一方、幅優先を再帰で書こうとしたら、$task を再帰のパラメータに乗せなきゃならない。

載せる必要はない。

普通は関数内関数(クロージャー含む)を使って
再帰関数の外の変数を使うもの

C言語ではやりにくいが、グローバル変数を使えば可能

こんな常識も知らないのか?

318 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 23:10:17.19 ID:bhCkQFe7.net]
>>313
コメントありがとう。
今回の問題でそういう実装にすると $task に破壊的代入を行うことになると思うけど、
それを気にしないなら別によいと思う。

319 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 23:23:41.26 ID:ysqlqGaE.net]
>>310-312
とてもわかりやすいコード乙

>>313
最適化

320 名前:ニステートレス化のためにパラメタで渡すのは常識だろ
荒らすな
[]
[ここ壊れてます]

321 名前:デフォルトの名無しさん [2015/08/16(日) 23:24:18.75 ID:5vUfdwLX.net]
木の探索はスタック一本で実現できるので、再帰は使わないほうが良い。
再帰使うと攻撃に弱くなる。

322 名前:デフォルトの名無しさん [2015/08/16(日) 23:30:59.94 ID:5vUfdwLX.net]
木自体もリンクリストを使って直列化したデータ構造で表現しておくと、
操作がやりやすくなる。

直列された状態では通常、前から後ろに移動していくと、深さ優先探索の状態になる。
デメリットは、キャッシュに乗りにくくなることと、使用メモリー量が
大きくなること。

ただし、操作のコストが一般に低くなるので、十分ペイする。
そして攻撃に強い。

323 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 23:32:55.62 ID:qX4pihue.net]
>>315
> 最適化とステートレス化のためにパラメタで渡すのは常識だろ

お前、最適化と言ったら、スピード上げることしか思いつかないのか?

「可読性の最適化」だよ。
可読性がいい方向にコードを最適化することで
メンテナンス性を上げることができる。

お前は単なるスピード狂。
お前が書くコードは読みづらい

324 名前:デフォルトの名無しさん [2015/08/16(日) 23:44:57.83 ID:5vUfdwLX.net]
データ構造とアルゴリズムの分離を考えても再帰は不利。

325 名前:デフォルトの名無しさん [2015/08/16(日) 23:47:34.77 ID:5vUfdwLX.net]
>>313
グローバル変数は、再利用性を著しく損なうので避けるべき。



326 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 23:55:06.97 ID:ysqlqGaE.net]
>>318
スタック消費抑えるために最適化するのは常識なんだが
どこの世界の似非プログラマ?

327 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 00:08:45.56 ID:kjPlSxav.net]
つかクイックソートって
今のアーキテクチャにはあわんでしょ

328 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 00:28:50.83 ID:ZK4qdIAD.net]
とりあえず否定するスタイル

329 名前:デフォルトの名無しさん [2015/08/17(月) 00:36:22.18 ID:I1eaKx/I.net]
>>309
バブルソートで論破されて必死やなw

>>310
衒学的なオナニーされておられるところ大変恐縮ですが、結局ループでいいってことだろ。
抽象化言いたいだけやろ。しょうもな。

330 名前:デフォルトの名無しさん [2015/08/17(月) 00:40:53.56 ID:I1eaKx/I.net]
結局さあ、再帰に大きな瑕疵があるってことわかったんだから、
再帰厨は潔く観念して俺に敬服するべきだと思うんだよね。

331 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 01:17:00.24 ID:3kIm88tb.net]
再帰はバカには理解し難いと言う欠点がある。

332 名前:デフォルトの名無しさん [2015/08/17(月) 01:44:30.24 ID:y5LPXYrp.net]
>>326
ほんこれ。

333 名前:デフォルトの名無しさん [2015/08/17(月) 02:05:13.63 ID:PZrD2gdn.net]
トリッキーな構造だから一見わかりづらいよな。
再帰を使わないと解決できない問題があるとすれば、再帰を使えない事がその人の限界になる。

334 名前: ◆QZaw55cn4c mailto:sage [2015/08/17(月) 05:40:35.05 ID:TRZJFBPo.net]
>>322
今でも普通クイックソートだね.
次数が減ったら挿入ソートや選択ソートに切り替えはするが

335 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 08:18:37.09 ID:bgkOWECj.net]
クイックソートはループで実装
これ常識


ループの可読性が悪いなんて言ってるのはレベル低すぎ



336 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 09:50:03.46 ID:fqo2f2L7.net]
>>330
while()って読み難くありませんか?

337 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 10:03:44.62 ID:HKx5lNza.net]
>>331
質問じゃなくて、コードを書いて、
このコードとこのコードを比較して
while()は読みづらいって言いなさい。
他人の失言を狙ってるのバレバレだから。






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

前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