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

357 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 20:18:08.13 ID:rlqXRw2u.net]
暇をもてあました学生が再帰で俺TUEEEEEEする遊び

358 名前:デフォルトの名無しさん [2015/08/17(月) 20:40:03.62 ID:RDuEyBYc.net]
再帰でCPS変換とかサクサク使えないレベルならループ書いときゃいいんじゃね
可読性に関する再帰のコストはほぼ周りがCS卒かどうかで決まる
CS勉強してりゃ再帰の方が圧倒的に読みやすいし加工しやすいし最適化しやすい
してなきゃループがわかりやすい。そんだけ。

359 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 20:52:33.62 ID:bgkOWECj.net]
ループの可読性にしつこく文句言うやついるかと思っていたら、
これまで話を完全に無視して、
ループでは書けないなどと言い出すものまで現れるのかよ・・・

360 名前: ◆QZaw55cn4c mailto:sage [2015/08/17(月) 21:08:42.74 ID:TRZJFBPo.net]
>>351
それ,結局データ構造にスタックを持ち込んでいるね‥
非再帰とはいいにくい,普通に再帰で書いたほうがいいんじゃないかな‥

361 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 21:27:59.23 ID:rlqXRw2u.net]
思い出しやすい方で書くかなあ。CPS変換が読みやすいって言ってるように見える人がいるけど
サンクがどれだけ詰まれてくか目に見えないじゃない
ああ、Lispならわかるんだっけ

362 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 21:34:14.06 ID:5i910ycA.net]
>>355
再帰による実装は、コードが簡潔になる利点はあるものの、
スタックが足りなくなる恐れがあります。
ソート作業は、大量のデータに対して行うことも多いので、
この問題は致命的です。

この問題は、自力でスタックを制御できるようにして、
再帰構造を取りやめれば解決できます。
スタックサイズは log2 n 以上の容量があれば足りることが実証されています。
int型が 64ビットだとしても、たかだか 128要素で済むので、定数で構わない
ttp://u222u.info/nh3Q

363 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 23:29:17.65 ID:i5qYhPSf.net]
>>351
お前、バカだろう。
perlは関数呼び出しのオーバーヘッドがでかいのであたりまえ。
java版 繰り返し:平均 408.86 ms, 再帰:平均 236.81 ms
stackoverflow.com/questions/12553238/quicksort-iterative-or-recursive
The average of the iterative solution was 408.86 ms while of recursive was 236.81 ms
However -these are constant number of ops, while not changing the number of "iterations".

アンチ再帰の根拠がまた一つ否定された。

364 名前:デフォルトの名無しさん mailto:sage [2015/08/18(火) 00:54:03.83 ID:iaUEwJyI.net]
単位がオーダーだけの文献は読まんでいい
さすがに古すぎる

単位にサイクル使ってるやつだけ参考にしろ

365 名前:デフォルトの名無しさん mailto:sage [2015/08/18(火) 04:11:08.35 ID:6SfpmUjr.net]
>>357
log2 nに限定するならメディアン必須になるし、
投機的実行や並列化の恩恵にも預かれないぞ
それこそ「現在のアーキテクチャに合わない」

>>359
サイクルって何?



366 名前:デフォルトの名無しさん mailto:sage [2015/08/18(火) 08:16:42.70 ID:FMltliIe.net]
>>360
log N 「以上」なのでメディアン(割りきれるか割りきれないかだよね?)は融通効くし、
パイプラインは関係ないと思うんだけど具体的にどう、最適化に悪影響なの?

367 名前:デフォルトの名無しさん mailto:sage [2015/08/18(火) 09:23:27.84 ID:6SfpmUjr.net]
>>361
並列は言わずもがな、分岐が増えるほど投機実行も不利

>log N 「以上」なのでメディアン(割りきれるか割りきれないかだよね?)は融通効くし
だから全要素からのメディアン取るのが必須になるだろと
さもなくば埋まったら切るとかの戦略でもない限り、大きさ固定のスタックは無理

368 名前:デフォルトの名無しさん mailto:sage [2015/08/18(火) 09:32:58.52 ID:6SfpmUjr.net]
>>361
ごめん、リンク先見てなかった
小さい方だけ計算していくなら、再帰でもループでも可能だね

369 名前:デフォルトの名無しさん mailto:sage [2015/08/18(火) 09:55:04.16 ID:biaMMpq3.net]
再帰法の方が簡潔な記述となり実装が簡単となったとしても、
処理速度やメモリ消費の点で効率が悪い。

これが真実。

効率の求められるクイックソートはループ方式ですね。

370 名前:デフォルトの名無しさん mailto:sage [2015/08/18(火) 10:02:42.34 ID:FMltliIe.net]
>>363
実は自分もメディアンのこと、ピボットのことだと気づかなかったから変なこと言ってました……
なんかlog Nとスタックのワードだけで勝手に勘違いしてた。
恥ずかしいからROMります……

371 名前:デフォルトの名無しさん [2015/08/19(水) 06:32:50.20 ID:h1yQg/qV.net]
サイクルって結局何だったんだ
オーダーと比較するんだからCPUサイクルのわけないだろうし

372 名前:デフォルトの名無しさん [2015/08/19(水) 06:48:19.79 ID:8XFwGYsL.net]
再帰はセキュリティの問題から使ってはいけない。

これは既に常識。

373 名前:デフォルトの名無しさん mailto:sage [2015/08/19(水) 06:53:40.18 ID:3Ipmhs8Y.net]
>>367
ワトソンでは基幹部分で使われている。大変だ。

374 名前:デフォルトの名無しさん [2015/08/19(水) 06:59:26.41 ID:8XFwGYsL.net]
じゃあワトソンは使うな。

375 名前:デフォルトの名無しさん [2015/08/19(水) 08:04:33.92 ID:8XFwGYsL.net]
末尾再帰はループに展開されるから大丈夫 → 結局再帰が良くないからループにするんだよね?

◯◯では使われてる → じゃあ◯◯は使うな、使われてないのに適当なこと言ってたら訴えられますよ?

再帰下降法も使うなというのか? → 再帰下降法は使うな、入力の解析を再帰で行うのは最も危険。



376 名前:デフォルトの名無しさん mailto:sage [2015/08/19(水) 08:08:05.43 ID:3Ipmhs8Y.net]
>>370
ワトソンの基幹部分にPrologが使われているというのは常識だが。

377 名前:デフォルトの名無しさん mailto:sage [2015/08/19(水) 08:18:36.42 ID:cBcKF4Ir.net]
>再帰はセキュリティの問題から使ってはいけない。

だから一般化しすぎだろ
scalaとかでも同じ事言うの?

378 名前:デフォルトの名無しさん [2015/08/19(水) 08:20:15.23 ID:8XFwGYsL.net]
再帰の危険性はCERT CC読むだけでもわかること。
いまさら再帰を使うべきというのはおかしい。

しかも、何故かWEB系の人に多いのがおかしすぎる。
WEBは最も再帰を避けるべきであろう。

379 名前:デフォルトの名無しさん [2015/08/19(水) 08:25:28.68 ID:8XFwGYsL.net]
>>372
言語が再帰を別のアルゴリズムに変更することを保証しているなら、
使っても良いだろう。
しかし保証しないのであれば、使うべきではない。

例えば、一般的なケースでは大丈夫 → これは使うな、攻撃者は一般的なケースで攻撃してこない。
再帰下降法について擁護するものは、大体一般的な例を述べるが、攻撃者は
最悪のケースで攻撃してくる。

380 名前:デフォルトの名無しさん [2015/08/19(水) 08:27:48.29 ID:8XFwGYsL.net]
保障されるのか保障されないのか判別できないなら使うべきでない。

大抵のコンパイラがループに展開する → これは使うべきではない、言語が保証しない限り
使ってはいけない。

381 名前:デフォルトの名無しさん mailto:sage [2015/08/19(水) 08:32:59.75 ID:cBcKF4Ir.net]
>>374
いやだから末尾再帰は確かにループに展開されるけど
普通の再帰は展開されない(余再帰とかいうあれ)
val one:Stream[Int] = 1#::one

382 名前:デフォルトの名無しさん [2015/08/19(水) 08:38:24.50 ID:8XFwGYsL.net]
>>376
じゃあ使うなよ。

再帰がヒープに展開されるなら、現状では使っても良いとするしかないだろう。
現在のコンピュータにはその程度の安全性しかない。

一方、マシンスタックが消費されるなら、これは使ってはいけない。

言語が保証できるかどうかはこういう話。

逆に言うと、保証できる言語は本質的に遅いから変えたほうが良いよ?

383 名前:デフォルトの名無しさん mailto:sage [2015/08/19(水) 08:40:13.17 ID:cBcKF4Ir.net]
そもそもVM上で動く言語でセキュリティの観点から再帰使うな
って言われてもな
一般化しすぎ

384 名前:デフォルトの名無しさん mailto:sage [2015/08/19(水) 08:43:41.41 ID:cBcKF4Ir.net]
>>377
遅延データ構造で余再帰使うなってあんた

385 名前:デフォルトの名無しさん mailto:sage [2015/08/19(水) 08:47:34.95 ID:cBcKF4Ir.net]
入力をその場で評価せずに遅延データ構造であらわすってあるけど
そこで末尾再帰なんかしたらそれこそ危ない



386 名前:デフォルトの名無しさん [2015/08/19(水) 08:58:49.14 ID:8XFwGYsL.net]
>>380
遅延評価によってマシンスタック消費の抑制を保証できるのであれば、
使っても良いだろう。

しかし、保証するという事はどういうことが起きるのか、良く考えたほうが良い。

大抵のケースで保障できる → これは使ってはいけない、条件が付いた時点で保障できていない。

387 名前:デフォルトの名無しさん [2015/08/19(水) 09:01:52.31 ID:8XFwGYsL.net]
再帰は本質的に危険なので、教科書的にもループを基本にするべきではないだろうか。

逆に言うと、再帰で説明する教科書は、既に古いので使うべきでない。

20世紀の教科書。

388 名前:デフォルトの名無しさん [2015/08/19(水) 09:04:29.34 ID:8XFwGYsL.net]
こういった議論でわかることは、最近の素晴らしい言語は、問題点の
議論を避けている。

結論が出るまで使わないほうが良い。

389 名前:デフォルトの名無しさん mailto:sage [2015/08/19(水) 09:36:58.20 ID:3Ipmhs8Y.net]
>>382 再入可能なコードは本質的に危険ということですか?

390 名前:デフォルトの名無しさん mailto:sage [2015/08/19(水) 10:38:04.52 ID:qmnFr7bU.net]
再帰云々の議論をしている最中に関数型言語を持ち出してくる奴はキチガイ。

関数型言語なんて再帰キチガイが再帰を正当化するために作り出した言語で
あって、逆に言えば関数型言語でない限り再帰に正当性は一切ない。
再帰キチガイは再帰に問題がありまくることを知っているからこそ、再帰を
満喫するために関数型言語なんていう

391 名前:キチガイ非効率言語を作ったんだから、
そこに収容されていて、一般論のスレに出てくるな。
[]
[ここ壊れてます]

392 名前:デフォルトの名無しさん [2015/08/19(水) 10:55:26.78 ID:N4waeMow.net]
うわあ手続きキチガイだ

393 名前:デフォルトの名無しさん [2015/08/19(水) 11:13:42.96 ID:h1yQg/qV.net]
要するに反論できないから関数型言語を議論から除きたいと

394 名前:デフォルトの名無しさん [2015/08/19(水) 11:17:04.81 ID:irPHrK71.net]
>>385
そうですね。

>>384
最近のライブラリが歳入可能性に言及するのは、スレッド安全に関連する話です。

関係ない話題をうまく混ぜ込むのが最近のトレンドですが、ム板でやると
馬鹿だと思われますよ。

395 名前:デフォルトの名無しさん [2015/08/19(水) 11:19:08.64 ID:irPHrK71.net]
>>387
関数型言語は言語が再帰を避けてくれるから安全だと言いたいんですよね?

言語が避けてくれるのは、再帰が危険だからですよね?



396 名前:デフォルトの名無しさん [2015/08/19(水) 11:22:24.20 ID:irPHrK71.net]
関数型言語自体が、まだ結論の出ていないものだと思います。

威勢の良い宣伝は良くあります。

それはどの言語でも経験したことです。

例えばJavaはC/C++のおよそ20倍高速だった時代もあったのです。

現在は、関数型言語がC/C++のおよそ100倍高速なのです。

従っていずれ1/100になるでしょう。

397 名前:デフォルトの名無しさん [2015/08/19(水) 11:28:11.15 ID:irPHrK71.net]
C++は良く利用される以前、Cの二倍遅く、Cの二倍のメモリーを使うと言われていました。

これがC++が使われるようになった理由の一つです。

Objective-Cは逆に、Cの二倍速く、Cの二倍省メモリーだったのです。
従ってその時点でObjective-Cは負けていました。

過剰な宣伝が通用するのは、誰も使っていなかったからなのです。

関数型言語がC/C++の100倍まで高速化したのは、本当の本当に誰も使っていないからでしょう。

398 名前:デフォルトの名無しさん mailto:sage [2015/08/19(水) 12:45:01.27 ID:yS+hRb+C.net]
>>385
うまいことを言う!

これコピーして保存しとくぜ。

399 名前:デフォルトの名無しさん [2015/08/19(水) 23:06:26.12 ID:EEfFXLQD.net]
威勢の良い宣伝も糞も実際に使われてるだろ

400 名前:デフォルトの名無しさん mailto:sage [2015/08/20(木) 06:59:05.01 ID:cFwOLAtj.net]
スカトロを基準にして
うんこは食べ物ですって言うようなもん

401 名前:デフォルトの名無しさん mailto:sage [2015/08/20(木) 10:35:31.02 ID:PsQjKp/h.net]
jbbs.shitaraba.net/netgame/14889/
ここに「おはむぅ('ω'`)」って書きこんで

402 名前:デフォルトの名無しさん [2015/08/20(木) 12:12:44.84 ID:5WCLlVT0.net]
>>394は発達障害

403 名前:デフォルトの名無しさん [2015/08/20(木) 17:13:17.66 ID:5F2FSsFe.net]
仕事でscalaとかscalaZとか使っとるから再帰や関数型が非実用的って言われると??ってなる

404 名前:デフォルトの名無しさん [2015/08/20(木) 17:14:14.66 ID:5F2FSsFe.net]
あと別にそんなに高速性強調されるか?

405 名前:デフォルトの名無しさん mailto:sage [2015/08/20(木) 17:42:02.04 ID:vSASgIXr.net]
オレ、 「再帰関数が好き」って言ったら、 笑う?



406 名前:デフォルトの名無しさん mailto:sage [2015/08/20(木) 17:42:58.19 ID:2qNm8QiI.net]
>>397-398
関数型でも単純再帰はgotoみたいなプリミティブな構造だから
構造プログラミングにおけるwhileやforに相当するrecursion schemes使えって言われてるじゃん
(例:catamorphismはfoldに相当するなど)
recursion schemes含めて再帰が有用というなら妥当するけど、どういう論旨で再帰が有用とおっしゃる?

407 名前:デフォルトの名無しさん [2015/08/20(木) 20:45:39.40 ID:5WCLlVT0.net]
無理にfold使って書くより単純な再帰使うほうがわかりやすいなんて幾らでもある
foldやmap使えってのを素人向けに強調するのは構わんが、行き過ぎるのも愚劣

408 名前:デフォルトの名無しさん mailto:sage [2015/08/20(木) 21:03:03.09 ID:2qNm8QiI.net]
残念ながらfoldやmapが使えるなら常に再帰よりそちらを使ったほうがよいと言い切れる
なぜなら再帰で書いた関数は変更に弱いから
おもちゃみたいなコードしか書かないなら別だがね

409 名前:デフォルトの名無しさん [2015/08/20(木) 22:00:29.18 ID:5WCLlVT0.net]
>>402
>なぜなら再帰で書いた関数は変更に弱いから
>おもちゃみたいなコードしか書かないなら別だがね

はあ?

410 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 00:21:00.76 ID:IS5nxfT5.net]
一生ひとりでサンプルプログラム書いてろ
迷惑だから社会に出てくんなよ

411 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 00:25:28.79 ID:D+2gPP3C.net]
>>400
基本的には再帰よりも高階関数というか型クラスに定義してある汎用的な関数を使ったほうがいい
同じ事ができるならより弱い力のものを使ったほうがいいし(monadよりapplicative,applicativeよりfunctor)

が型クラスのインスタンス作る時に再帰で実装する時はあるよ

412 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 00:31:28.66 ID:D+2gPP3C.net]
まぁところによりけりでscalaの標準ライブラリのコンテナのコードなんて
while、再代入、ダウンキャストしまくりでとても関数型プログラミングとは言えない

利用者にとってはライブラリが関数型プログラミングで実装してあるかどうかよりも
それを使って関数型プログラミングできる方が重要なんだからいいけど

413 名前:デフォルトの名無しさん [2015/08/21(金) 03:02:31.30 ID:wrsjniww.net]
日常業務で使ってるが、無理にfoldrで書いたりせずに
普通の再帰で書くことは少なくないしお互いに読みやすい
fold厨とポイントフリー厨は同じ箱

414 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 09:15:46.95 ID:TIO5PnJE.net]
>>397
何のお仕事?

415 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 12:24:12.68 ID:+b9Sq2lj.net]
簡単なアルゴリズムも書けないくせに何でもほいほい言語学習に飛びついて尖った知識が身につかない奴を見ると腹が建つ
haskellで探索アルゴリズムも書けない奴はhaskellをいじるのはまだ早い



416 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 16:54:57.68 ID:0U24jQiQ.net]
>>409 すれ違い。消えてよし。

417 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 17:05:56.55 ID:cNm3l2b6.net]
探索アルゴリズムなら高校のころ、
インターネットが普及してない時代に
C言語で実装したことがあるからなぁ。
わざわざ言語変えて実装するまでもないかな。

418 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 19:59:06.06 ID:sO1LNJ7K.net]
言語、ツール、OS、デザインパターンみたいな道具や手法に拘るやつで
凄いと思えるやつに会ったことがない

ただの手段で目的じゃねーからな
目的を達成するために適したものを選んで使うのが道具

419 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 20:11:40.29 ID:D0T0zJ3M.net]
>>412 C/C++でループだけに徹して書く人は凄いと思うけど。
普通だったらもっと高級言語使って、再帰も拘らず自由に使って
楽しようとするでしょう。

420 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 20:23:54.14 ID:DXj+sr9D.net]
再帰を嫌う人って、抽象化が苦手なんだろうね
フィボナッチ数列を例にとると、初項から順番にループを使って計算させることは簡単だけど、
そこから f(n) = f(n-1) + f(n-2) という数式に落とすのが苦手という感じ

421 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 20:25:32.36 ID:106+9rwN.net]
でも一般項で直接計算した方が速くね?

422 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 20:29:42.52 ID:DXj+sr9D.net]
>>415
直接計算した方が速いよ
でも抽象化はバグを作り込みにくくすることを目的にしてるからね
目的が違うとしか言いようがない

ガベージコレクタだってそうさ
プログラマにメモリ管理をやらせないようにしてバグの源を減らしているんだが、
ガベージコレクタが走ってる間は固まってしまうというデメリットがある

423 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 20:37:23.27 ID:106+9rwN.net]
そこで関数型プログラミングですね判ります

424 名前:デフォルトの名無しさん [2015/08/21(金) 21:25:21.72 ID:w5MKuYb1.net]
C/C++の時代はもう終わったんだよ。
GUIならJavascriptの時代だし、サーバーサイドならHaskell一択。
まあそんな時代。

そういうわけで、ウェブブラウザをHaskellで、ウェブサーバを

425 名前:Javascriptで
書いてみよう。
プロの皆、頼んだよ。
[]
[ここ壊れてます]



426 名前:デフォルトの名無しさん [2015/08/21(金) 22:11:12.63 ID:uW+oAt+B.net]
ブラウザをrust
サーバーをscalaで書こう

427 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 22:17:46.51 ID:gulw8KQa.net]
C/C++否定するならGHCのruntimeをhaskellで書きなおしてからにしろ。

428 名前:デフォルトの名無しさん [2015/08/21(金) 22:22:10.87 ID:MAihWaWV.net]
>>420
ブラウザをHaskellで書こう。

429 名前:デフォルトの名無しさん [2015/08/21(金) 22:29:51.21 ID:XU9Q1w5t.net]
>>358
バカはお前だハゲ。
再帰のプログラム見てみろよ。

while (l < h) {
 if (arr[l] < piv) {
  l++;
 } else if (arr[h] >= piv) {
  h--;
 } else {
  swap(arr,l,h);
 }
}

思いっきりループ使ってんじゃねえかwwww

430 名前:デフォルトの名無しさん [2015/08/21(金) 22:31:45.44 ID:XU9Q1w5t.net]
>>355
スタックを使って何が悪い。
ループとスタックこれがハードボイルド。
再帰はただのチンカス。

431 名前:デフォルトの名無しさん [2015/08/21(金) 23:18:43.29 ID:kMLZ+IBA.net]
スタック使ったらスタックオーバーフローするじゃないか!!!
スタック使っといて再帰ダメとはなんだ!!!

とか思ったんじゃないの。

432 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 23:36:53.53 ID:D+2gPP3C.net]
>>408
アドテク

433 名前:デフォルトの名無しさん mailto:sage [2015/08/22(土) 00:38:22.30 ID:xKKBKjQe.net]
スタックオーバーフローするってよりも
リソースの上限見積もりをしない事が問題なんだよな
再帰使ってもリミッタかけて上限界保障すれば別にいいけど
上限下限当ててくと見積もりにくさやパフォーマンスの超劣化が表面化してくるんだよなぁ

434 名前:デフォルトの名無しさん mailto:sage [2015/08/22(土) 01:32:21.16 ID:B3Y3H6bu.net]
>>412
> 言語、ツール、OS、デザインパターンみたいな道具や手法に拘るやつで
> 凄いと思えるやつに会ったことがない

単にお前が凄いやつにあったこと無いだけだろw

お前の言う凄いやつが誰か知らないから、
有名人でいいや。

凄いやつで、言語、ツール、OS、デザインパターンに
拘らないと言ってる奴いるか?

435 名前:デフォルトの名無しさん [2015/08/22(土) 08:06:55.74 ID:qggPju08.net]
それはバトルプログラマー山田のことだな。



436 名前:デフォルトの名無しさん [2015/08/22(土) 08:46:01.92 ID:4IPZDgMf.net]
>>427
>>412は会った事がない。と言ってるだけで、存在しないとは言ってない。
言いがかりつけないように。

437 名前:デフォルトの名無しさん mailto:sage [2015/08/22(土) 09:04:25.73 ID:xKKBKjQe.net]
開発に何を使うかより

製品の性能重視したほうがいいよ
バグ発生率、実行性能、メモリサイズ、消費電力、メンテナンスコスト
こーいうの数値化して客観的に比較して現実と向き合ったほうがいいよ

438 名前:デフォルトの名無しさん mailto:sage [2015/08/22(土) 09:42:53.71 ID:P/XTDL5m.net]
すごい人ほどこだわるんだよな
ただ、すごい人はこだわりを外れたとこでもやっぱりすごいんだけど

439 名前:デフォルトの名無しさん mailto:sage [2015/08/22(土) 11:28:59.69 ID:B3Y3H6bu.net]
>>429
だから、あったことがないだけだろ。って
書いてあるだろ。

例えば、俺だってシューズに拘るやつで
凄いと思えるマラソンランナーに会ったことがない。

440 名前:デフォルトの名無しさん mailto:sage [2015/08/22(土) 11:31:34.10 ID:B3Y3H6bu.net]
>>430
> バグ発生率、実行性能、メモリサイズ、消費電力、メンテナンスコスト
> こーいうの数値化して客観的に比較して現実と向き合ったほうがいいよ

そんなことはわかってる。

どうやってそれを数値化し、どうやってそれを解決するか。
それを口に出して言うことが重要だ。

で、君は、どうやればいいと思う?
「根性で頑張る」は手法ではないよ。

441 名前:デフォルトの名無しさん mailto:sage [2015/08/22(土) 15:57:53.79 ID:gOdxnhpv.net]
再帰について話し合えよ。
クソどもが

442 名前:デフォルトの名無しさん [2015/08/22(土) 15:58:17.75 ID:Nzlin5Sx.net]
再起不能

443 名前:デフォルトの名無しさん mailto:sage [2015/08/22(土) 16:17:27.41 ID:4AYLR5mV.net]
こだわりも何も再帰を使っていけないのは世界のルール!
鉄則!プログラミングの初歩の初歩!


再帰を気にせずに使ってしまうのは
ただの趣味プログラマ。

444 名前:デフォルトの名無しさん mailto:sage [2015/08/22(土) 19:12:47.71 ID:KyZWN2Ug.net]
どういう話になってんのか知らんけど
ツリーコントロールにバインドするデータは再起で扱うしかないだろ

445 名前:デフォルトの名無しさん [2015/08/22(土) 19:57:12.11 ID:4IPZDgMf.net]
数学的帰納法で落ちこぼれたガイジが暴れてるだけ。



446 名前:デフォルトの名無しさん mailto:sage [2015/08/22(土) 22:48:47.92 ID:8n3Hy4+Y.net]
数学ぽいと思って使っちゃうのね

447 名前:デフォルトの名無しさん [2015/08/22(土) 22:51:07.69 ID:XZXv5ALV.net]
マトモに大学で数学教育受けたことあると再帰に抵抗がなくなるのは事実

448 名前:デフォルトの名無しさん [2015/08/22(土) 23:39:22.15 ID:Nzlin5Sx.net]
深さ方向の見積もりが常に出来るなら再帰は便利
見積れないなら危険だから使わないか例外吐くようにするべき

ループと等価だからループで置き換えろっていう人もいるが
ループにしたからと言って危険が0になる訳ではなく
どのみち例外を吐く必要がある

449 名前:デフォルトの名無しさん [2015/08/22(土) 23:45:35.99 ID:XZXv5ALV.net]
それは再帰の問題じゃなくて例外処理の問題

450 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 00:46:58.86 ID:cJWS/2ha.net]
再起で扱うしかないなんて発想が出ること自体
数学的論理的思考を欠いている。


情報処理のまともな思考力があれば
ループにし、かつ危険を0にしたコードを作成すべき。

451 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 01:57:15.79 ID:vCSJ96fF.net]
再帰に親でも殺されたのかこいつは

452 名前:デフォルトの名無しさん [2015/08/23(日) 01:59:37.69 ID:myL1fwDZ.net]
計算の本質が再帰にあることを知らない子はねえ…

453 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 03:53:30.61 ID:dUB2+H1B.net]
抽象化ができない子なんだろ

454 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 08:40:52.24 ID:F/ISrncw.net]
関数呼び出しコンパイルして出てくるのはジャンプなんだから
手間は別としてループと条件分岐に置き換えられないわけがない
ループのほうが常に簡単って言ってるやつは
もっと深いアーキ寄りの事を考えてるから簡単と感じるんだろ
抽象化や数学レベルの話ではない

455 名前:デフォルトの名無しさん [2015/08/23(日) 09:09:45.85 ID:hZLJ7+aO.net]
>抽象化や数学レベルの話ではない

そもそも等価なんだから
機械的に置き換える万能な方法があるから
「簡単だ」って言ってるんじゃね



456 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 09:36:44.01 ID:4UX4HcJn.net]
最底辺はループやジャンプで。
それより上位層になると人間様が読み書きし易い再帰で(最適化は底辺に任せる)。
もっと上位になるとループも再帰も使わず、誰かが用意した高階関数を使うだけ。

ってので合ってる?
自分で高階関数書くときは、ほとんどループで、たまに再帰。

457 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 09:47:58.57 ID:dUB2+H1B.net]
>>447
> もっと深いアーキ寄りの事を考えてるから簡単と感じるんだろ
そんなのは本来は機械にまかせること
高級言語はそういう考えを排除するようにできてきたんだからね
アーキのこと考えてやるならアセンブラ使ってレジスタのことでも考えておけばいい

458 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 09:53:47.88 ID:F/ISrncw.net]
世の中にはハード屋に
理論上最高性能の高級関数を作ることを要求される最底辺が居てな
オプソの大半は環境依存なくしてぬるく作ってあるから
実装としてはまだ最底辺ではないよ

459 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 09:58:49.19 ID:btbbls/X.net]
再帰が問題なのはスタックオーバーフローこの一点のみだよ。

460 名前:デフォルトの名無しさん [2015/08/23(日) 10:35:42.23 ID:hZLJ7+aO.net]
スタックを使わずに再帰すればいいだけ

461 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 15:29:52.83 ID:vCSJ96fF.net]
全部トランポリン化しよう(提案)

462 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 15:51:18.07 ID:FI0qqD1g.net]
スタックって今でも固定なの?
最近は動的にスタック領域増えたりしないの?

463 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 16:21:24.92 ID:nWiiCp/4.net]
保守性と可読性が高いならどんなコード書いてもいいよ
再帰だろうとgotoだろうとかまへんよ

464 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 17:58:27.10 ID:2tV8XcQZ.net]
コンピュータの本質は関数じゃなくてオートマトンなんだけどな

465 名前:デフォルトの名無しさん [2015/08/23(日) 19:17:08.80 ID:myL1fwDZ.net]
>>457
計算論の話なら抽象的なレジスタマシンでミニマルな計算可能関数のセットを
作り上げた後はレジスタマシンのことはまったく気にしないものだけどな



466 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 20:04:00.55 ID:5 ]
[ここ壊れてます]

467 名前:Eh/eQsv.net mailto: 再帰を毛嫌いするのは学が足りない
破壊的代入を毛嫌いするのは経験が足りない
[]
[ここ壊れてます]

468 名前:デフォルトの名無しさん [2015/08/23(日) 20:16:52.93 ID:c9xDZ4H5.net]
>>459
どっちつかずのタマムシ野郎はやる気が足りない?

469 名前:デフォルトの名無しさん [2015/08/23(日) 20:17:46.05 ID:c9xDZ4H5.net]
再帰で実装するクイックソートって全然クイックじゃないからな
あれクイック詐欺だからな

470 名前: ◆QZaw55cn4c mailto:sage [2015/08/23(日) 22:05:58.40 ID:GHcBJPT0.net]
>>461
??
でも,再帰は非再帰よりも遅いかもしれないようだね‥意外だ
codepad.org/4B8PijgI 再帰
codepad.org/AGfYeUmV ループ

471 名前:デフォルトの名無しさん [2015/08/23(日) 23:08:33.07 ID:c9xDZ4H5.net]
>>462
だぁかぁらぁ再帰でループ使ってんじぇねえぞカスこら

for (;;) {
 while (f(pi, pivot) < 0)
  pi += size;
 while (f(qi, pivot) >= 0)
  qi -= size;

 if (qi < pi)
  break;

 swap(pi, qi, t, size);
}

全部再帰で実装しろや卑怯者

472 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 23:18:14.86 ID:cJWS/2ha.net]
高速処理を再帰で実装したらダメなんてことも知らんのか。
プログラミングの常識を欠き過ぎ。

473 名前: ◆QZaw55cn4c mailto:sage [2015/08/23(日) 23:28:45.86 ID:GHcBJPT0.net]
ふーん,常識なんだ‥
ニ方向に再帰する構造をループに書くのは大変だな‥
平衡ニ分木なんかどうすればいいのだろう‥

474 名前:デフォルトの名無しさん [2015/08/24(月) 00:02:19.68 ID:lwCfvpYi.net]
>>465
FreeBSDもLinuxも.NETもJavaも二分探索木(赤黒木)はループで実装されとりますがな

475 名前:デフォルトの名無しさん mailto:sage [2015/08/24(月) 00:21:55.88 ID:rSFKQba3.net]
>>458
こういうバカ



476 名前:デフォルトの名無しさん mailto:sage [2015/08/24(月) 09:13:29.48 ID:pjiRa/zc.net]
>>422 >>423 を絶滅危惧種として虚勢して動物園にいれとけ

477 名前:デフォルトの名無しさん mailto:sage [2015/08/24(月) 09:13:40.03 ID:X6qu577D.net]
>>465
スタックに積むコストを舐めすぎている

478 名前:デフォルトの名無しさん mailto:sage [2015/08/24(月) 10:54:15.45 ID:r4N2Q7ij.net]
>>462
そのコードじゃ重くて当然だと思うが
1処理単位のmalloc呼び出しが再帰は3回、ループは1回
そこ同じ数に直せばほぼ変わらないと思う

479 名前:デフォルトの名無しさん mailto:sage [2015/08/24(月) 13:27:36.75 ID:nAv/Kj8Z.net]
ループ処理方式では、メモリの確保・開放は最初と最後のみにすべき。

途中の処理でメモリの確保・開放をしないことで、望ましい高速処理が実現される。

480 名前:デフォルトの名無しさん mailto:sage [2015/08/24(月) 15:15:24.35 ID:zrEdzFeo.net]
スタックも再帰前にあらかじめ確保しておけば最強

481 名前: ◆QZaw55cn4c mailto:sage [2015/08/24(月) 21:17:22.61 ID:YG1kZeuQ.net]
>>470
なるほど

482 名前: ◆QZaw55cn4c mailto:sage [2015/08/24(月) 21:20:07.14 ID:YG1kZeuQ.net]
再帰版(かきなおし)codepad.org/U7f45Ah0
ループ版(再掲載)codepad.org/xvNqmIcZ

若干再帰版の方が早いようだ,スタックポインタはレジスタ一個で管理できるから軽いんだね

483 名前:デフォルトの名無しさん mailto:sage [2015/08/24(月) 21:55:55.71 ID:nAv/Kj8Z.net]
ループ処理方式の長所は
1処理単位のmalloc呼び出しを無しにできることなんだから
あってはダメ

484 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 00:51:04.35 ID:uonxIY7X.net]
そりゃ高速処理を突き詰めればループの方がいいに決まってる
再帰は問題をより小さい問題に分割することによってアルゴリズムを分かりやすくして
バグを混入しにくくすることが目的なんだから、速度はハナから求めてないしね

485 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 01:42:50.39 ID:pfa9oRBx.net]
逆に言えば、再帰を使ってもアルゴリズムが
わかりやすくならないなら使う意味もないし、
単に速度が遅くなるってだけなわけさ。



486 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 01:53:24.89 ID:bwlYR2I5.net]
まぁでもあれだよな
リストに関して言えば、リンクリストは重いので配列を使う
配列を使うと自ずとループ処理が多くなるわな

487 名前:デフォルトの名無しさん [2015/08/2 ]
[ここ壊れてます]

488 名前:5(火) 03:17:22.19 ID:36oEPfes.net mailto: 配列がリストの代替になるわけがないだろ
データ構造としての性質がぜんぜん違う
[]
[ここ壊れてます]

489 名前:デフォルトの名無しさん [2015/08/25(火) 03:47:16.58 ID:dXp7EQvt.net]
再帰自体がバグ。

490 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 07:19:29.79 ID:bwlYR2I5.net]
>>479
そのとおり
ほとんどの場合で配列の方が早い
だから配列を使う

491 名前:デフォルトの名無しさん [2015/08/25(火) 09:33:09.51 ID:36oEPfes.net]
はあ。配列のコストも理解してないとは…
なんでマトモにプログラム書いたこともないような奴ばっかりなんだ

492 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 09:47:35.65 ID:zI10HmeA.net]
>>482
バカはおまえだけ

493 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 15:43:56.61 ID:YISO+qUP.net]
>>482 「俺、息の吸い方知ってるんだよ。」っていう君みたいなのを誰も相手にしていないだけだ、「息の吸い方も分かりませんが、狩りがしたいです!」っていうほうがマシ、あるいは釣りであることを悟れ

494 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 19:31:30.11 ID:eVT/tzv+.net]
>>484
いやそれはおかしい例えだろ
そこで師範代から正しい呼吸法を学ぶ流れだぞ

495 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 20:16:14.30 ID:YISO+qUP.net]
>>485 この板やネット社会のどこに師範がいるんだよw必要な情報は全部上がっているんだよ、それを共有するかしないかだろ



496 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 20:34:31.94 ID:bwlYR2I5.net]
つまりお前らのような存在は、
リンクリスト使わずに配列使っとけば良いってこと
配列使っとけば、ループ処理に再帰を使おうって、
考えも浮かばなくなる
ほとんどの場合で良好なパフォーマンス
可読性もバッチリ

497 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 20:44:07.68 ID:uonxIY7X.net]
> 可読性もバッチリ
ここは違うよね

ループを使うということは手続きを追わないといけない
再帰なら定義をそのまま書ける
どちらが可読性がいいかどうかは言わずもがな

498 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 20:52:22.67 ID:zI10HmeA.net]
可読性は比較の問題じゃあない。
非実用的な再帰方式は採用できないのだから
実用的なループ方式を使うしかない。

ループ方式のコードは、より複雑になるとしても
読むことが困難なものではない。

プログラマに少し経験があれば、
再帰方式から安全で高速処理のできるループ方式に
自分で変更できるレベル。

499 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 20:55:10.03 ID:bwlYR2I5.net]
>>488
配列のループに再帰を使うのwwwww
それって読みやすいわけ?

500 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 20:57:06.79 ID:uonxIY7X.net]
>>489
> 再帰方式から安全で高速処理のできるループ方式に
> 自分で変更できるレベル。
変更できてもその結果バグを埋め込んだりしたら無意味
そうならないために可読性は重視されるんだから

501 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 21:02:19.58 ID:bwlYR2I5.net]
配列のループに再帰使うのは、可読性が良いわけ?
俺はリンクリストなんぞ使わずに配列使えっていってるわけで
ランダムアクセスできて便利

502 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 21:05:07.20 ID:bwlYR2I5.net]
しかも今風の言語だと、大体コレクションがあって、
range-based for が有るのに、
何でわざわざ再帰で書くwww

503 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 22:16:19.86 ID:zI10HmeA.net]
>>491
プログラマに少し経験があれば、
分かりやすくループ方式に直せるはず。

バグを埋め込まないレベルで
埋め込まれたバグが同僚が発見しやすいレベルで

504 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 22:36:15.41 ID:JZwUbwZb.net]
最近の高級言語はforeach楽すぎよね

c/c++はくそいんだけど
どうせガチの実装するときだからあっても使わないどころか
ユニットで固めるから可読性とメンテナンス性はガン無視だわ

505 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 01:11:58.96 ID:fE8RXalP.net]
foreachはクソイのでmapとかfilterとか使おう



506 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 01:31:34.12 ID:5P6ATqZc.net]
再帰はクソイのでmapとかfilterとか使おう

同じ理論が成り立つから無意味だ

507 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 01:34:29.40 ID:fE8RXalP.net]
結局適切な使い分けが必要って話になる

508 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 01:52:36.91 ID:eIiWuCWx.net]
C++にもfor_eachあるし、再帰でmap使っても再帰になるだろ…

509 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 03:45:39.29 ID:tWuWD3CH.net]
>>475
>>474 でみたように,

510 名前:クイックソートのような再帰アルゴリズムをループ処理で記述すると malloc()/new の発生は回避できない []
[ここ壊れてます]

511 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 03:46:52.92 ID:tWuWD3CH.net]
>>476
>>474 でみたように「ループ処理の方が早い」とは必ずしもいえない.
再帰で記述したほうが速度が出る場合も結構あるのでは?

512 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 03:49:21.29 ID:tWuWD3CH.net]
>>482
最近急に「std::vector 一択だ!」論者が増えているようで‥

513 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 05:07:16.18 ID:CDX3RzQS.net]
>>500
ぼけ!
まだ書き直してねえじゃねえか。
さっさと1処理毎のメモリ確保解放をしない
ループ処理の通常版に直せ。

これを知らんのはお前が病的な世界にいるからだ。

514 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 07:31:12.39 ID:pCUEXLgh.net]
>>501
呼び出しオーバーヘッド削り込む実装しなきゃ
ループのほうがはやくはならんよ

OSSでもまともなのはそーいう実装になってるよ

515 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 07:39:26.46 ID:nL2sda9W.net]
>>500
> >>474 でみたように,クイックソートのような再帰アルゴリズムをループ処理で記述すると malloc()/new の発生は回避できない

回避できるでしょ?
最初っから必要になる最大メモリを確保すればいいんだよ。
最大がわからないなら、
そのサイズはスタックの最大メモリと同じ量でいい。



516 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 07:45:06.17 ID:tWuWD3CH.net]
>>503
ちゃんと,処理の頭と終わりで malloc()/free() するだけの構造にしたよ
ニ方向に再帰するクイックソートで,処理中にスタックに出し入れするから,
その分の malloc()/free() を使うのは不可避

>>504
まあそういうことだ‥
このスレのはじめのほうでは再帰のオーバーヘッドはかなり高いことになっていたが,
実はそうでもない

517 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 07:45:54.80 ID:tWuWD3CH.net]
>>505
>スタックの最大メモリ
ってなんだい?C で説明してくれ

518 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 08:06:15.93 ID:CDX3RzQS.net]
>>506
>ニ方向に再帰するクイックソートで,処理中にスタックに出し入れするから,
>その分の malloc()/free() を使うのは不可避

その分の malloc()/free() を使うなボケ
処理毎のメモリ確保解放をしないのが業界標準だ

極端に低レベルなコードを作り出してソートを語るな

519 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 09:03:59.69 ID:nL2sda9W.net]
>>507
スタックオーバーフローしたときの
スタックで使用しているメモリ量のことだよ。

520 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 15:30:14.05 ID:3EJSkE06.net]
続くねぇ。このページで終わる話じゃないの?

https://ja.wikipedia.org/wiki/分割統治法

521 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 20:04:00.33 ID:1FIsj9f5.net]
再帰を使えば分かりやすく書ける
ループを使えば高速化できる

トレードオフなだけだよね
高速化が必要ならループ使えばいいし、そうでもないなら再帰で分かりやすく書けばいい
前提条件がないのにどっちがいいとか決められる話じゃない

522 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 20:57:30.21 ID:tWuWD3CH.net]
>>511
その常識を覆す結果,すなわち
・再帰を使うほうが全般的に軽い,
・ループは分かりやすくない上におもったより重い
という結果が出ているんだよ

523 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 21:01:56.66 ID:nL2sda9W.net]
>>519
訂正

再帰を使えば分かりやすく書けることもある。
ループを使ったほうがわかりやすいことも有る。

ループを使えば高速化できる。

524 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 21:27:00.60 ID:CDX3RzQS.net]
>>512
そんなバカ言ってるのはお前だけ。

さっさと世間で使われているクイックソートのアルゴリズムがどうなっているのか学習しろ。
このスレでさんざん多くのレスで非難されているのに、現実を理解できないお前は重病。

525 名前:デフォルトの名無しさん mailto:sage [2015/08/27(木) 00:24:39.98 ID:D5iVdV3D.net]
クイックソートをピュアに実装する事ってなくって
分割で要素数減ったら別アルゴに切り替えるでしょ
だから関数呼び出しのオーバーヘッドの影響が小さくなるのよ

それもデータ多いと遅いから
ミッションクリティカルに大量のソート回す場合は
パラのradixマージじゃないのか

おれはこう思ってたんだけど俺の認識間違ってる?



526 名前:デフォルトの名無しさん mailto:sage [2015/08/27(木) 02:53:00.07 ID:rEYgAb/R.net]
>データ多いと遅いから
まともなループ版

527 名前:のクイックソート使えばいいのに []
[ここ壊れてます]

528 名前:デフォルトの名無しさん mailto:sage [2015/08/27(木) 03:36:13.50 ID:4wYo+P+Y.net]
>>514
クィックソートするのに,データ数の前提をたててその分のメモリを先に確保するのか?
それが世間でやっていることなのか?
Cのライブラリ関数 qsort() で行われていることなのか?

529 名前:デフォルトの名無しさん mailto:sage [2015/08/27(木) 03:40:39.00 ID:zsRIAfpU.net]
二つのメモリ内容の
入れ替えしか行ってないのに、
なんで別にメモリを確保しなきゃいかんのだ?

530 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2015/08/27(木) 03:48:48.52 ID:oqQcnINP.net]
二重再帰のお題:
int f(int x,int y) {
if (x > 0)return f(x-1,y)-1;
if (y > 0)return f(x+1,y-1)+3;
return 1;
}
さて、f(3,8)はいくつ?

531 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2015/08/27(木) 03:52:04.42 ID:oqQcnINP.net]
再帰は人工知能と関係がある。

532 名前:デフォルトの名無しさん mailto:sage [2015/08/27(木) 10:07:26.43 ID:1OqAD7+d.net]
再帰は人工知能の研究のためのもの
ソースコードとその処理結果の組み合わせを見るもの

実用的なプログラミングにはC++とか他の言語を使う

533 名前:デフォルトの名無しさん [2015/08/27(木) 23:36:19.60 ID:3Gk4Wjfj.net]
2週間くらい見てなかったけどずいぶんまともになったね。
MISRA-C だの 2chコーディング規約だのと叫んでた人達はどこに行ったの?

>>517
gcc qsort.c
でググれば出てくるから見てみたらどうかな。

534 名前:デフォルトの名無しさん [2015/08/27(木) 23:44:42.40 ID:3Gk4Wjfj.net]
ごめん、間違えた。URL 書くよ。>>163 に書かれてるのと同じだけど。
https://github.com/lattera/glibc/blob/master/stdlib/qsort.c

535 名前:デフォルトの名無しさん [2015/08/28(金) 00:07:34.86 ID:X6i2EJ+K.net]
glibc qsort.c
でググればいいらしい。



536 名前:デフォルトの名無しさん [2015/08/28(金) 01:56:03.91 ID:5JQ0ubd6.net]
クイックソートは問題を分割して各々を解くだけだからループでも簡単なんだよ。
再帰処理をループにしても読みにくくならないって言う人は、竹内関数を再帰呼び出し無しで書いてみること。
書けない人は議論に参加する資格無し。

537 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 02:00:35.89 ID:k07is2fO.net]
竹内関数は実際には使われないので何とも
実際にもっとも使われるデータ構造は配列です
配列のループに再帰を使うのはナンセンスです

538 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 05:01:09.44 ID:Ox2JHydA.net]
>>525
まだ勘違いしてるの?

ループでも簡単なものを
わざわざ再帰で書くんじゃねーよって
話をしてるんだが。

539 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 06:01:37.78 ID:uG+DCu7f.net]
>>522
man ばかりでてくるんだけど‥

540 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 10:15:07.18 ID:McJH/vOC.net]
ループでも簡単なものを
わざわざ実用性のない再帰で書く

再帰キティ害は、どこまで病的なんだか・・

541 名前:デフォルトの名無しさん [2015/08/28(金) 21:21:58.14 ID:5JQ0ubd6.net]
>>527
ループで簡単に書ける問題でも
再帰で「もっと」簡単に書けるなら再帰で書くよ

542 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 21:27:38.78 ID:McJH/vOC.net]
>>530
脳みそ腐ってる

再帰のベンチマークでいつまでも遊んでろ

543 名前:デフォルトの名無しさん [2015/08/28(金) 21:30:07.36 ID:5JQ0ubd6.net]
>>531
GOTOで簡単に書ける問題でも関数使うのと同じだよ

544 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 21:33:32.50 ID:k07is2fO.net]
もっともよく使うデータ構造は配列です
配列のループに再帰を使うのはナンセンスです

545 名前:デフォルトの名無しさん [2015/08/28(金) 21:35:35.21 ID:5JQ0ubd6.net]
もっともよく使うデータ構造は木です
木の探索にループを使うのはナンセンスです



546 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 21:35:43.99 ID:p8e2JvhL.net]
リンクリストを使った方が簡単になるならそうするよね

547 名前:デフォルトの名無しさん [2015/08/28(金) 21:36:22.40 ID:5JQ0ubd6.net]
1+2*3+4*5-6/7*8+9*10

木です

548 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 21:37:14.01 ID:k07is2fO.net]
木構造よりも配列の方がよく使います

549 名前:デフォルトの名無しさん [2015/08/28(金) 21:38:08.70 ID:5JQ0ubd6.net]
>>537
それは単価の安いエンジニアだからです

550 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 21:38:50.59 ID:p8e2JvhL.net]
何でもかんでも配列を使う方がどうかしてる
問題によってデータ構造を選ぶのが適切

551 名前: []
[ここ壊れてます]

552 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 21:39:52.00 ID:k07is2fO.net]
>1+2*3+4*5-6/7*8+9*10

>木です

これの面白い点は、
通常パーサで再帰下降型など再帰が使われることは無いということです

553 名前:デフォルトの名無しさん [2015/08/28(金) 21:42:13.29 ID:5JQ0ubd6.net]
gotoが使われます

554 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 21:43:36.30 ID:k07is2fO.net]
なんでも配列を使うとはいっていません
もっともよく使われるデータ構造は、配列だと言っているだけです
もっともよく使われるデータ構造である配列のループに
再帰を使うのはナンセンスです
配列を良く使うことと、ループ分を良く使うことは、同義と言って良いでしょう
配列はよく使われるので、ループも良く使われます

555 名前:デフォルトの名無しさん [2015/08/28(金) 21:46:23.84 ID:5JQ0ubd6.net]
配列が命令を格納したものなら通常はgotoで飛びます。ループのようなオーバーヘッドの大きな処理は使われません



556 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 21:48:29.35 ID:3pAHpuiu.net]
1+2*(3+4*(5-6))/7*(8+9)*10!

557 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 21:58:33.93 ID:k07is2fO.net]
一般的にプログラムでもっともよく使われる構造的なデータといえば、文字列でしょう
文字列の表現には配列が適しています
つまり、配列はとても沢山使われるということです
配列の操作にはループ文が適しています
配列で表現された文字列に対して、
strlenなどの文字列操作を再帰で実装するのはナンセンスです
つまり、ループ文はとても沢山使われるということです

558 名前:デフォルトの名無しさん [2015/08/28(金) 22:03:28.46 ID:5JQ0ubd6.net]
一行目が違います

559 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 22:23:58.40 ID:bBNOiFa3.net]
>>546
正しくはなに?

560 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 23:01:39.79 ID:p8e2JvhL.net]
>>542
ちなみにScalaとかでは配列を使うのはパフォーマンスを求めるときぐらい
ふつうに順序づけられた集合を表すのはList(という名のリンクリスト)だよ

561 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 23:10:55.11 ID:bBNOiFa3.net]
Scalaというよく使われない言語を持ってこられても困るよなw

562 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 23:14:12.40 ID:p8e2JvhL.net]
え?よく使われてるよ?
Twitterとか、日本でもドワンゴとかね

563 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 23:14:42.73 ID:bBNOiFa3.net]
それ以外では使われてない。

564 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 23:15:03.90 ID:cjHddNQ+.net]
お前らはLispを書かんのか?
業務でぇとか、しみったれたこと言うなよ。

565 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 23:15:34.96 ID:bBNOiFa3.net]
業務以外なら書くよ。



566 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 23:19:28.80 ID:p8e2JvhL.net]
他にもいっぱい使われてるよ
ちょっと調べれば出てくる

567 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 23:25:39.66 ID:cjHddNQ+.net]
Lisp書くなら、配列の何とも言えない不自由さに辟易しているのでは?
ただしループは認める。やはりスタックが...

568 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 23:32:38.56 ID:bBNOiFa3.net]
>>554
githubのランキングを見たが少なかったぞ。

そんなデータ信用できねーよと言うのなら、
それはそれでいいが、それなら君が信用できて
誰でも検証可能なデータを示すべきだ。

569 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 23:48:40.83 ID:k07is2fO.net]
配列はランダムアクセスが出来て便利
リンクリストはランダムアクセスが出来ないので不便
なので、配列の方が、より、汎用性のあるデータ構造といえます
使い勝手のいいデータ構造を採用する事は、可読性に繋がります
一般に配列は、挿入、削除、リサイズが遅いとされていますが、
単に、そういう風に対立構造にして、場合に応じて使い分ける風に言ったほうが、
かっこいいから、そう言っている、というだけです
例えば、クリエイティブならMac、という紹介文章みたいなもんです
リンクリストにも華を持たせてあげましょう、というだけです
配列の挿入、削除、リサイズは、そこまで遅いわけではありません
memcpy memmoveはカリカリにチューニングしてあり、とても速いです
CPUのキャッシュに乗りやすい処理であるのもポイントです
最近のPCのメモリ帯域を確認してください
対して、リンクリストのランダムアクセスは、とても重いです
CPUのキャッシュに乗りにくい処理です

570 名前:デフォルトの名無しさん [2015/08/29(土) 00:15:20.73 ID:hP/roqxQ.net]
いつから配列のリサイズが重くなくなったんだw

571 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 00:41:01.81 ID:bUE2FMpc.net]
メモリ確保・解放の重さは、回数が問題

処理中にメモリ確保・解放しまくるデータ構造は、

572 名前:とんでもなく重い。 []
[ここ壊れてます]

573 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 00:44:15.53 ID:haT66cVy.net]
スタックとか関数呼び出しのために
メモリ確保・解放してるからなぁ。

574 名前:デフォルトの名無しさん [2015/08/29(土) 00:52:02.37 ID:abZzEG6q.net]
プログラム関係について語り合うならBeLongs!がおすすめ。
よかったら、「blngs」で検索してみて!

575 名前:デフォルトの名無しさん [2015/08/29(土) 02:02:43.87 ID:TLrhTEkt.net]
>>559
せやろか?
俺の経験では処理の遅さはメモリ確保の回数よりも
メモリのサイズに比例する。



576 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 02:06:54.96 ID:g5UyIGYz.net]
俺の経験では、
処理の重さはメモリ「開放」の回数に比例する
無論C/C++のfree/deleteの話だが

577 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 02:32:09.50 ID:haT66cVy.net]
メモリ確保って言っても律儀に
指定したメモリを毎回確保・解放してるわけじゃないからな。

ある一定サイズをどかんと確保して、
ちょこちょこ割り当てて使用している。

578 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 02:45:20.83 ID:g5UyIGYz.net]
ドカンと確保せず、毎回OSのページサイズ単位で確保した方が早い
WindowsならVirtualAlloc これは速い
mallocなどドカンと確保して、ちょこちょこ割り当てる、これが全く重い
正確には割り当てるのは速い 解放がとてつもなく遅い

579 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 03:55:56.31 ID:VNb5NXe3.net]
メモリの確保/解放を考える時点でなんか違うよ

もちろん、そこまで考えなきゃいけない分野はあるし、そういう分野で再帰を使うのは間違ってると
思うけど、一般の人間はそこまで考えなくていいからね

580 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 06:20:13.75 ID:sPvi53Zp.net]
メモリの確保/解放を考えないなんてもう論外。

プログラマとしてまともな仕事を扱うこともなく
任されることもない、
いい加減なコードを書くだけで信用も期待もされない。

これ一般じゃあない。

581 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 06:48:33.39 ID:e0Hg3/HL.net]
配列などない
ポインタがあるだけだ

582 名前:デフォルトの名無しさん [2015/08/29(土) 06:54:58.07 ID:hP/roqxQ.net]
世の中にはC言語以外の言語もあるのよ

583 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 13:05:13.99 ID:VNb5NXe3.net]
>>567
そこまで考えなきゃいけない分野があるのは事実だが、それをマニュアルでやる分野はレア

マニュアルでやってたら絶対バグるから、モダンな言語にはガベージコレクタなどの技術が
採用されてるんだしね

584 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 13:57:09.93 ID:7eeJLuGb.net]
>>531 ワロタ。お前道具もまともに使えない社畜だな、もう別のとこ行くか、黙ってみてろ

585 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 17:10:01.35 ID:g7aWBHc9.net]
別に再帰だから再帰じゃないからなんだって思うが



586 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 18:43:39.65 ID:g7aWBHc9.net]
>>568
アドレス演算≠ポインタ演算

587 名前:デフォルトの名無しさん mailto:sage [2015/08/30(日) 14:09:15.19 ID:PCX+Z6xE.net]
>>559
calloc?…

588 名前:デフォルトの名無しさん mailto:sage [2015/08/30(日) 14:09:53.80 ID:PCX+Z6xE.net]
>>574
ごめんなさい誤爆しました

589 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 01:14:01.81 ID:t91IYFQ3.net]
>>542
いやいや
スクリプト言語だと配列という名前でもハッシュだったりするし
最近は配列を多用するのはc/c++(c++あんま知らんけど)くらいだと思うんだけど
javaでもなるべくコレクション使うようにするし

590 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 01:16:56.25 ID:t91IYFQ3.net]
配列はデータの追加や削除の効率が悪いデータ構造だし
immutableに向いてないからキツイ

591 名前:デフォルトの名無しさん [2015/09/01(火) 02:05:52.14 ID:DJMTd98b.net]
"スタックオーバーフロー" "クイックソート" site:.ac.jp
でググったら、とっても残念なページを見つけてしまった。
素人ならまだしも、T 大学の N 先生、あなたがそんなことじゃだめでしょう。
クイックソートがスタックオーバーフローするのは recursive call のせいではありませんよ。

592 名前:デフォルトの名無しさん [2015/09/01(火) 02:14:07.76 ID:6K59ZHF3.net]
>>577
その人、たぶん、なんでデータの追加や削除の効率が悪いのかもわかってないのでは、と。

593 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 03:08:24.61 ID:ucFEbRDO.net]
>>577
その人、たぶん、配列=メモリに連続して固定長のデータが並んでいるもの
それ以外は認めない。という間違った考え方をしてる。

594 名前:デフォルトの名無しさん [2015/09/01(火) 03:11:38.75 ID:Uqk8gU8P.net]
>>578
recursive call のせいですよ

595 名前:デフォルトの名無しさん [2015/09/01(火) 03:12:23.69 ID:Uqk8gU8P.net]
>>580
間違ってないですよ



596 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 03:14:38.29 ID:ucFEbRDO.net]
>>582
やっぱり固定長データが連続で並んでるものしか
認めないと思ってるのかw

明らかに間違ってるぞ。
C言語以外の言語の話をしようか?

597 名前:デフォルトの名無しさん [2015/09/01(火) 03:29:20.63 ID:6K59ZHF3.net]
連続じゃなくてもいいけど(しかもハッシュじゃなく)アクセスがO(1)な
アドレスマッピングの方法を使ってる言語なんかあるの?

598 名前:デフォルトの名無しさん [2015/09/01(火) 03:29:25.49 ID:Uqk8gU8P.net]
>>583
C言語以外じゃないと都合が悪いのか?
じゃあC言語でお願いします

599 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 03:30:24.33 ID:ucFEbRDO.net]
>>585
あ、C言語限定じゃないと困るんだw

600 名前:デフォルトの名無しさん [2015/09/01(火) 03:32:07.57 ID:Uqk8gU8P.net]
>>586
はい、基本C言語でお願いします
よろしくお願いいたします
配列=固定長データが連続で並んでる
これでいいですね

601 名前:デフォルトの名無しさん [2015/09/01(火) 03:32:28.71 ID:Uqk8gU8P.net]
ふぅ、論破完了

602 名前:デフォルトの名無しさん [2015/09/01(火) 03:32:41.75 ID:6K59ZHF3.net]
単に「配列」って名前の付いてるハッシュの話してるんじゃないかと思う。
そしてそれは(データ構造としての)配列ではない。

603 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 03:33:05.52 ID:C9NG6GGp.net]
配列は抽象化されていないデータ構造なのか?

真にそう言えるのは1ビットのみである

604 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 03:40:53.92 ID:ucFEbRDO.net]
>>587
C言語においては、配列は固定長データが連続で並んでる。
その他の言語ではそうとは限らない
だから"配列"だけで断定することは出来ない。

これでいいですよ。

605 名前:デフォルトの名無しさん [2015/09/01(火) 03:44:11.25 ID:Uqk8gU8P.net]
>>591
C言語はプログラム言語です
つまり、プログラムにおいて配列とは固定長データが連続で並んでるものなんです



606 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 04:07:30.08 ID:ucFEbRDO.net]
わかりやすく言うと

プログラム言語 というカテゴリの中に
 ・C言語
 ・Perl
 ・PHP
 ・Ruby
 ・その他
 などが含まれます。

その中で、C言語では配列とは固定長データが連続で並んでるものなんです

607 名前:デフォルトの名無しさん [2015/09/01(火) 04:14:14.53 ID:Uqk8gU8P.net]
>>593
C言語以外では困るのでC言語でお願いしますと言いました。
いいですか、私はC言語以外では困るんです。
あなたは私を困らせたいのですか?困らせたくないでしょう。
私に同情してください。
配列=固定長データが連続で並んでる
これでいいですね。

608 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 04:19:55.14 ID:C9NG6GGp.net]
>>593
スクリプトだらけなんだが…

609 名前:デフォルトの名無しさん [2015/09/01(火) 04:24:44.91 ID:6K59ZHF3.net]
つうか、C言語のもの以外それみんな名前が「配列」なだけのハッシュ…

610 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 04:33:56.34 ID:ucFEbRDO.net]
配列の実装がハッシュなだけ。
配列だからって、実装まで決まらない証拠。

611 名前:デフォルトの名無しさん [2015/09/01(火) 04:37:44.81 ID:Uqk8gU8P.net]
>>597
ふうむ、たとえば二分探索木の実装に赤黒木やスプレーツリーがあるように
データ構造にも抽象的なものとより具体的なものがあるわけっしょ。
つまり、抽象データ構造としての配列とより具体的なデータ構造としての配列があり、
抽象データ構造としての配列に連想配列が含まれ、より具体的な連想配列のデータ構造として
ハッシュテーブルがあるってことでしょね。

612 名前:デフォルトの名無しさん [2015/09/01(火) 04:57:20.77 ID:6K59ZHF3.net]
データ構造についての普通の教科書読めば
そういう緩い意味で「配列 array」は使わないことがわかるよ。

613 名前:デフォルトの名無しさん [2015/09/01(火) 04:58:46.51 ID:6K59ZHF3.net]
array data structureとarray data typeとの区別をつけようね。

614 名前:デフォルトの名無しさん [2015/09/01(火) 05:04:47.15 ID:6K59ZHF3.net]
細切れに書いちゃってアレだけど、
array data typeはその実装がリストでもいい。
だから、効率性を云々する時のarrayはarray data typeではなくて
array data structureの話じゃなきゃいけない。そしてarray data structureは
インデックスからアドレスへの容易な算術演算によって(典型例が
データの連続配置)、O(1)アクセスを可能にするデータ構造。

615 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 06:38:20.62 ID:lctJDoUS.net]
いや、そんな長々と説明しなくていい



616 名前:諱B
array data structureがO(1)でなければならないというのなら
それを定義したのはどれかを言ってくれればいい。
おそらく無いからそれをごまかすために説明してるんだろうと思ってるけどねw
[]
[ここ壊れてます]

617 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 07:30:15.06 ID:CkpgYLyf.net]
>>594
うわあ、これはマジモンでヤバい人だ…

618 名前:デフォルトの名無しさん [2015/09/01(火) 08:00:49.42 ID:/DoXUIG1.net]
tet

619 名前:デフォルトの名無しさん [2015/09/01(火) 08:05:00.21 ID:/DoXUIG1.net]
メモリの取得、解放なんかは
OS自体にその手の機能が存在してるべきなんだよ
速度をそこまでガチで求めない場合の簡易版で良い

620 名前:デフォルトの名無しさん [2015/09/01(火) 08:11:25.32 ID:KtW8DmAo.net]
ゲーム木探索とかの再帰じゃないとできないことぐらいしか再帰関数でやらない
逆に再帰関数はforやwhileに書き換えできる? 出来るならそっちにしたいレベル

621 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 08:25:26.84 ID:vcgHCiFQ.net]
テンプレートメタプログラミングやC++11のconstexprだと、どうしても再帰使わないと書けないコードでてくる……
あれってなんか解決策あるんですかね……
怠惰なインスタンス化のように無限再帰を回避する方法ならあるけど

622 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 12:55:10.42 ID:4i2DmfPV.net]
>再帰じゃないとできない

まず無い。
再帰でベンチマーク作るのでなければ。

623 名前:デフォルトの名無しさん [2015/09/01(火) 13:38:18.55 ID:DJMTd98b.net]
>>581
君に理解できる話じゃないよ。
クイックソートのスタックオーバーフローを防ぐためと称して
非再帰化しろだのスタックサイズを増やせだのと、
君程度の人なら言うかもしれないが、大学の先生がそんなことじゃ困る。
空間計算量の最適化を教えなさいよという話だ。
それ無しに非再帰化だのスタックサイズだのと言われる学生さんが可哀想だ。

624 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 13:48:33.08 ID:4i2DmfPV.net]
>>609
君ごときの無能にそんなことじゃ困るなんて言われる
先生がかわいそうだ。

625 名前:デフォルトの名無しさん [2015/09/01(火) 15:23:42.04 ID:6K59ZHF3.net]
>>602
data typeじゃなくて data structureとしてのarrayなら下にあるけど?
常識なんで、定数アクセスじゃないadsがあるというならむしろそっちが実例挙げてね

https://en.wikipedia.org/wiki/Array_data_structure



626 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 19:15:05.37 ID:jZfLWulg.net]
大学と共同研究とか外注受けたりとかやったことあるやつは
大学の先生の技術レベルがやばいのは経験してるでしょ

いまさら騒ぐ事でもねーよ

627 名前:デフォルトの名無しさん mailto:sage [2015/09/02(水) 00:47:36.69 ID:kkVdXJxG.net]
サイ基地外は現実を否定することしかできない

628 名前:デフォルトの名無しさん mailto:sage [2015/09/02(水) 17:48:58.50 ID:pfz+JPDH.net]
メモリ上でスラッと並んでるのが配列であって
そうじゃないけど並んでるように見えるのは
あんまり配列とは呼びたくないでござる。

629 名前:デフォルトの名無しさん mailto:sage [2015/09/02(水) 19:19:55.89 ID:DAe+xWqL.net]
組み込みや専用機なら配列と言う概念はいらない

630 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 02:22:06.78 ID:APM+2rA2.net]
位置の並びは関係なく、演算だけで区別できるのが配列
Rubyの配列はRuby用語

631 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 11:36:04.16 ID:hDY8eKzg.net]
こんなにも配列の話題で盛り上がるとは
みんな配列が大好きだね
人気者の配列のループには繰り返し文を使うから
繰り返し文は不滅だね

632 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 11:44:10.96 ID:HOkCudGK.net]
>>614
わかる。配列とコレクションは別だよな。

633 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 12:12:06.19 ID:dGS6eFW0.net]
配列の処理もforじゃなくて再帰で書くんだがやめたほうがいいのかね

634 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 12:26:06.74 ID:hDY8eKzg.net]
>>619
具体的にどんな感じで?

635 名前:デフォルトの名無しさん [2015/09/03(木) 14:27:45.88 ID:9nQXwra1.net]
>>620
head, tail,



636 名前:append さえあれば普通のリストとほぼ変わらん []
[ここ壊れてます]

637 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 15:43:06.69 ID:dGS6eFW0.net]
>>620
hoge(input, output){
  if (size(input) == 0) {
    return;
  }
  return hoge(tail(input), output.append(dosomething(tail(input))));
}

こんなかんじ

638 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 18:02:46.75 ID:IwEVB15/.net]
わざわざ再帰を使うなんてやめた方がいい。

ちゃんとループで書く技術を身につけるべき。

639 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 18:37:19.10 ID:dGS6eFW0.net]
forのほうが手軽なんだけど、しょーもないインデックスミスしちゃわない?
最近はどの言語も範囲forがあるから、まだいいんだが

640 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 19:27:47.89 ID:FSKtVBgW.net]
> forのほうが手軽なんだけど、しょーもないインデックスミスしちゃわない?
あんまりないな。いつも書き方一緒だし。
それ以外の書き方をしていれば「?」となる。

641 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 19:39:17.92 ID:6KaE3e8w.net]
単に慣れの問題

642 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 19:55:45.70 ID:Fz3Ka6Ix.net]
>>624
しょーもないミスをしないためにも再帰は覚えておくべきだね
使いドコロはケース・バイ・ケースだけど
何が何でも再帰を避けるようなことさえしなければいいんじゃない?

643 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 20:37:42.86 ID:FSKtVBgW.net]
>>627
forは範囲forで対応できるけど、
再帰は、範囲再帰ってあるの?w

再帰のほうがしょーもないミス多いよね。
終了条件ミスってスタックオーバーフローw

644 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 21:22:18.75 ID:qp+WFxZL.net]
範囲forに対応するものは高階関数になるんでね?
なんでもできてしまうforよりかは
畳み込み、map,foreach, filterなんかで使いわけたほうがいい

645 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 21:23:50.62 ID:qp+WFxZL.net]
後は >>= , <*>



646 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 22:32:32.63 ID:FSKtVBgW.net]
>>629
> 範囲forに対応するものは高階関数になるんでね?

そんなわけない。
範囲だろうが範囲じゃなかろうがforはfor。

647 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 22:52:40.78 ID:qp+WFxZL.net]
拡張for文はIteratorを実装しなけらばならなかったりforeachメソッドがなきゃいけなかったりbegin/endがなきゃいけなかったりするから
ある程度抽象的だから
whileと同じような単純な構文であるforと同じだって言われると微妙な気持ちになる

オブジェクト指向ありきみたいな

648 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 22:55:55.75 ID:K5TdrWRE.net]
便利だけど本質的には普通のforと同じ。
便利だけど単なるシンタックスシュガー

なにより副作用のために使うものだから
関数型的ではない。

649 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 23:50:51.54 ID:LEFvEBee.net]
問題の解き方を探るときにwholemeal approachをやろうとすると、再帰は宣言的なんでスタート地点にしやすい。
dynamic programmingでやることにしても、最初の明快だけど遅い関数を書くときは再帰が多い。
そっからチューンしていったものが正しいかを検証したいとかよくある。
ので、再帰もループもどっちもある程度便利に使える言語は便利よ。

650 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 07:55:30.31 ID:iLm0cn85.net]
>>633
0点。

651 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 09:21:42.12 ID:QpES+Y0P.net]
宣言的な書き方は、総じて手続き的な書き方よりコードが短くなるため可読性が高い。ただし抽象度も上がるため、読む人を選ぶ可能性がある。

例えば以下の関数定義、手続き的に素直に書こうとするともっと長くなるはずだが、こう書かれても理解できない人もいるかもしれない。

f(n) =
| 0 (n = 0 のとき)
| n + f(n - 1) (n > 0 のとき)
| -f( |n| ) (n < 0 のとき)
なお、n は整数。


俺は宣言的な書き方が好き。

652 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 10:16:03.02 ID:qqcvyIbf.net]
数学における関数の、定義域別の関数定義みたいな書き方っすね

653 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 13:15:00.48 ID:YC3FOSdx.net]
結局、元の定義が再帰的でないと、再帰を使う意味は無いんだよな
プログラミングでもっとも良く使うデータ構造は配列ですし、
配列のループ処理を再帰とみなす必要は無いですし、
繰り返し文であふれるのは自然だね

654 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 17:32:01.47 ID:45GRgS6i.net]
>>635
理由書いてないので無視するw

655 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 18:34:45.30 ID:FR19Rjgq.net]
再帰キティは、理由なんか無く難癖つけるだけのレスばかり



656 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 20:04:17.17 ID:RgFRqfXr.net]
>>638
数学的に突き詰めれば自然数だって帰納的に定義されるものなんだから、
ループは必ず再帰に置き換えられるね(もちろん逆もまた真)

したがって意味がないことはない
あとはどっちが読みやすいかだけの話

モダン言語の流れは手続き的なループをなくして、再帰や高階関数を使う
方向のようだけどね

657 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 20:31:46.45 ID:K7Q0EkNO.net]
再帰とループの違いはなに?
手順をスタックしてるかどうかでしょ

まぁループと再帰を別に考えてる(と言うか感じてる)時点で三流くささがするのだけど

658 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 20:32:19.95 ID:FR19Rjgq.net]
それモダン言語じゃなくて、性能の悪い非実用的な言語なだけ

659 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 20:55:16.54 ID:RgFRqfXr.net]
>>643
最近はマシンスペックが上がってるからね
性能より抽象的な書き方ができるのを求めるようになってるんだよ

性能カリカリに求めたい場合だけCとか使っておけばいい世界

660 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 21:38:09.28 ID:vuZU5Hwi.net]
>>642
> 再帰とループの違いはなに?

ループ・・・小学校で習う(1から10までの数字を足し算しょう等)
再帰・・・高校で習う。(1からnまでの自然数の和を計算式で表す)

661 名前:デフォルトの名無しさん [2015/09/04(金) 21:49:10.66 ID:q06Od88z.net]
>>645
まったく理解できてない……

662 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 21:49:46.26 ID:vuZU5Hwi.net]
>>646
「間違ってる」とは言わないんだなw

663 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 21:54:59.88 ID:K7Q0EkNO.net]
なんかどうでもいいや

664 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 21:59:29.06 ID:vuZU5Hwi.net]
はい、反論も出なかったわけで、
つまりループと再帰ではループのほうがわかりやすいんだよね。

単純なループじゃない場合は、再帰のほうがいい場合もある。
だけどループでいいのならば、ループのほうがわかりやすい。

それは小学生でもループを理解していることからわかる。
(小学生にループというのは、nにn-1を足すのを0になるまで繰り返すとか言ってもわからない)

665 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 22:17:32.25 ID:6Rt4goII.net]
最新の実験的な言語で昔の関数型に回帰して再帰に走ってるの
単に言語開発のネタ切れしてるだけじゃねぇの

開発サイドの人間が必死こいて宣伝してるんだったら気持ちもわかるが
ユーザーだったらもっとマシな言語あるでしょとしか言えない



666 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 22:24:44.42 ID:q06Od88z.net]
>>647
根底から間違ってる、って言えばよかったの?

まず、(((((((((1+2)+3)+4)...+10) は典型的な再帰構造。ループでもなんでもない。

そして和の公式 n*(n+1)/2 は再帰でも何でもない閉じた式表現
(というか、再帰を使わない式にすることこそがその眼目だ)。

667 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 23:01:37.97 ID:vuZU5Hwi.net]
1から10まで足せって
小学生に言って、そんな式書く奴いないなw

普通は
1 + 1 = 2
2 + 2 = 4
4 + 3 = 7
7 + 4 = 11
って計算するんだぜ。

これを10まで繰り返す。
まさにループ

668 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 23:20:57.61 ID:q06Od88z.net]
>>652
それ全然ループじゃないから。

669 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 23:24:17.87 ID:q06Od88z.net]
n-1 までの和に n を足せば nまでの和が得られる、という原理に忠実な計算なんで
再帰以外のなにものでもないんだけど、基礎論触ったことないとわかんないかもね。

670 名前:デフォルトの名無しさん [2015/09/04(金) 23:26:41.39 ID:yf6WF608.net]
>>654
わかったところでカスだけどな。
再帰っていうのは木偶の坊の代名詞。

671 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 23:28:22.98 ID:kQbi8Wuv.net]
一つの見方しかできないのは数学に向いてないよ

672 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 23:29:28.63 ID:vuZU5Hwi.net]
>>653
ループじゃんw

書けば理解できるのか?

int sum = 0;
for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}

これをステップ実行したのが>>652

673 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 23:30:53.74 ID:K7Q0EkNO.net]
おまえら夏休みは終わったんだぞ

674 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 23:33:40.85 ID:vuZU5Hwi.net]
>>658
9月にそれを言うってことは
お前大卒(もしくは在籍)じゃないのか?

675 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 23:43:51.99 ID:RgFRqfXr.net]
>>655
分かったなら再帰が役に立つことぐらい簡単に理解できそうなもんだけどなー
理解できないならわかってないんだよ



676 名前:デフォルトの名無しさん [2015/09/05(土) 00:20:19.44 ID:LWQiKMu8.net]
>>660
ループの方が100億万倍やくに立つ。
再帰は数学に憧れてるだけで数学できない出来損ない野郎が使う。

677 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 00:45:04.95 ID:j+vMQGdO.net]
いや、goto の方が1000億万倍役に立つだろ。

678 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 00:56:03.07 ID:dKM7sd/0.net]
a. 再帰は不要
b. ループは不要
c. どっちも欲しい
d. 言語に合わせる

aとb(いるのか?)に精神病患者がいるせいで、
cの人の投げた話題を勝手にa(あるいはb)の人間の主張と見なして攻撃するのがおかしい。
aに反駁したらループ不要派だとレッテルを貼られ、
bに反論したら再帰理解できない馬鹿とレッテルを貼られるが、そもそもnot a != bだしnot b != aだからな。

再帰関数を作る時は、頭に保持しなきゃならない情報が少ないのがいいよ。
f(n)の定義を使ってf(n)を定義できるイメージ。場合分けだけで済む。
古典的なインデックスを使うforループより、要素を1つずつ取り出すっていうのが明確なforeachが好まれるのも似た理屈だと思う。

679 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 01:09:05.88 ID:dKM7sd/0.net]
あと、再帰はパターンマッチがあると途端に利便性が上がる。
例えばリストの要素を2つ以上必要とする処理を書くとき、OCamlだと
let rec foo acc xs = match xs with
| x :: y :: rest -> foo (do_something x y acc) y::rest)
| _ :: [] | [] -> finish_something
みたいに書けて楽。ループだとインデックスの範囲とか終了条件とか色々考慮しなきゃならんので手間がかかる。

680 名前:デフォルトの名無しさん [2015/09/05(土) 01:13:53.21 ID:LWQiKMu8.net]
>>664
パターンマッチは邪道
ナローイングなキャストを誤魔化してるだけ

681 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 01:22:40.76 ID:9u1zKCQd.net]
邪道でもなんでもないよ
これを邪道とか言ってるのはCとかにどっぷり漬かった人間のただの負け惜しみ

682 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 04:48:42.79 ID:Bq/cKCjD.net]
どっちの書き方も使うからどっちが良いも悪いも邪道もどうもない


ただし再帰のを話題にするなら、一回その楽な書き方で書いてから、正しい書き方に直すような前提の話になる
CPUやメモリを隠してる状態でこの話は有り得

683 名前:ない
再帰かどうかと言うのは、CPUとメモリの使いかた (の人間的な概念) を指すものだから。

この手の話題を出す限りは、Pythonが仕様書兼動作テストで、それを手動最適化して直したのが Cの実装 なんてのも十分有り得る
ま、さらに深くまで考慮するとまったく区別のしようがない同じ物なんだけどね。

ちょっと前に Rubyでしか使えないRuby用語の配列を、まるで本物の配列のように思い込んでた人がいたね。
再帰も再帰でそれと同じ。もちろんループも。
特定の言語内部だけの話ならそちらのスレにどうぞ。
[]
[ここ壊れてます]

684 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 06:52:05.04 ID:BDvTAHGX.net]
>>667
CTMCP(ガウディ本)読んで、計算モデル理解した方が良いよ。

685 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 06:56:36.26 ID:ReU+9sFg.net]
>>668
理解したよ。それでいいたことは何かな?



686 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 06:59:39.65 ID:Bq/cKCjD.net]
わお。まるで俺が返信したみたい。

まぁ俺も同じことを聞こうか
>>668
それで言いたいことはなにかな?

687 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 07:33:00.36 ID:zGjt7Ia9.net]
>>657
おま、戻り値を使いまわしたら基本的に再帰じゃないの?。。。

688 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 07:42:48.23 ID:Bq/cKCjD.net]
うわー
馬鹿しかいねぇ

689 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 07:45:22.49 ID:Bq/cKCjD.net]
失礼。すまなんだ。よけいな発言だった

690 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 08:00:20.87 ID:zGjt7Ia9.net]
//r:ret,s:diff,n:n
int sigma(int r, int s, int n) {
 if (n < 1)return 0;
 if (n == 1) return r;
 return r + sigma(r + s, s, n - 1);
}
int sigma2(int s, int n) {
 if (n < 1)return 0;
 int r = 0, t = s;
 for (n--; 0 < n; n--, t += s) r = r + t;
 return r;
}
戻り値の使いまわしは基本的に再帰

691 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 08:50:03.58 ID:Bq/cKCjD.net]
そこで再帰かどうかは決まらないんだけど。


でもあえてそこで決めるのならば(その話に乗るのならば)、手順 (もしくはそれに相当するもの) を覚えている物が再帰。
sum = sum + i;
これは現在の状態しか保持しない。

構造を検索するもの、…例えばディレクトリとファイル検索で
whileだけを使ったとしても、
出てきたそれぞれのファイル対し、そのアドレスを記録したら、
それは処理における必要資源量の理論最低値は再帰と等価

692 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 08:53:27.64 ID:zGjt7Ia9.net]
そそ、戻り値の使いまわしとスタック保存

693 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 08:59:50.82 ID:zGjt7Ia9.net]
たとえば、シュミレーションゲームでユニットの移動範囲を調べる
とかの全検索は、どうやっても再帰
もちろんA*も再帰

694 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 09:02:33.33 ID:Bq/cKCjD.net]
会話が成り立ってねぇ

695 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 09:03:26.20 ID:zGjt7Ia9.net]
スタック保存の必要がなければループ文でいい



696 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 09:05:10.34 ID:zGjt7Ia9.net]
>手順 (もしくはそれに相当するもの) を覚えている物が再帰。
これがスコープのスタック保存だろ

697 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 09:06:13.64 ID:Bq/cKCjD.net]
あんた
for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}
これを再帰って言ったでしょうに。
これはスタックの保存じゃなくて上書きっつーの

698 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 09:13:54.31 ID:SH0QgRhI.net]
sum=sum+iで
sum+iのsumはスタック保存

699 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 09:20:33.46 ID:SH0QgRhI.net]
まあスタックを「戻す必要がないから」保存して上書きしてるんだろ

700 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 09:21:52.97 ID:Bq/cKCjD.net]
それはスタックじゃねぇ

a = 0;
a = a + 1;
a = a + 2;
以上の三行は再帰とは呼ばない

再帰と言うのは最終段階の55の瞬間に今までの経緯を覚えてて
そこで初めて再帰と必要資源量の (理論最低値の) 釣り合いが取れます。
例えば配列に 1, 2, 4, 7, 11,… と記録したらそこで初めてある側面で再帰と同じ資源量

701 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 09:25:47.84 ID:Bq/cKCjD.net]
いや再帰っつーのは終わるまで必ず自身がどの手順でそこの処理に居るのかが記録されてるから。
必要がないもくそもない

702 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 09:26:38.87 ID:zGjt7Ia9.net]
sum=sum+iで
sum+iのsumはスタック保存値
sum=のsumがスタック保存(+上書き)
こういうのはループでも全然いいけど
スコープスタックを保存する必要があるなら、完全に再帰しかない

703 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 09:29:04.79 ID:Bq/cKCjD.net]
さいならー

704 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 09:40:47.32 ID:zGjt7Ia9.net]
いや再帰っつーのは終わるまで必ず自身がどの手順でそこの処理に居るのかが記録されてるから。
必要がないもくそもない

だから、スコープスタックを保存する必要がある時に、再帰を使う必要があるんですってば

705 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 09:57:57.73 ID:zGjt7Ia9.net]
>>651

>>674
な感じなんだろ

ループは、スコープスタックを保存しなくていい時
再帰は、スコープスタックを保存しなければいけない時
再帰の文字通り、手順の戻り道を、覚えている必要があるかどうかだよ



706 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 10:00:34.66 ID:ReU+9sFg.net]
えー、バカ以外には言うまでもないことだが
スタックというものは、
値のプッシュ(スタックに積む)と
値のポップ(スタックから取り出す)を
行うためのデータ構造です。

これをしていないものは、当然
スタックではありません。

707 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 10:01:42.56 ID:zGjt7Ia9.net]
バカは知りませんが関数呼び出しはコールスタックです

708 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 10:01:59.54 ID:ReU+9sFg.net]
https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF

スタックはコンピュータで用いられる基本的なデータ構造の1つで、
データを後入れ先出し(LIFO: Last In First Out; FILO: First In Last Out)の構造で
保持するものである。抽象データ型としてのそれを指すこともあれば、その具象を指すこともある。

709 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 10:02:49.88 ID:ReU+9sFg.net]
>>691
> バカは知りませんが関数呼び出しはコールスタックです

どこの話をしてるんですか?

710 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 10:03:52.96 ID:ReU+9sFg.net]
再帰というのは、関数の中で
自分自身の関数を呼び出すもののことです。

これをやっていないものは
当然再帰ではありません

711 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 10:12:58.37 ID:zGjt7Ia9.net]
//r:ret,s:diff,n:n
int sigma(int r, int s, int n) {
 if (n < 1)return 0;
 if (n == 1) return r;
 return r + sigma(r + s, s, n - 1);
}
これは全部、スタックに保存されてるよ
だから、
int sigma2(int s, int n) {
 if (n < 1)return 0;
 int r = 0, t = s;
 for (n--; 0 < n; n--, t += s) r = r + t;
 return r;
}
これに比べて、スタック保存分、オーバーロードしているけどね
ユニットの移動範囲とか、画像のフィリングとか、
ある点の周囲探索は、スタック保存の再帰関数にするのが一番いいだろ

712 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 10:16:27.86 ID:zGjt7Ia9.net]
たとえば白黒ドットの囲まれた場所のある点からの塗りつぶしで
ループだけしか使わないバカがいるのか?

713 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 10:19:30.35 ID:Bq/cKCjD.net]
な、
会話するの難しいだろ

714 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 10:21:37.41 ID:ReU+9sFg.net]
>>695
お前は知らないだろうけどね。
関数ないのローカル変数っていうのは
全部スタックに保存されるんだよ。

スタックにデータを保存すれば
再帰という理屈であれば、
ローカル変数がある関数はすべて
再帰ってことになってしまう。

もちろんそんなことはありえない。

715 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 10:21:49.47 ID:zGjt7Ia9.net]
白黒ドットの囲まれた場所のある点からの塗りつぶしで
ループだけしか使わないで作れるなら作ってみろよ
ニヤニヤしながら見ててやるから



716 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 10:26:03.39 ID:zGjt7Ia9.net]
>>698
え?コールスタックが再帰じゃないの?
それじゃ、関数を呼び出した後、元の位置に戻れないぞ

717 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 10:26:17.15 ID:ReU+9sFg.net]
>>699
閉空間の塗りつぶしだね?
検索したあったよ。
もちろん再帰は使っていない

> この改良版アルゴリズムはスキャンライン・シード・フィル アルゴリズム(Scanline Seed Fill Algorithm)と呼ばれています。
fussy.web.fc2.com/algo/algo3-1.htm

718 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 10:27:24.93 ID:ReU+9sFg.net]
>>700
> え?コールスタックが再帰じゃないの?

ぷぷぷ。こいつマジでわかってなかったんだw
お前理屈だと、すべての関数呼び出しが再帰ってことになってしまう。
再帰は、関数が自分自身の関数を呼び出している場合のみ。
お前が言ってるのは、単なる関数呼び出しだ。

719 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 10:34:15.27 ID:zGjt7Ia9.net]
サブルーチンの呼び出しの後、
呼び出し元に復元(リターン)できなければ、
プログラムじゃねえよ

720 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 10:36:14.02 ID:ReU+9sFg.net]
ほらほら、こいつ再帰って言わなくなりましたよw
自分が言っていたことが間違っていたことがわかったから
恥ずかしくなった

721 名前:んでしょうねw []
[ここ壊れてます]

722 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 10:46:29.34 ID:SH0QgRhI.net]
コールスタックって再帰だよ
関数が元に戻れてスタック内容も変わらない
コールスタックを実装したら、当然再帰関数呼び出しも実装したことになる

723 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 10:47:55.97 ID:ReU+9sFg.net]
コールスタックがない関数はないから
すべての関数は再帰である。

>>705はそう言っているのです。
生暖かい目で見てあげましょう。


お兄ちゃん!関数使えるようになった!
私、再帰使いこなしてる!

724 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 11:00:37.95 ID:zGjt7Ia9.net]
ttp://nas6.main.jp/secret/ContainerPtr.htm

ttp://nas6.main.jp/NAS6_tree_clct.h
//再帰構文例1
//再帰構文例2
は俺は両方再帰だと思って作ったけどな
>>701
みたいのは
//再帰構文例1
の構造だろ

725 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 11:05:54.33 ID:zGjt7Ia9.net]
関数の自分自身を呼ばないと再帰関数じゃないっていうのは
頭が固いんじゃないの?



726 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 11:10:08.71 ID:zGjt7Ia9.net]
訂正
関数の自分自身を呼ばないと再帰処理じゃないっていうのは
頭が固いんじゃないの?
//再帰構文例1
は関数の自分自身を呼んでないけど、どう見ても再帰処理

727 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 11:23:13.73 ID:Bq/cKCjD.net]
いっぱい突っ込みどころがあるけどそれは置いといて、
今ひとつピンと来たものがある。

よくよく思い出すと「再帰処理」と「再帰関数」と言う似てるけど別の概念がある。
それを失念していた。

なおスレタイは再帰関数である。

728 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 11:27:58.33 ID:SH0QgRhI.net]

コールスタックは再帰処理だよ

729 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 11:34:56.98 ID:Bq/cKCjD.net]
だよ、じゃねぇよ
100のうち俺の失念であろう1だ
会話が成り立ってなさすぎるからどうでもいいんだが


>コールスタックを実装したら、当然再帰関数呼び出しも実装したことになる

730 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 11:38:41.59 ID:IJjvRwCO.net]
>>707
//再帰構文例2
> は俺は両方再帰だと思って作ったけどな

お前が間違ってるんだからお前が書いたコードきて
これが再帰なんだとか主張しても意味が無い。

731 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 11:42:04.89 ID:IJjvRwCO.net]
https://ja.wikipedia.org/wiki/%E5%86%8D%E5%B8%B0

再帰(さいき)とは、あるものについて記述する際に、記述しているもの
それ自身への参照が、その記述中にあらわれることをいう。
定義において、再帰があらわれているものを再帰的定義という。


なるほどね。自分自身への参照が必須なんだ。

732 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 11:55:26.05 ID:zGjt7Ia9.net]
>>714
だからクラスの関数呼び出しなんて、ほとんど
this->が省略されているだけなんだが・・・

733 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 11:57:10.38 ID:IJjvRwCO.net]
>>715
関係ないよ。

734 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 12:03:39.85 ID:9u1zKCQd.net]
>>708
頭が固いもなにも、それが再帰関数の定義なんだが…

735 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 12:09:24.27 ID:zGjt7Ia9.net]
アセンブリレベルが分からないと説明しようがないな
基本的にスタックでしか動かないし

ttp://www.math.kobe-u.ac.jp/~taka/asir-book-html/main/node65.html
再帰呼び出し、スタック



736 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 12:13:43.89 ID:zGjt7Ia9.net]
>>718の大学教授にこれはループであって再帰ではないってかみついてこいよ
def xn2(N) {
 XN = 0;
 for (I=0; I<N; I++) {
  XN = 2*XN+1;
 }
 return(XN);
}

737 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 12:25:42.76 ID:zGjt7Ia9.net]
int sum = 0;
 for(int i = 1; i <= 10; i++) {
  sum = sum + i;
}

な、これは再帰だろ、頭が悪いんだから、教授に迷惑をかけるなよ

738 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 12:44:51.30 ID:zGjt7Ia9.net]
戻り値を使いまわしたら基本的に再帰なんだよってはじめに書いておいた

739 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 12:56:18.37 ID:zGjt7Ia9.net]
>>701
のも

新たなシードを決める際には、バッファ中のどのピクセルを選んでもよいのですが、
新しい順か、古い順かのどちらかに統一するのが普通でしょう。
バッファをスタック構造にすれば新しい順、キューにすれば古い順に自然に決まります。

これを読んでいないのか再帰じゃないと思ってるんだろ

740 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 13:11:58.86 ID:IJjvRwCO.net]
> 戻り値を使いまわしたら基本的に再帰なんだよってはじめに書いておいた
違う

741 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 13:14:58.05 ID:zGjt7Ia9.net]
>>723
だから、戻り値を使って再帰呼び出ししているのと同じ事だろ

742 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 13:16:02.36 ID:a9 ]
[ここ壊れてます]

743 名前:CPEVg5.net mailto: >>721
戻り値を使い回すのはDP(動的計画法)という立派な名前が付いてるんだが
[]
[ここ壊れてます]

744 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 13:16:18.51 ID:IJjvRwCO.net]
例が良かったなw
すぐに見つかった。

>>720をアセンブリレベルにすると
見ての通りスタックも関数呼び出しもない。
単なるループ

mm.ahs.kitasato-u.ac.jp/~lm00000/sim/ueyama_ip/software/add10asm.html

次の例は 1 から 10 まで (実は 10 から 1 まで) の整数を加算するプログラムです。

ラベル  命令コード  オペランド  コメント文
     LD     B, 10     ; レジスタ B に 10 を代入する
     LD     A, 0     ; レジスタ A に 0 を代入する
LOOP: ADD    A, B     ; A に B を加える。加算結果はレジスタ A に。
     DEC    B       ; B の値から 1 を引く
     JR     NZ, LOOP   ; 引いた結果が 0 でなければ LOOP に分岐する
STOP: JR     STOP     ;プログラム終了。 加算結果はレジスタ A に残る。

745 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 13:16:42.20 ID:IJjvRwCO.net]
>>724
ぜんぜん違う



746 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 13:22:00.75 ID:zGjt7Ia9.net]
>>726

>>718
のリンクで
正式には再帰で書くけど、
最適化してループで書くってようなことが書いてあるだろ

747 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 13:26:52.77 ID:zGjt7Ia9.net]
>>718
のリンクでも
>>695
でも
>これに比べて、スタック保存分、オーバーロードしているけどね
こういうわけで再帰をループに最適化するわけ

748 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 13:34:34.79 ID:a9CPEVg5.net]
>>729
ねえ、そろそろ無知を晒すのやめない?恥ずかしくないか?

749 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 13:41:26.99 ID:zGjt7Ia9.net]
//等差数列
//定義に忠実に書いた場合
//r:ret,s:diff,n:n
int sigma(int r, int s, int n) {
 if (n < 1)return 0;
 if (n == 1) return r;
 return r + sigma(r + s, s, n - 1);
}
//メモリ使用量を最適化した場合
int sigma2(int s, int n) {
 if (n < 1)return 0;
 int r = 0, t = s;
 for (n--; 0 < n; n--, t += s) r = r + t;
 return r;
}
で、最適化されたのしか、教わらないし、理解できないのかな?

750 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 13:48:39.57 ID:zGjt7Ia9.net]
訂正

//等差数列
//定義に忠実に書いた場合
//r:ret,s:diff,n:n
int sigma(int r, int s, int n) {
 if (n < 1)return 0;
 if (n == 1) return r;
 return r + sigma(r + s, s, n - 1);
}
//メモリ使用量を最適化した場合
int sigma2(int s, int n) {
 if (n < 1)return 0;
 int r = 0, t = s;
 for (; 1 < n; n--, t += s) r = r + t;
 return r;
}

751 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 14:03:25.65 ID:SH0QgRhI.net]
sigma2は最適化された動的計画法
sigmaは「漸化式」の定義に基づいた再帰法

752 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 14:09:21.37 ID:zGjt7Ia9.net]
漸化式で求めた全ての項を
参照する必要があるのならば
動的計画法を用いることはできない

753 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 14:18:04.33 ID:bMqKfWg+.net]
>>733
codepad.org/pUWGRddj
どこを見れば等差数列だと分かるようになるのでしょうか?

754 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 14:20:40.72 ID:IJjvRwCO.net]
>>728
> 正式には「再帰で書くけど 最適化して(再帰ではなく)ループで書く」

ですね!?

最適化してループで書いたのだから
それは再帰ではないということです。

755 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 14:42:48.35 ID:zGjt7Ia9.net]
>>735
ああ、ごめんね
sigmaだから1〜nまでの等差数列の和だよ

漸化式の全ての項を使う
→全てのノードを使う時は動的計画法で最適化できないんよ
そのケースは、ある点からの周囲の経路を探索する場合
ディレクトリ探索だったり、塗りつぶしだったり、つまり全検索をかける場合
こういうのは再帰を使うだろうに



756 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 14:44:53.85 ID:zGjt7Ia9.net]
つまり経路の全検索をかける場合
こういうのは再帰を使うだろうに

757 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 14:56:44.42 ID:IJjvRwCO.net]
あれ? 根本的な前提わかってないの?

誰も再帰を絶対に使わないで書けとか言ってなくて、
ループで簡単にかけるようなものを
わざわざ再帰で書くなよ(笑)って
話なんだけど。

758 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 14:57:36.94 ID:zGjt7Ia9.net]
>>735
sigmaだから1〜n-1までの等差s数列の和
s=3なら
sigma=3+6+9+12+・・・

759 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 15:08:23.80 ID:zGjt7Ia9.net]
//1〜n-1までの等差s数列の和
//定義に忠実に書いた場合
//r:ret,s:diff,n:n
int sigma(int r, int s, int n) {
 if (n < 1)return 0;
 if (n == 1) return r;
 return r + sigma(r + s, s, n - 1);
}
//メモリ使用量を最適化した場合
int sigma2(int s, int n) {
 if (n < 1)return 0;
 int r = 0, t = s;
 for (; 1 < n; n--, t += s) r = r + t;
 return r;
}
べつにどっちで書けって言われても
項をスタックするかしないだけの違いだけど?

760 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 15:10:18.45 ID:IJjvRwCO.net]
> 項をスタックするかしないだけの違いだけど?

それよりも重要な違いは、
自分の関数自身を呼ぶかどうかだよ。

自分自身を呼ぶのが再帰、
そうでないのは再帰じゃない。

761 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 15:16:46.56 ID:dKM7sd/0.net]
その定義だと相互再帰は再帰じゃないのかと重箱の隅をつつかれるけど、間違いじゃない。

クソコ

762 名前:テは速やかにNG入れるといいよ。ラーメンが好きかどうかの話をしている中でお茶漬けもラーメンだと強弁するような、話題に入ることができない人だから。 []
[ここ壊れてます]

763 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 15:18:48.81 ID:ygimYbNM.net]
末尾再帰にあらずんば再帰にあらず

764 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 15:19:27.30 ID:zGjt7Ia9.net]
利点と欠点があって

再帰:書けない漸化式はない、項をスタックするからメモリを消費する
ループ:項の参照が少ない漸化式のみ書ける、項をスタックしないからメモリ使用量は少ない

そんだけ

765 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 15:23:23.93 ID:ygimYbNM.net]
>>745
ループと再帰は厳密に完全互換ですよ



766 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 15:31:56.99 ID:zGjt7Ia9.net]
>>746
ノード検索とか再帰のノード全てメモしてループするとか
素直に再帰を使っちゃいかんのかいな

767 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 15:35:58.97 ID:ygimYbNM.net]
>>747
可否の話をしただけ

>>745で可能性に対する言及が間違っているから、それを指摘したにすぎない
forでかけるものは、再帰でもかけるし
再帰でかけるものは、forでもかける

768 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 15:38:08.67 ID:1TQgpEDy.net]
うわーこいつ最悪だな
自分がほんまモンの馬鹿であるという自覚が全くないバカ
ま、見てる分には面白いけど他人に迷惑掛けんなよ
他人に迷惑を掛けるとなんとかキューゼットとかいう奴みたいに嫌われ者になっぞ

769 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 15:42:58.31 ID:gAQxPGKS.net]
NAS6って宗教板で「重力が神」みたいなことをホザいてた奴だな

770 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 18:40:37.54 ID:zGjt7Ia9.net]
利点と欠点があって

再帰:書けない漸化式はない
項をスタックするからメモリを消費する

ループ:項の参照が少ない漸化式のみ書ける
あるいは項をメモする必要がある
項をスタックしないからメモリ使用量は少ない

そんだけ

771 名前:デフォルトの名無しさん [2015/09/05(土) 19:01:21.79 ID:tTlkULNN.net]
>>751
スタックしない再帰があれば最強じゃん

772 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 19:32:52.27 ID:6bqI6s7I.net]
再帰処理と、再帰関数や再帰呼出とをきちんと区別しろ。

ループは再帰処理の一種だ。

773 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 19:37:09.10 ID:Bq/cKCjD.net]
まず定義に逆らうのやめろよ。
再帰は自己よ呼び出す関数だ。当然実行中の処理手順は無条件にスタックされる。

そして都合よく「再帰」と「ループ」を分けて見たり、全部再帰と言って見たり挙動不審なことをするのもやめれよ。
もはや会話が成り立たん。

ちなみに俺の場合は、一番最初の冒頭のレスで「極論的には再帰もループも同じ」
とした上で、その後は一貫して再帰とループを区別してんだよ。

すなわちCの状態のように関数とスタックの抽象化が出来てる状態で初めてループと再帰があるんだ。


君がやってることは犬小屋も本棚もどっちも「木」で出来てるから同じと言って見たり、
犬小屋と本棚は別物のように書いて見たり、
木の状態を指してこれは「犬小屋」と言って見たり、
「本棚」を指して「犬小屋」と言って見たり、
そもそもなんの話をしてるか分からなくなって見たり。

774 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 19:40:47.01 ID:CMLBJgqr.net]
schemeのnamed letは繰り返し? 再帰?

775 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 20:00:58.23 ID:zGjt7Ia9.net]
double calcPI(double r, double s, double n) {
 double t = 1.0;
 if (s == 1) t = 2.0;
 if (n == 1) return r;
 return t * (r + calcPI(r * s / (2.0 * s + 1.0), s + 1, n - 1));
}
double calcPI2() {
 double sse = 0.00000000000001; double a = 0.125;
 double b = sqrt(a); double c = 1.0 + 3.0 * b;
 double d = sqrt(c); double e = 0.625;
 double f = d - e; d = 2 * d;
 b = f - b; c = c + f;
 double npow = 4;
 do {
  npow = 2 * npow;  f = (c + d) / 2;
  d = sqrt(c * d);  f = f - d;
  d = 2 * d;  b = b - f;  c = f + d;
 } while (sse < f);
 f = f * f / 4; c = c + d;
 return (c * c - f - f / 2) / (c * b - f) / npow;
}
どっちが簡単だと思う?



776 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 20:25:21.94 ID:zGjt7Ia9.net]
double calcPI(double r, double s, double n) {
 double t = 1.0;
 if (s == 1) t = 2.0;
 if (n == 1) return r;
 return t * (r + calcPI(r * s / (2.0 * s + 1.0), s + 1, n - 1));
}
double calcPI3(double n) {
 double r = 1.0;
 double s = 1.0;
 double t = 1.0;
 while (1 < n) {
  t = (t * s / (2.0 * s + 1.0));
  r = r + t;
  s += 1;
  n -= 1;
 }
 return 2.0 * r;
}
意地悪が過ぎたが、今度はマジ
どっちが可読性があるの?

777 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 20:34:20.88 ID:zGjt7Ia9.net]
ああ、ちなみにπの漸化式は
2(1+(1/3)+(1/3)(2/5)+(1/3)(2/5)(3/7)+...)
だからね

778 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 20:49:22.97 ID:zGjt7Ia9.net]
変数名がごっちゃにならないように書き直し
double calcPI(double r, double s, double n) {
 double u = 1.0;
 if (s == 1) u = 2.0;
 if (n == 1) return r;
 return u * (r + calcPI(r * s / (2.0 * s + 1.0), s + 1, n - 1));
}
double calcPI3(double n) {
 double r = 1.0;
 double s = 1.0;
 double t = 1.0;
 double u = 2.0;
 while (1 < n) {
  t = (t * s / (2.0 * s + 1.0));
  r = r + t;
  s += 1;
  n -= 1;
 }
 return u * r;
}

779 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 21:09:08.26 ID:zGjt7Ia9.net]
完全に同じ処理にしたけど、どっちが楽なんだろうね?
double calcPI(double r, double s, double n) {
 double u = 1.0;
 if (s == 1) u = 2.0;
 if (n == 0) return r;
 return u * (r + calcPI(r * s / (2.0 * s + 1.0), s + 1, n - 1));
}
double calcPI3(double n) {
 double r = 1.0;
 double s = 1.0;
 double t = 1.0;
 double u = 1.0;
 while (0 < n) {
  t = t * s / (2.0 * s + 1.0);
  r = u * (r + t);
  s += 1;
  n -= 1;
 }
 u = 2.0;
 return u * r;
}

780 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 21:16:59.43 ID:zGjt7Ia9.net]
我々は「軍国主義者」を打倒したと、我らが「軍事パレード」で宣言

781 名前:デフォルトの名無しさん [2015/09/05(土) 21:27:52.93 ID:tTlkULNN.net]
>>761
Javaできる?
Javaで2つのint型配列を結合する処理を再帰で書いてみて

782 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 21:55:59.06 ID:zGjt7Ia9.net]
コンパイラ入れんのめんどくさいからパス
#include <iostream>

void init(int * p, int n) {
 for (; 0 < n; n--) p[n] = 0;
}
void disp(int * p, int n) {
 std::cout << std::endl;
 for (int i = 0; i < n; i++) std::cout << p[i] << " ";
 std::cout << std::endl;
}
int recUnit(int i, int j, int *a, int na, int *b, int nb) {
 if (i < na && j < nb) a[i] = b[j];
 else return i;
 return recUnit(i + 1, j + 1, a, na, b, nb);
}
void unit(int *a, int na, int *b, int nb, int *c, int nc) {
 int i;
 i = recUnit(0, 0, a, na, b, nb);
 recUnit(i, 0, a, na, c, nc);
}

783 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 21:56:37.35 ID:zGjt7Ia9.net]
void unit2(int *a, int na, int *b, int nb, int *c, int nc) {
 int i, j;
 for (i = 0, j = 0; j < nb; i++, j++) if (i < na)a[i] = b[j];
 for (j = 0; j < nc; i++, j++) if (i < na)a[i] = c[j];
}
int main()
{
 int a[10], b[5] = { 0, 1, 2, 3, 4 }, c[5] = { 5, 6, 7, 8, 9 };
 init(a, 10); unit(a, 10, b, 5, c, 5); disp(a, 10);
 init(a, 10); unit2(a, 10, b, 5, c, 5); disp(a, 10);
 return 0;
}

784 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 22:03:28.78 ID:zGjt7Ia9.net]
ミスった
#include <iostream>

void init(int * p, int n) {
 for (; 0 < n; n--) p[n - 1] = 0;
}
void disp(int * p, int n) {
 std::cout << std::endl;
 for (int i = 0; i < n; i++) std::cout << p[i] << " ";
 std::cout << std::endl;
}
int recUnit(int i, int j, int *a, int na, int *b, int nb) {
 if (i < na && j < nb) a[i] = b[j];
 else return i;
 return recUnit(i + 1, j + 1, a, na, b, nb);
}
void unit(int *a, int na, int *b, int nb, int *c, int nc) {
 int i;
 i = recUnit(0, 0, a, na, b, nb);
 recUnit(i, 0, a, na, c, nc);
}

785 名前:デフォルトの名無しさん [2015/09/05(土) 22:07:56.87 ID:tTlkULNN.net]
>>765
    ∩____∩
   /       \
  ./   ●   ●  .', C++やねー ありがとー
  l     ( _●_)    l
 彡、    |∪|    ミ
 i"./   ヽノ    ',ヽ
 ヽi          iノ
  ',         /
   ヽ    /   /
    ',   i!  /
   (___/ \___)



786 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 22:24:32.63 ID:zGjt7Ia9.net]
ちゃんと出来てるかこっちのほうがいいか
void unit2(int *a, int na, int *b, int nb, int *c, int nc) {
 int i, j;
 for (i = 0, j = 0; j < nb; i++, j++) if (i < na) a[i] = b[j];
 for (j = 0; j < nc; i++, j++) if (i < na) a[i] = c[j];
}
int main()
{
 int a[10], b[4] = { 0, 1, 2, 3 }, c[6] = { 4, 5, 6, 7, 8, 9 };
 init(a, 10); unit(a, 10, b, 4, c, 6); disp(a, 10);
 init(a, 10); unit2(a, 10, b, 4, c, 6); disp(a, 10);
 return 0;
}

787 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 22:31:18.83 ID:zGjt7Ia9.net]
最適化されているのはループで
漸化式定義に忠実で書きやすいのが再帰だよ

788 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 22:33:05.45 ID:zGjt7Ia9.net]
>>758
>>760
>>768

789 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 22:47:45.27 ID:zGjt7Ia9.net]
void recForFunc() { ; }
int recFor(int i, int n, int a) {
 if (n <= i) return i;
 recForFunc();
 return recFor(i + a, n, a);
}


std::cout << recFor(0, 10, 2) << std::endl;

for (i = 0; i < 10; i += 2) recForFunc();
std::cout << i << std::endl;

ループと再帰の違いは
スコープスタックを保存しているかしていないかだけ

790 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 22:57:11.75 ID:zGjt7Ia9.net]
recForはint i = 0,2,4,6,8,10をpushしてpopしながら戻ってくる
forはpopしながら戻る機能はない

791 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 22:59:40.11 ID:IJjvRwCO.net]
ループと再帰の違いは
自分の関数自身を呼び出しているかだけ。

反論あるならどうぞ?

792 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 23:03:39.21 ID:zGjt7Ia9.net]
int recFor(int i, int n, int a) {
 if (n <= i) return i;
//pushしたiを使う時はここに処理
 recForFunc();
 i = recFor(i + a, n, a);
//popしたiを使う時はここに処理
 return i;
}

793 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 23:14:34.40 ID:SH0QgRhI.net]
>>772
めっちゃ適当に書くけどこれも再帰



794 名前:class A{
public:
 A* func(){...return this;}
};

A* crnt;
while(true){
 crnt = crnt->func();
//crntへの再帰処理&NEXT処理
}
[]
[ここ壊れてます]

795 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 23:19:20.41 ID:zGjt7Ia9.net]
ttp://nas6.main.jp/secret/ContainerPtr.htm
ttp://nas6.main.jp/sptr.cpp
ttp://nas6.main.jp/NAS6_cntn_ptr.h
ttp://nas6.main.jp/NAS6_tree_clct.h
実例は↑の
//再帰構文例1
//再帰構文例2
とか



796 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 23:24:29.51 ID:zGjt7Ia9.net]
//再帰構文例1
みたいに書くのがノード検索を
なんも考えないで書ける

797 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 23:30:27.24 ID:htzS6HST.net]
>>774
それに近いコードを
「再帰」だって主張している
ページを見つけてきてね(大爆笑)

798 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 23:32:10.40 ID:htzS6HST.net]
当たり前だけど>>774
funcの中でfuncを呼び出していないから
再帰ではない。

799 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 23:36:14.88 ID:zGjt7Ia9.net]
ttp://nas6.main.jp/sptr.cpp

template<typename T>
void disp_NAS6_tree_clct(NAS6_tree_clct<T>* root);
template<typename T>
void disp_NAS6_tree_clct_key(NAS6_tree_clct<T>* root, string fk);
とか、ノード検索をなんも考えないでノード検索が出来ちゃう

800 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 23:38:50.80 ID:zGjt7Ia9.net]
>>777
ttp://msdn.microsoft.com/ja-jp/library/Cc429242.aspx
win32api
FindNextFile()

801 名前:デフォルトの名無しさん [2015/09/05(土) 23:38:57.11 ID:tTlkULNN.net]
再帰構造をループで処理することを再帰処理と言うてんの?

802 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 23:40:03.04 ID:htzS6HST.net]
>>780
「再帰」って書いてないね。
やっぱり再帰じゃなかったね。
逆の証拠を見つけてくれてあがとう(大爆笑)

803 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 23:41:35.40 ID:htzS6HST.net]
>>781
アホのオレオレ定義だよなぁ(大爆笑)

804 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 23:45:35.82 ID:zGjt7Ia9.net]
ttp://www.google.co.jp/?gws_rd=ssl#q=findnextfile%20%E5%86%8D%E5%B8%B0
FindNextFile 再帰

805 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 23:48:34.61 ID:htzS6HST.net]
>>784
お前がググって
自分で証拠を見つけ出すんだよ(大爆笑)

自分の仕事を(出来ないからって)
他人にやらせるな。



806 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 23:51:11.81 ID:zGjt7Ia9.net]
>>785
>>784
の検索結果のほぼ全て

807 名前:デフォルトの名無しさん [2015/09/05(土) 23:53:43.47 ID:tTlkULNN.net]
>>783
うむ、再帰構造と再帰処理を混同しておられるとしか思えぬ。

808 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 23:54:28.66 ID:htzS6HST.net]
>>786
言葉が足りないぞ?(大爆笑)

>>785
>>784
の検索結果のほぼ全てに
FindNextFileを使って再帰を使ったコードが有ります。
再帰というのは自分の関数自身を呼び出すものなので、
大概そのようになっています。

つまり、検索の一番目だと、このコメントの部分が再帰です。
(FindNextFileの行には再帰とは書いていない)

void searchDir(char *lpszDir,HWND hwLst) { /* サブディレクトリ探索 */
  省略
if ((fFind.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)!=0 &&
lstrcmp(fFind.cFileName,".")!=0 &&
lstrcmp(fFind.cFileName,"..")!=0){ /* サブディレクトリの処理 */
    省略
searchDir(lpszSDir,hwLst); /* 再帰呼び出し */
}

while (FindNextFile(hSearch,&fFind)) { /* 全ファイルを処理 */
     省略
searchDir(lpszSDir,hwLst);
}
}
FindClose(hSearch);
}

809 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 23:54:52.90 ID:zGjt7Ia9.net]
htzS6HST
お前あほ杉
なんも分かってないなら書き込むな

810 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 23:55:51.09 ID:htzS6HST.net]
>>789
わかってるから書き込んでいる。

これも「再帰」(大爆笑)

811 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 23:57:07.95 ID:m0Ws+Wye.net]
話がループ・・・おっと違った
話が再帰してる(大爆笑)

812 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 00:00:00.32 ID:aj7iBxVG.net]
ループと再帰関数を同一だと主張するだけで(それすらオレオレ定義&根拠無し)その先のことを何も言わないのは何故?
「Xは再帰」「Yは再帰」「Zは再帰」って、いくらコードを書いても根拠にならないのは分かってる?
お前が書かなきゃならんことは「Xが再帰であることの根拠」であるのだから、お前の頭の中にしかない「再帰関数の定義」を書かないといけない。
もしオレオレ定義じゃないなら>>742>>714の再帰関数の定義に、お前の書くコードがどう当てはまるのか書かないといけない。

そんで結局NAS6 ◆n3AmnVhjwcの主張は何なの?再帰関数が好きなの嫌いなの?
スレ違いも大概にしなさいよ。

813 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 00:01:55.86 ID:8kAWPtv+.net]
NAS6 ◆n3AmnVhjwcの主張はこれ。

719 名前:NAS6 ◆n3AmnVhjwc [] 投稿日:2015/09/05(土) 12:25:42.76 ID:zGjt7Ia9 [22/59]
int sum = 0;
 for(int i = 1; i <= 10; i++) {
  sum = sum + i;
}

な、これは再帰だろ、頭が悪いんだから、教授に迷惑をかけるなよ

814 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 00:02:26.01 ID:miXQ60Mg.net]
>>788
そのsearchDirの書式を簡単にして

ttp://nas6.main.jp/sptr.cpp

template<typename T>
void disp_NAS6_tree_clct(NAS6_tree_clct<T>* root);
template<typename T>
void disp_NAS6_tree_clct_key(NAS6_tree_clct<T>* root, string fk);
とか、ノード検索をなんも考えないでノード検索が出来ちゃう

815 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 00:02:42.93 ID:8kAWPtv+.net]
ちなみに>>720は再帰じゃないから、
>>720を再帰で書き直すことができる



816 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 00:03:42.83 ID:8kAWPtv+.net]
>>794
今は再帰かどうかの話をしてるんだが?(大爆笑)

searchDir の中で searchDir を読んでるから再帰。
FindNextFileを使ってるもの全てが再帰になるわけじゃない。

817 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 00:07:36.08 ID:miXQ60Mg.net]
ttp://nas6.main.jp/secret/ContainerPtr.htm
これをコンソールアプリでビルドしてみ
ノード検索されてるから

で、forとかループに対応するものと言うから
再帰「関数」ではなく再帰「処理」を書いてる

818 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 00:09:15.40 ID:8kAWPtv+.net]
>>797
今は再帰の定義をしている。
全ての再帰はループで処理できる。

ループでノード検索しているから
それは再帰でない証拠(大爆笑)

ttp://nas6.main.jp/secret/ContainerPtr.htm
これをコンソールアプリでビルドしてみ
再帰使わずにノード検索できてるから

あ、ちなみに、このコードは俺が書いたんだよ?

819 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 00:13:16.02 ID:miXQ60Mg.net]
再帰「関数」だと、再帰「処理」内の、全てのコードを完全実装しなければならなくて
その振る舞いが決定されるから

ttp://nas6.main.jp/sptr.cpp

template<typename T>
void disp_NAS6_tree_clct(NAS6_tree_clct<T>* root);
template<typename T>
void disp_NAS6_tree_clct_key(NAS6_tree_clct<T>* root, string fk);

こう書いたんだよ

820 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 00:16:13.79 ID:miXQ60Mg.net]
>>798
なにこのカス

821 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 00:22:17.38 ID:miXQ60Mg.net]
>あ、ちなみに、このコードは俺が書いたんだよ?

じゃあ、デストラクタがどう呼ばれるか説明してみ
つうか、俺のサイトにお前がアップしたの?

822 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2015/09/06(日) 00:29:02.94 ID:0zNPIayW.net]
NAS6さん、華麗なる2ちゃんデビューおめ!

823 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 00:31:05.32 ID:CQ0buOj1.net]
ttp://nas6.main.jp/NAS6_tree_clct.h
数時間で↑のデストラクタの振る舞いが読めたら褒めちゃいます

824 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 00:48:13.59 ID:CQ0buOj1.net]
多分、どうなってるか
さっぱり分からんと思うけどね

825 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 01:09:59.10 ID:laHESI+6.net]
キチガイの思考過程がさっぱり分からないのは当然の事だろ



826 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 01:12:42.58 ID:miXQ60Mg.net]
//メモリリーク検出関数
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

メモリリークゼロ

827 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 01:15:51.45 ID:miXQ60Mg.net]
void main() {
int *p = new int;
#ifdef _MSC_VER

って書くと、int分4バイトだけリーク

828 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 01:32:13.72 ID:aj7iBxVG.net]
NAS6 ◆n3AmnVhjwcは再帰とは何かも含めて、言葉の定義を他と擦り合わせろ。
それができないなら自分のサイトに引きこもっていろ。

829 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 01:37:20.23 ID:miXQ60Mg.net]
俺は再帰「処理」を書いてるよ
再帰「関数」ならば、それで完結した書き方を
書かなきゃならなくて適宜運用に不向き

830 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 01:41:27.92 ID:aj7iBxVG.net]
なら何故ここにいるの?スレタイ読めないの?

831 名前:デフォルトの名無しさん [2015/09/06(日) 01:43:51.10 ID:Zg6i8dH9.net]
>>809
普通は再帰関数で行う処理のことを再帰処理って言うんだと思うよ。

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

for,whileって言うから、それに対応するものは
スレタイの再帰「関数」じゃなくて、再帰「処理」だからだよ

833 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 01:55:27.64 ID:CQ0buOj1.net]
ttp://ja.wikipedia.org/wiki/%E5%86%8D%E5%B8%B0%E7%9A%84%E5%A

834 名前:E%9A%E7%BE%A9
再帰的定義
[]
[ここ壊れてます]

835 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 01:56:17.98 ID:8PjODHJ7.net]
一人でそうゆうこと書いてて満足か?



836 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 02:08:49.81 ID:miXQ60Mg.net]
「再帰的定義: "再帰的定義"を参照」

//再帰構文例1
template<typename T>
void recHoge1(NAS6_tree_clct<T>* root, string fk) {
 bool parent = false;
 if (&root->recursiveInit() == nullptr) return;
 NAS6_tree_clct<T>* crnt = root;
 //crnt = root; の時のcrntに適用の処理
 //or : //if (crnt->conformkey(crnt, fk) != string::npos) //{...} //キー検索の時
 while (!crnt->recursiveIsEnd(root)) {

  //「再帰的定義: "再帰的定義"を参照」
  parent = false;
  crnt = &(crnt->recursiveNext(root), parent);
  //or : //crnt = &(crnt->recursiveKeyNext(root, fk, parent));


  //if(!parent) //{...} //crnt = Next; の時のcrntに適用の処理
  //else //{...} //親に戻った時の処理
 }
} 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)


837 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 02:14:12.46 ID:miXQ60Mg.net]
//「再帰的定義: "再帰的定義"を参照」
parent = false;
crnt = &(crnt->recursiveNext(root), parent);
//or : //crnt = &(crnt->recursiveKeyNext(root, fk, parent));

左辺のcrntは、右辺のcrntの子ノードに遷移してんの

838 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 02:17:05.47 ID:aj7iBxVG.net]
それが文脈が無駄に高いオレオレコードをコピペする理由になると思ったのはどうして?
>>720を再帰だ、などという戯言が通らなくて癇癪起こしているだけじゃないか。

で、>>813の定義に>>720がどう当てはまっているんだ?俺には分からない。
もしもsum = sum + iが再帰的定義なんだと思っているなら、それは単なる代入だから違うぞ。

839 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 02:20:56.64 ID:CQ0buOj1.net]
//or : //crnt = &(crnt->recursiveKeyNext(root, fk, parent));

ああ、こっちはキーの一致の次のノードで子とは限らんけど

再帰だからもちろん親のノードにも最下層まで行ってから帰ってくるよ

840 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 02:21:09.18 ID:8PjODHJ7.net]
君、途中で再帰関数と再帰処理の違いを指摘されてなかったか?
なんか無言で言ってることを切り替えてるようだけど。

841 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 02:24:47.62 ID:miXQ60Mg.net]
「再帰的定義: "再帰的定義"を参照」
f(n+1) = f(n) + i;
sum = sum + i;

842 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 02:26:17.85 ID:8PjODHJ7.net]
>>820 もっかい聞くけど楽しいか?

843 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 02:28:04.25 ID:CQ0buOj1.net]
めちゃくちゃ楽しい

844 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 02:32:22.07 ID:8PjODHJ7.net]
ちょっと自己顕示欲が強いんだね
ただそれは迷惑だからそのへんも考えれるようになればいいね

845 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 02:33:09.17 ID:CQ0buOj1.net]
「再帰的定義: "再帰的定義"を参照」
f(n+1) = f(n) + i;
sum = sum + i;

左辺はn+1項で、右辺はn項



846 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 02:40:59.21 ID:CQ0buOj1.net]
670 :NAS6 ◆n3AmnVhjwc :2015/09/05(土) 07:33:00.36 ID:zGjt7Ia9
>>657
おま、戻り値を使いまわしたら基本的に再帰じゃないの?。。。

最初に書きました
戻り値の使い回しは基本的にn+1項の定義

847 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 02:52:22.91 ID:CQ0buOj1.net]
厳密にするわ
「再帰的定義: "再帰的定義"を参照」
f(n+1) = f(n) + i;
sum = sum + i;

左辺はn+1項までの和で、右辺はn項までの和

848 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 02:53:55.79 ID:miXQ60Mg.net]
全然間違ってすらいないよ

849 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 03:05:39.93 ID:miXQ60Mg.net]
一体、他にどう読んでたんだよ?

850 名前:デフォルトの名無しさん [2015/09/06(日) 03:21:13.07 ID:Zg6i8dH9.net]
>>828
君は他の人が言う再帰をどう読んでたの?

851 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 03:21:47.38 ID:aj7iBxVG.net]
全然違うよ。右辺のsumはどこで定義したんだ?int sum = 0が定義。sum + iでただ更新してるだけ。
一方のfは、初期値も含めて正確に表せばf(n) = if n = 0 then 0 else f(n-1) + 1となっていて、fを定義するのにf自身が必要。
これが再帰的定義。

852 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 03:30:27.61 ID:miXQ60Mg.net]
おいおい、初項を決めないで再帰(帰納)定義ができるわけはないだろ

853 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 03:33:43.48 ID:CQ0buOj1.net]
おま、数学の帰納法も開始できないのか?

854 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 04:00:23.70 ID:g2 ]
[ここ壊れてます]

855 名前:NsvO1D.net mailto: ヒントってか答え
初項:f(n = 0) = 0

f(1) = 0 + i
f(2) = f(1) + i = i + i
f(3) = f(2) + i = 2 * i + i
...

f(n + 1) = f(n) + i
[]
[ここ壊れてます]



856 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 04:17:34.08 ID:aj7iBxVG.net]
sumを定義するのにsumを使っていないから駄目で、sum = sum + iは定義じゃなくて単なる更新だから再帰的定義ではない。
int sum = 0とした後にどう更新しようが再帰的とは呼ばないんだよ。

百歩譲ってこれを再帰的定義と呼ぶのなら、当てはまる例が多すぎて何の価値もない概念になる。i++も再帰になるし
int y = 1;
int x = 2;
x = y
としたら偶々x = x/2をという処理になるからこれもお前の言う再帰的定義になるよな。
そんな馬鹿なもんにわざわざ名前を付ける意味も無いし、好き嫌いも語れんよな。

857 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 04:18:39.27 ID:g2NsvO1D.net]
>>830
では、理系の学部を卒業するのは奇跡だろ

858 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 04:20:59.76 ID:CQ0buOj1.net]
つ漸化式

859 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 04:30:52.77 ID:CQ0buOj1.net]
もしかして
ゆとりって、そんなヒドイの?

860 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 04:34:02.41 ID:CQ0buOj1.net]
そんなわけはないと思いたい

861 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 04:39:58.28 ID:miXQ60Mg.net]
漸化式から再帰定義をコーディングするのは当たり前だろ?
学部で習わなかった?

862 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 04:45:55.83 ID:miXQ60Mg.net]
おかしいな
理系ならば情報処理の単位で
漸化式からの再帰定義は
カリキュラムに多分あるはずだけど?

863 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 04:54:07.46 ID:8PjODHJ7.net]
元々な、そんな話は誰一人としてしてないからね。
自信満々に書き込んでる内容自体が全部ずれてるからね。

で、仮にそれが再帰だとして言いたいことはなんだ?

864 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 04:55:04.91 ID:miXQ60Mg.net]
ttp://www.a.math.ryukoku.ac.jp/~junta/edu/nc/exercise/5.html
>>758
>>760

865 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 04:58:01.28 ID:CQ0buOj1.net]
>>842
みたいなのを自分でやらずに
コピペ提出したんだろ



866 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 05:05:14.35 ID:8PjODHJ7.net]
ベンチ取ってないけどCの場合だと速いのは下だろう

つーか再帰の定義を世間のプログラマと同じにしたらどうだ

867 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 05:25:54.12 ID:g2NsvO1D.net]
バグがあると見るなら訂正
double calcPI(double r, double s, double n) {
 double u = 1.0;
 if (s == 1) u = 2.0;
 if (n == 0) return u * ( r + (r * s / (2.0 * s + 1.0)));
 return u * (r + calcPI(r * s / (2.0 * s + 1.0), s + 1, n - 1));
}
double calcPI3(double n) {
 double r = 1.0;
 double s = 1.0;
 double t = 1.0;
 double u = 1.0;
 while (0 <= n) {
  t = t * s / (2.0 * s + 1.0);
  r = u * (r + t);
  s += 1;
  n -= 1;
 }
 u = 2.0;
 return u * r;
}

868 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 05:31:14.68 ID:CQ0buOj1.net]
ああ元のまんまかな
>>760

869 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 09:07:19.68 ID:8kAWPtv+.net]
>>834
> sumを定義するのにsumを使っていないから駄目で、sum = sum + iは定義じゃなくて単なる更新だから再帰的定義ではない。
> int sum = 0とした後にどう更新しようが再帰的とは呼ばないんだよ。

ホントその通り。
頭の悪さがにじみ出てるよねw

870 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 10:34:04.98 ID:DHZQ2m5W.net]
破壊代入を認めないというルールのもとではどうなるの?

871 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 11:30:18.37 ID:miXQ60Mg.net]
ヒントってか答え
初項:f(n = 0) = 0

f(1) = f(0) + i = 0 + i
f(2) = f(1) + i = i + i
f(3) = f(2) + i = 2 * i + i
...

f(n + 1) = f(n) + i

sum = sum + i

>>847
どう見ても漸化式通りの振る舞い

872 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 11:31:06.67 ID:8kAWPtv+.net]
再帰の定義を調べてみたら、
関数が自分自身の関数を
呼び出していることって書いてあった。

873 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 11:36:22.64 ID:miXQ60Mg.net]
あ、

ヒントってか答え
初項:f(n = 0) = 0 i(n = 0) = 1

i(n + 1) = i(n) + 1

f(1) = f(0) + i(0) = 0 + i(0)
f(2) = f(1) + i(1) = i(1) + i(0)
f(3) = f(2) + i(2) = i(1) + i(0) + i(2)
...

f(n + 1) = f(n) + i(n)

sum = sum + i

>>847
どう見ても漸化式通りの振る舞い

874 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 11:40:30.06 ID:8kAWPtv+.net]
再帰っていうのは、漸化式かどうかは関係なくて
関数が自分自身の関数を
呼び出していることらしいね。

875 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 11:54:16.59 ID:miXQ60Mg.net]
653 :デフォルトの名無しさん:2015/09/04(金) 23:24:17.87 ID:q06Od88z
n-1 までの和に n を足せば nまでの和が得られる、という原理に忠実な計算なんで
再帰以外のなにものでもないんだけど、基礎論触ったことないとわかんないかもね。

656 :デフォルトの名無しさん:2015/09/04(金) 23:29:28.63 ID:vuZU5Hwi
>>653
ループじゃんw

書けば理解できるのか?

int sum = 0;
for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}



876 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 11:57:27.68 ID:miXQ60Mg.net]
初項:f(n = 0) = 0,i(n = 0) = 1

i(n + 1) = i(n) + 1

f(1) = f(0) + i(0) = 0 + i(0)
f(2) = f(1) + i(1) = i(1) + i(0)
f(3) = f(2) + i(2) = i(1) + i(0) + i(2)
...

f(n + 1) = f(n) + i(n)

↓が↑こういう

877 名前:漸化式になってるのが理解できないのか?

int sum = 0;
for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}
[]
[ここ壊れてます]

878 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:02:33.74 ID:8kAWPtv+.net]
みんなわかってると思うけど、
誰も漸化式であることを否定していない。

漸化式をとく問題を
ループで書くか再帰で書くかって話をしている。

再帰で書くとスタックを消費する。
場合によってはスタックオーバーフローを起こす。

だからスタックオーバーフローを気にするならば
ループで書く。そして多くの場合ループのほうが速い。

という話をしている。

879 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 12:02:46.10 ID:CQ0buOj1.net]
初項:f(n = 0) = 0,i(n = 0) = 1

i(n + 1) = i(n) + 1

f(1) = f(0) + i(0) = 0 + 1
f(2) = f(1) + i(1) = i(1) + i(0)
f(3) = f(2) + i(2) = i(0) + i(1) + i(2)
...

f(n + 1) = f(n) + i(n)

↓が↑こういう漸化式になってるのが理解できないのか?

int sum = 0;
for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}

880 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:04:50.09 ID:5yTvo1pN.net]
もうやめといてやれよ
NAS6は自分で新しい言葉を定義するのが好きな精神障害者だろ
こういうのは「言語新作」と言って統合失調症特有の症状

要するに脳内はドーパミンドハドバ出まくりで覚せい剤を決めてるような感じになってるわけだ
これは統合失調症の陽性症状
ただ統合失調症はそんなに甘くなく「バッドトリップ」、すなわち陰性症状もひどい
だから2chに書き込みしてない時は死にたくなってるんじゃね
これじゃまともな日常生活を送れるわけがない
廃人みたいな私生活なんだろうな

なんでム板には精神異常者が多いんだろうねえ

881 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:07:52.59 ID:8kAWPtv+.net]
コピペ始めちゃったしねw

コミュ障であることは明らか

882 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 12:09:07.82 ID:CQ0buOj1.net]
>>855
それは再帰の最適化だから
ループの再帰なんだけど?
再帰「関数」にせよ、ループ再帰にせよ
再帰(帰納)定義を実装しなければならない

883 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:13:50.10 ID:n7lw0XxH.net]
>>855
末尾再帰じゃないと再帰じゃないっつってんだろ

884 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 12:16:12.34 ID:CQ0buOj1.net]
初項:f(n = 0) = 0,i(n = 0) = 1

i(n + 1) = i(n) + 1

f(1) = f(0) + i(0) = 0 + 1
f(2) = f(1) + i(1) = i(1) + i(0)
f(3) = f(2) + i(2) = i(0) + i(1) + i(2)
...

f(n + 1) = f(n) + i(n)

↓が↑こういう漸化式になってるのが理解できないのか?

int sum = 0;
for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}

それは再帰の最適化だから
ループの再帰なんだけど?
再帰「関数」にせよ、ループ再帰にせよ
再帰(帰納)定義を実装しなければならない

勝利 V(ブイ)!!

885 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 12:20:43.70 ID:miXQ60Mg.net]
>>860
おま、こうしか書けなくて
int hoge(){
 //処理
 return hoge();
}

こう書けないの?
int hage(){
 //再帰push処理
 int i = hage();
 //再帰pop処理
 return i;
}



886 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:25:45.01 ID:5yTvo1pN.net]
おくすり飲み忘れてるよNAS君
ハイの時間が長いほどローの時間が長くてひどいのは君が一番よく知ってるだろう

887 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 12:29:41.96 ID:miXQ60Mg.net]
ははは、論理で敵わないと、人格攻撃をして醜態をさらす

888 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:33:58.57 ID:8PjODHJ7.net]
>>864
こういっちゃなんだが、そう思ってるのは君だけだろう。
誰もがそれを逆に見てると思う。

889 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 12:36:27.22 ID:miXQ60Mg.net]
人格攻撃の書き込みが、書いた本人の醜態をさらしている以外のなんだと思うの?

890 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:37:41.03 ID:8PjODHJ7.net]
読むところはそこじゃないでしょ。
最初から読んだけど都合のいいことばっか書いたり読み飛ばしたり話変えたりってのが多いと思うよあなた

891 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 12:37:54.03 ID:miXQ60Mg.net]
>>865
>>861

892 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:39:49.40 ID:8PjODHJ7.net]
典型的な例がそれね

893 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:40:45.30 ID:8PjODHJ7.net]
一応言うけど、親切7割で書いてんだよ

894 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 12:46:22.23 ID:miXQ60Mg.net]
int sum = 0;
for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}
左辺のn+1項までの和を右辺のn項までの和を使って再定義します
他にどう読める?

895 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:49:12.16 ID:8PjODHJ7.net]
そんな話じゃない



896 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 12:50:45.59 ID:CQ0buOj1.net]
俺は親切10割で書いてるよ

897 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:53:54.77 ID:o0S33vFB.net]
再帰関数ってのは問題に対する言葉じゃなくて、それをどうコーディングするかに対する言葉

898 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 13:04:05.67 ID:miXQ60Mg.net]
ttp://akita-nct.jp/saka/lecturenote/2010/2e/text/recursive.pdf

再帰関数講義pdf

899 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 13:15:58.86 ID:VTGxMrVA.net]
なにそのURL。だからなんだ?
あからさまに>>871は再帰じゃないって書いてあるが

900 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 13:22:34.79 ID:1eGH5HCM.net]
スレ

901 名前:読んだ
現実を直視することって大切だよなって思いました
[]
[ここ壊れてます]

902 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 13:37:10.03 ID:8kAWPtv+.net]
int sum = 0;
for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}

これは明らかに再帰じゃないなw

これを再帰と説明しているページがアレば
いってくれ。

ないなら、黙ってろ。

903 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 13:38:20.61 ID:8kAWPtv+.net]
おっと、黙ってろっていうのは、
>>878に対してだけだだ。
別に>>878と関係ないことを話すのは構わない(笑)

904 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 13:45:24.53 ID:VTGxMrVA.net]
予測だが、抽象化や概念を扱うのが極端に苦手なんだろう
なのでそれを伴う会話、論理、もしくはそれ以前に単語の意味が理解出来ない

905 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 13:46:24.96 ID:miXQ60Mg.net]
ttp://akita-nct.jp/saka/lecturenote/2010/2e/text/recursive.pdf

再帰関数講義pdf

>>878
数列の和の再帰実装の項目が読めないの?

つづけて、

2.2 なぜ,再帰関数なのか?

再帰関数と繰り返し文のどちらを使ってもプログラムが書ける場合,
どちらを使うべきだろうか?
両方使える場合は繰り替えし文を使うべきである.
計算速度も早いし,メモリの消費も少ないからである.
ではどこで,再帰関数の登場機会があるのか.
単純な問題であれば繰り替えし文の方が良いが,
複雑な問題となると再帰関数で記述はできるが,
繰り替えし文ではプログラムが大変困難な場合がある.



906 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 13:48:14.91 ID:8kAWPtv+.net]
>>881
これのことだろうけど、
普通に、sumの中でsumを使っており、
そのsumの部分に再起するって書いてある。

/ / =========================
25 / / ユーザー定義関数 sum
26 / / =========================
27 i n t sum ( i n t n ) {
28
29 i f ( n == 1 ){
30 r e t u r n 1 ;
31 } e l s e {
32 r e t u r n sum ( n?1) + n ; / / 再帰する
33 }
34
35 }

907 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 13:49:21.03 ID:8kAWPtv+.net]
2 再帰関数とは
2.1 再帰関数の例
自分自身を呼び出す関数を再帰関数 (recursive function) という.また,自分自身を呼び
出すことを再帰呼出し (recursive call) という.言葉の定義はともかく,具体的な例を見て
みよう.



2.2 なぜ,再帰関数なのか?
再帰関数と繰り返し文のどちらを使ってもプログラムが書ける場合,どちらを使うべき
だろうか? 両方使える場合は繰り替えし文を使うべきである.計算速度も早いし,メモリ
の消費も少ないからである.で

908 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 13:51:10.04 ID:VTGxMrVA.net]
なんでループと再帰が同じって言ってるやつが、
両方使える場合はループだの、複雑なことは再帰だのになんだよ。
言ってることが支離滅裂。

909 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 13:57:22.43 ID:miXQ60Mg.net]
>>884
それはスコープスタックを

ループは保存しないで行ったっきり

再帰関数はpushして最下ノードまで行って
popして戻りつつ新たな下ノードのpush&pop検索をするからだよ

910 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 14:00:39.98 ID:VTGxMrVA.net]
>>878
この方法にしとけ

for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}
「これは再帰関数です」とか「これは再帰ではありません」とか明示的に書いてあるやつがいい
それなら理解出来るだろ

あと再帰やループの制御構造は、forやwhileや関数の呼び出しだからな。
決してsimではない

911 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 14:01:24.37 ID:VTGxMrVA.net]
>>885
保存しないのがループなんだろうが

912 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 14:07:04.25 ID:miXQ60Mg.net]
ttp://ja.wikipedia.org/wiki/%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%BD%E3%83%BC%E3%83%88
クイックソート

そんなに言うならループで書いてみてよ

913 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 14:20:43.68 ID:VTGxMrVA.net]
繋がりが分からん

914 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 14:21:51.14 ID:miXQ60Mg.net]
>>884
>>885
>>888

915 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 14:22:35.47 ID:VTGxMrVA.net]
ただの一度とて俺はループで何が出来るだの出来ないだの一覚えはない
頭大丈夫か?

で?ルールで書けってことは「ループじゃない物」があるってことだよな?
それをここにいるほぼ全ての人は再帰と読んでるわけだが



916 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 14:28:26.07 ID:miXQ60Mg.net]
>なんでループと再帰が同じって言ってるやつが、
>両方使える場合はループだの、複雑なことは再帰だのになんだよ。
>言ってることが支離滅裂。

>両方使える場合はループだの、複雑なことは再帰だのになんだよ。
これが支離滅裂と思うんなら、クイックソートをループで書いてごらん

917 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 14:47:29.00 ID:LToipCL/.net]
書くのはおまえだろうが。


918 名前:俺はループと再帰の区別してるから。
再帰はループとは別にあるし、再帰が良いと思った時は再帰だ。俺はな。
そして支離滅裂なのはそのURLじゃなくておまえだ。

おまえは区別しないなら全部同じ書き方でかけ。
ループと再帰と言う単語すら使うな。区別しないなら徹底的に区別するな。

それ以前に
for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}
これが再帰と書かれたサイトなり資料なり探し終わるまで黙っとけ。多数に言われてんだから。
[]
[ここ壊れてます]

919 名前:デフォルトの名無しさん [2015/09/06(日) 14:51:28.16 ID:pbpREKnW.net]
>>888
>>892

ループで書いた
peace.2ch.net/test/read.cgi/tech/1434079972/8

920 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 14:53:47.20 ID:LToipCL/.net]
知らんわんなもん
おまえはループと書くな。区別しないのだから

921 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 14:55:26.13 ID:miXQ60Mg.net]
分かってませんでしたって言うなら言えばいいよ
クイックソートのループ実装はムチャ振りだから

922 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 14:57:32.04 ID:LToipCL/.net]
なんの話だ?
関係ない話なら「後から」付き合うけど?
ごちゃごちゃ言ってないでさっさと探して来い。

923 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 14:59:58.98 ID:miXQ60Mg.net]
>>894
push&popって、わざわざ作ってループにするくらいなら
素直に再帰関数使えよ

push&popのループは実装にもよるけど再帰関数とほぼ同じ

924 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:00:49.47 ID:LToipCL/.net]
ループは再帰なのにループの実装は無茶振りねぇ
ふーーん

ま、これについても探してきてから相手してやるか

925 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:01:20.67 ID:miXQ60Mg.net]
>>898
>>885



926 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:03:20.65 ID:LToipCL/.net]
それはループと再帰を区別してるっていうんだよ。
単語が必要になった時点でな

927 名前:デフォルトの名無しさん [2015/09/06(日) 15:03:29.78 ID:JSf18249.net]
>>898
ループで実装しとけばpopの過程で残りの処理やらんでいいわってときに
処理を打ち切れるんだよ。そういう意味では再帰をループで実装する意味はあるかと。

928 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:03:31.85 ID:miXQ60Mg.net]
>>899
>>885
push&pop実装してループすりゃ良いけど、それなら素直に再帰関数使え

929 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:04:44.43 ID:8kAWPtv+.net]
2 再帰関数とは
2.1 再帰関数の例
自分自身を呼び出す関数を再帰関数 (recursive function) という.また,自分自身を呼び
出すことを再帰呼出し (recursive call) という.言葉の定義はともかく,具体的な例を見て
みよう.



2.2 なぜ,再帰関数なのか?
再帰関数と繰り返し文のどちらを使ってもプログラムが書ける場合,どちらを使うべき
だろうか? 両方使える場合は繰り替えし文を使うべきである.計算速度も早いし,メモリ
の消費も少ないからである.で

930 名前:デフォルトの名無しさん [2015/09/06(日) 15:05:50.49 ID:JSf18249.net]
>>903
再帰よりもループのが都合いいことあるんよ
関数呼び出しを途中で打ち切ること出来ぬでしょ

931 名前:デフォルトの名無しさん [2015/09/06(日) 15:06:30.03 ID:JSf18249.net]
>>904
これ。

932 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:06:41.80 ID:miXQ60Mg.net]
>>902
再帰関数に強制終了フラグを渡して
再帰呼び出しの直後にそのフラグをチェックすれば
強制終了できるけど?

933 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:09:02.09 ID:LToipCL/.net]
>>903
pushとpopでループさせるなんて一言も言ってないし、
再帰使わないとも一言も言ってないし、
どうゆう会話の繋がり構造してんだ?
本気で頭大丈夫か?

しかもそれ完全にループと再帰分けて考えてるよな

934 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:09:21.10 ID:miXQ60Mg.net]
>計算速度も早いし,メモリの消費も少ないからである
push&popを実装するなら、正直、コンパイラに任せたほうが早いかもよ

935 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:10:20.50 ID:LToipCL/.net]
>>907
馬鹿じゃねぇの
それは再帰として使ってるとは言わん
普通ではない事態だ



936 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:11:18.97 ID:LToipCL/.net]
>>909
それをお前はあたかもそうではないような書き込みしてたよな

937 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:15:01.76 ID:miXQ60Mg.net]
>>908

>>751
>>885

938 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:16:40.15 ID:LToipCL/.net]
それ俺の書き込みじゃないけど。
それと言葉に詰まると全く意味の分からない安価書くのやめれ

939 名前:デフォルトの名無しさん [2015/09/06(日) 15:17:02.84 ID:JSf18249.net]
>>907
アプリケーションを強制終了?
ちょっとそれはクソすぎると思うよ

940 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:20:07.58 ID:LToipCL/.net]
for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}
それとこれが再帰っつーのがお前の主張だからね。
話散らすのに一生懸命なようだけど。

941 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:22:44.17 ID:miXQ60Mg.net]
>>910

>>905
の振りだから
>>907
だろ

int recHoge(bool& esc){
 int i;
 //push処理
 i=rechoge(esc);
 if(esc) return i;
 //pop処理
 return i;
}

942 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:27:09.64 ID:LToipCL/.net]
>>916
あんな、出来る出来ないじゃなくて
関数として

943 名前:扱われるえき概念を、処理中の内部からスタック操作なんてしねぇんだよ []
[ここ壊れてます]

944 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:31:29.36 ID:LToipCL/.net]
んで結局、ループと再帰を区別しないと言うお前の主張は、
ループや再帰と言う単語を用いないとできないわけだね。
ふーーん

945 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:33:09.34 ID:miXQ60Mg.net]
何コメントが気に入らないの?

int recHoge(bool& esc){
 int i;
 //再帰のスタックがpushされている時の処理をここに書く
 i=rechoge(esc);
 if(esc) return i;
 //再帰のスタックがpopされている時の処理をここに書く
 return i;
}



946 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:34:42.95 ID:LToipCL/.net]
はい全然会話がつながってない。それは関係ない。

947 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:34:48.30 ID:miXQ60Mg.net]
>ループと再帰を区別しないと言うお前の主張
これが俺の主張だというならアンカくれ

948 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:37:06.65 ID:LToipCL/.net]
探すのめんどくさい。
しかし一つや二つではない


for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}
より確実なのはこっち

949 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:37:11.26 ID:miXQ60Mg.net]
>>920

>>917
じゃあ、↑がイミフ

950 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:40:50.25 ID:miXQ60Mg.net]
>>922
探せないなら
ループと再帰を区別しない
これはおれの主張じゃないからね

sumについては
>>856

951 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:42:44.84 ID:LToipCL/.net]
お前の理解度なんて知らんわ。
その話題の発端は俺じゃないからそこについて続ける気もしない。

952 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:44:30.52 ID:LToipCL/.net]
漸化式になってようとなってまいと再帰には関係ない

953 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:45:19.69 ID:LToipCL/.net]
お前の言い分だとプログラムのほぼ全てが再帰になる

954 名前:デフォルトの名無しさん [2015/09/06(日) 15:47:23.50 ID:JSf18249.net]
>>894
1個は末尾再帰なので単純にループでいいかと
https://ideone.com/r1BBhE

955 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:51:29.03 ID:miXQ60Mg.net]
広辞苑から
漸化式
数列または関数列のいくつかの要素の間に成り立つ一般的な関係式
公比rの等比数列a1,a2,...,an,...におけるan+1=ranの類

「再帰的定義: "再帰的定義"を参照」
 an+1=ran



956 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:51:35.63 ID:8kAWPtv+.net]
俺が某大学のテキスト探してきた。

大学のテキストだから書いてあることの
信頼性は高いだろう。

再帰関数講義pdf
akita-nct.jp/saka/lecturenote/2010/2e/text/recursive.pdf


2 再帰関数とは
2.1 再帰関数の例
自分自身を呼び出す関数を再帰関数 (recursive function) という.また,自分自身を呼び
出すことを再帰呼出し (recursive call) という.言葉の定義はともかく,具体的な例を見て
みよう.



2.2 なぜ,再帰関数なのか?
再帰関数と繰り返し文のどちらを使ってもプログラムが書ける場合,どちらを使うべき
だろうか? 両方使える場合は繰り替えし文を使うべきである.計算速度も早いし,メモリ
の消費も少ないからである.で

957 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:55:01.72 ID:LToipCL/.net]
>>929
そんな広辞苑は捨てな
しかもそれプログラム用語の再帰じゃないから。
そんなことも分かってないようだけど。

958 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:59:49.39 ID:miXQ60Mg.net]
ttp://ews2.cc.niigata-u.ac.jp/~takeuchi/tbasic/BackGround/Recursive.html

再帰処理

959 名前:デフォルトの名無しさん [2015/09/06(日) 16:00:19.25 ID:JSf18249.net]
日本語は文脈依存文法なので
同じ語句であっても文脈に応じて意味が変わるのよね。
再帰という同じ言葉であっても概念が異なっているのは明らかっすね。
変数への再帰的な代入と関数の再帰呼び出しとは違うものっすね。
プログラムで再帰といったときは関数の再帰呼び出しが一般的かな。

960 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 16:02:09.24 ID:miXQ60Mg.net]
再帰的とは

あるものが定義されている場合,

その定義の中に,更にその定義されるべきものが,
簡単化されて,含まれているとき,

それは「再帰的である」と言われます。
循環論法に似ていますが,少し違います。
再帰的はその部分に含まれるものが全く同じものではなくて,
簡単になったもので,最終的終了条件が明示されているものです。

961 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:02:41.93 ID:LToipCL/.net]
どうして100のうち1しかないものを持ってくる?
現場でそんな使い方してる人間なんていないだろよ

962 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 16:07:43.63 ID:miXQ60Mg.net]
漸化式が再帰だと思えないのは変な風に、頭が固いか、悪いか、なだけ

963 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 16:12:02.55 ID:miXQ60Mg.net]
つか、再帰「関数」のみが、再帰だと思ってるのが間違いだから

964 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:13:02.94 ID:LToipCL/.net]
再帰はただの定義。

自分自身を呼び出す関数を再帰関数 (recursive function) という.また,自分自身を呼び
出すことを再帰呼出し (recursive call) という.

関数として抽象化されいてそのように扱う人間がいて、
その上でその内部から自身を呼び出すものが再帰。
プログラムにおいて漸化式は再帰と関係ない。

そしてその主張をするメリットもそのように使用するメリットもなく、そのように単語を使う習慣ももメリットもない。

965 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 1 ]
[ここ壊れてます]



966 名前:6:14:07.91 ID:LToipCL/.net mailto: 再帰と書いた場合は再帰関数を示す。以後そうしとけ。 []
[ここ壊れてます]

967 名前:893 mailto:sage [2015/09/06(日) 16:21:21.57 ID:uhlPSgY9.net]
>>928
>単純にループでいいかと
うん,そのつもりだったんだが
さて >>928 で 配列 {3, 3, 5} をソートしてみてくれないか?

968 名前:デフォルトの名無しさん [2015/09/06(日) 16:23:38.18 ID:JSf18249.net]
>>937
会話をするときは相手がどういう概念を
述べているのか理解するようにしないと
言葉の表面から別の概念を連想して相手が間違いだと言っても
話が噛み合わないだけっすよ。

969 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 16:25:07.28 ID:miXQ60Mg.net]
>>760
この場合は、
再帰「関数」とループで、ほぼ等価な処理を書いたのだが
この処理は、どちらも再帰処理だよ
定義に忠実な書き方と、最適化された書き方で
ほぼ等価な漸化式の処理であって、これらの何が気に食わないの?

970 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:25:30.37 ID:fH7ggWtR.net]
ここまで狂ってるともう駄目だろ、、、
脳の一部は正常に機能しているようだけど、他の部分が完全に機能していない
そういうのを普通「発達障害」「アスペ」「ADHD」とか言うんだけどな
好きなのを取れ
要するに一生何をしてもこのままです

971 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:25:40.08 ID:8kAWPtv+.net]
俺がもう一つ見つけてきてやったぜ

ews2.cc.niigata-u.ac.jp/~takeuchi/tbasic/BackGround/Recursive.html

★再帰を使わない例

この階乗関数を Basic プログラムとして実現してみると,(Tiny Basic には階乗関数 Factorial が内蔵されていますから,
実際にこのようなプログラムを書く必要はありませんが。)

Function Kaijyou(n)
If n = 0 then
Kaijyou = 1
Else
Kaijyou = Kaijyou(n-1)*n
End if
End Function

となります。しかし,実は階乗関数は,再帰を使わなくても,
次のように実現することが出来ます。

Function Kaijyou(n)
F = 1
For i = 1 to n
F = F * i
Next i
Kaijyou = F
End Function

↑再帰を使わなくても,次のように実現することが出来ます。

972 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:28:08.20 ID:LToipCL/.net]
>>942
その発想がすでに狂ってる。

973 名前:デフォルトの名無しさん [2015/09/06(日) 16:29:29.10 ID:JSf18249.net]
>>940
やってみた。次は何をやればいい?服はもう脱いだ。
https://ideone.com/1x5POb

974 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:30:15.65 ID:LToipCL/.net]
また狂った勘違いされそうだけど、当然ながら記述どうこうの話ではない。
そんな話は一切していない

975 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:36:31.57 ID:fH7ggWtR.net]
正当な評価すら「人格攻撃」としてしか受け取れない
脳が狂っている度合いがひどければひどいほど、傍からみて「あ、こいつ完全におかしい」と
分かるようになるんだが、本人は1ミリも狂っているとは思っていない
病識が全くないわけだ

軽症だと治りやすいよ
でも末期のガンとか生まれつき片手がないとかはどうしようもないだろう
この後者に相当するのがこいつ



976 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 16:37:24.66 ID:miXQ60Mg.net]
論理で勝てないと人格攻撃で自分の醜態をさらす

977 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:38:50.50 ID:fH7ggWtR.net]
>>949
な、ほらそうだろ?お前、無職だろ?こんな奴雇う会社日本にねえよ
アメリカにでも行って一芸を買ってもらうこったな
でも見てたらその一芸すら怪しいようだが

978 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 16:39:04.92 ID:miXQ60Mg.net]
>>760
この場合は、
再帰「関数」とループで、ほぼ等価な処理を書いたのだが
この処理は、どちらも再帰処理だよ
定義に忠実な書き方と、最適化された書き方で
ほぼ等価な漸化式の処理であって、これらの何が気に食わないの?

さて?これのどこがどう狂っているのか説明してくださいな

979 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:39:14.91 ID:LToipCL/.net]
一番論理と遠いのはお前だよ
だからこうゆう展開になってしまう

980 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:40:05.81 ID:LToipCL/.net]
>>951
そこに結びつける発想。

981 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:40:52.39 ID:fH7ggWtR.net]
>>951
もうその発言だけで完全に狂ってると分かっちゃうよ

982 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 16:42:56.55 ID:miXQ60Mg.net]
感情的にではなく論理的に反駁してください

983 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:43:54.24 ID:LToipCL/.net]
だから狂った勘違いされないよう

984 名前:ノ「記述にもなんにも関係ない」と、
普通の人にはしないような備考をわざわざ付けたのに、それでも勝手に勘違いしてるだろ
それを指して狂ってるって言ってんだよ

だから何も会話が成り立ってない。関係ない思うを関係あると思う。
そして概念のつながりである論理のやりとりが出来てないのに自分が出来てないと気づかない。
[]
[ここ壊れてます]

985 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:45:18.24 ID:fH7ggWtR.net]
>>955
感情的にはまったくなっておりません
むしろ感情的になっているのはそちらの方だと思います
こういうのを「感情転移」と言います
もう少し言うと「投影機制」と言います

自分が感情的になっているのを認められないので、相手が感情的になっていると
錯覚してしまうのです
電車に乗ってて隣の電車が発車すると、自分の乗ってる電車が逆方向に動き出した
と錯覚するだろ?それとよく似ている



986 名前:デフォルトの名無しさん [2015/09/06(日) 16:47:03.14 ID:JSf18249.net]
>>955
それはこっちのセリフです!牛さんのように反芻してください!!
どうこれ?

987 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:48:22.69 ID:LToipCL/.net]
むしろ俺は書き始めた時の方が感情的だ
いまは至って冷静だ

988 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 16:48:38.17 ID:miXQ60Mg.net]
>>760
この場合は、
再帰「関数」とループで、ほぼ等価な処理を書いたのだが
この処理は、どちらも再帰処理だよ
定義に忠実な書き方と、最適化された書き方で
ほぼ等価な漸化式の処理であって、これらの何が気に食わないの?

だから↑がどう論理的に狂ってるか具体的にかけよ

989 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:49:14.49 ID:LToipCL/.net]
>>960
その発想だって言ってんだろ

990 名前:893 mailto:sage [2015/09/06(日) 16:49:40.04 ID:uhlPSgY9.net]
>>948
よくわかるが,今回の場合は反駁側も切れ味が悪い,揚げ足を取りきれていない
篭手狂人は「行っていることが正しい」可能性はないわけではない
問題は「不正確な表現」,百歩譲っても「表現が独特すぎて伝わっていない」

991 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:50:18.66 ID:fH7ggWtR.net]
>>959
あららここまでひどいとただの投影じゃなくて投影性同一視が入ってるみたいですね
境界性パーソナリティ障害とか自己愛性パーソナリティ障害も併発してるようです
投影性同一視とは他人を利用した自己嫌悪です
本当は自分を嫌悪したいのですがどうしてもそれが嫌なのでまともな他人を嫌悪します
これはしばしば犯罪に発達します
危険ですよ

992 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:51:40.98 ID:fH7ggWtR.net]
>>962
だとすればまあちょっとは自覚があるんじゃないですかね
そうなると治療すれば治る可能性もあるのに惜しいですね
このまま人生を棒に振っちゃうようで

993 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:53:01.63 ID:fH7ggWtR.net]
よく犯罪者が言ってるじゃないですか
「俺は悪くない!悪いのは社会だ!」
裁判所でそれ叫んでみてくださいよ
誰も認めちゃくれませんから

994 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:57:12.75 ID:LKKBkxwK.net]
これ、まさか次スレもやるつもりですか?

995 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2015/09/06(日) 16:57:13.89 ID:0zNPIayW.net]
プログラミングの現場で再帰と言ったら再帰関数や再帰呼び出しのこと。
情報科学で漸化式は再帰的定義であると言える。
しかし、プログラミングでプログラムに書いた漸化式を「再帰処理」と言うと、
初心者にとって混乱極まりない上に迷惑であり、不適切な表現である。



996 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 16:59:16.85 ID:miXQ60Mg.net]
>>960

>>760
のようにほぼ等価な処理が書けるのに
再帰「関数」で実装されたもののみが「再帰処理」だとしたら
ループで最適化実装されたものは「ループ処理」で
再帰処理とは違う処理なのですか?

997 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:00:59.76 ID:LToipCL/.net]
>>960
それ自体が関係ないのになぜその書き込みを引っ張る?
その処理が気に食う気に食わないの話はどっから出てきた?
なんで急に脈絡なくその書き込みの話をする?
漸化式は関係ないからって言われた直後、なんでその相手に自慢げに漸化式の話をする?
定義に忠実がなんだ?だからどうなんだ?満たされるのはお前の自己満足だけだろ
しかも

998 名前:自分の思い込みだけで狂ったように連呼する定義。
最適化?誰がそんなの望んだ?誰がそんな話した?噛み合ってないよな。


狂ってるんだよ
狂ったものは論理と最も遠い。
論理じゃないものに対して論理では答えられない。
[]
[ここ壊れてます]

999 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:05:43.20 ID:aWMMHCvX.net]
>>968
そう。

そしてさらに、関数は処理だけを指すものではない。
人間側が関数を関数と言う概念として扱い、そのように人間が振舞うことで初めて関数は関数になる。
当然それと同等の物が再帰にある。

普通はこんな説明不要だが、お前はこの説明も受けておく必要がある。

1000 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:05:55.81 ID:8kAWPtv+.net]
とりあえず俺が見つけてきた解説をみて。
再帰とは何かを勉強した方がいい。

ews2.cc.niigata-u.ac.jp/~takeuchi/tbasic/BackGround/Recursive.html

★再帰を使わない例

この階乗関数を Basic プログラムとして実現してみると,(Tiny Basic には階乗関数 Factorial が内蔵されていますから,
実際にこのようなプログラムを書く必要はありませんが。)

Function Kaijyou(n)
If n = 0 then
Kaijyou = 1
Else
Kaijyou = Kaijyou(n-1)*n
End if
End Function

となります。しかし,実は階乗関数は,再帰を使わなくても,
次のように実現することが出来ます。

Function Kaijyou(n)
F = 1
For i = 1 to n
F = F * i
Next i
Kaijyou = F
End Function

↑再帰を使わなくても,次のように実現することが出来ます。

1001 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 17:06:58.08 ID:miXQ60Mg.net]
>漸化式は関係ないからって言われた直後、
>なんでその相手に自慢げに漸化式の話をする?

漸化式から再帰処理コードを組み立てる
スタックオーバーロードがあるから、再帰関数は奥の手で
ループで書けるならそれに越したことはない
ループでひどく複雑になるようなときに、再帰関数で書く

1002 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:08:24.25 ID:8kAWPtv+.net]
そして、もう一つの解説。俺が某大学のテキスト探してきた。

大学のテキストだから書いてあることの
信頼性は高いだろう。

再帰関数講義pdf
akita-nct.jp/saka/lecturenote/2010/2e/text/recursive.pdf


2 再帰関数とは
2.1 再帰関数の例
自分自身を呼び出す関数を再帰関数 (recursive function) という.また,自分自身を呼び
出すことを再帰呼出し (recursive call) という.言葉の定義はともかく,具体的な例を見て
みよう.



2.2 なぜ,再帰関数なのか?
再帰関数と繰り返し文のどちらを使ってもプログラムが書ける場合,どちらを使うべき
だろうか? 両方使える場合は繰り替えし文を使うべきである.計算速度も早いし,メモリ
の消費も少ないからである.で

1003 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:08:25.12 ID:aWMMHCvX.net]
>>972
だからその発想が狂ってる。
そんな話はしていない。

だから論理にならない

1004 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 17:13:29.91 ID:miXQ60Mg.net]
>>970
>>760
あのさ、このπを求めるコードで、まず関数入出力を見て
実装が、再帰関数実装とか、ループ実装とか、
普通、いちいち、そこまでこだわらないと思うんだけど
こだわるのは、精査検証が必要なときだけだろ

精査検証なら
>>972

1005 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:14:49.58 ID:fH7ggWtR.net]
>>959
酒買ってきた
まさにこれだよな
「論理的じゃないものに対して論理では答えられない」
狂ってる奴が「論理的に反駁してください」と言っているのを聞くと笑いそうになる

あのさあ・・・まず先に論理的に話すべきなのはそちらじゃないかね、って
でもそれが全く出来ない
だから発達障害なんだよ



1006 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:15:55.83 ID:fH7ggWtR.net]
ちごた
×>>959
>>969

>狂ってるんだよ
>狂ったものは論理と最も遠い。
>論理じゃないものに対して論理では答えられない。

俺が言いたい事と全く同じ

1007 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2015/09/06(日) 17:16:46.42 ID:0zNPIayW.net]
関数かループかは実行スピードに大きく影響する。円周率を求めるプログラムではスピードが重要。

1008 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:17:41.58 ID:8kAWPtv+.net]
俺が持ってきた再帰の定義について
反論ができなくなってしまっているようだなw

ews2.cc.niigata-u.ac.jp/~takeuchi/tbasic/BackGround/Recursive.html

★再帰を使わない例

この階乗関数を Basic プログラムとして実現してみると,(Tiny Basic には階乗関数 Factorial が内蔵されていますから,
実際にこのようなプログラムを書く必要はありませんが。)

Function Kaijyou(n)
If n = 0 then
Kaijyou = 1
Else
Kaijyou = Kaijyou(n-1)*n
End if
End Function

となります。しかし,実は階乗関数は,再帰を使わなくても,
次のように実現することが出来ます。

Function Kaijyou(n)
F = 1
For i = 1 to n
F = F * i
Next i
Kaijyou = F
End Function

↑再帰を使わなくても,次のように実現することが出来ます。

1009 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 17:17:44.80 ID:miXQ60Mg.net]
ttp://ews2.cc.niigata-u.ac.jp/~takeuchi/tbasic/BackGround/Recursive.html
再帰は使うべきか
このように見てくると,再帰プログラムは効率の良くないプログラムと思うかもしれません。
実はある意味ではその通りです。それでは使う必要のないものなのでしょうか?
これも使わなくて良ければと言う前提に立てばその通りです。
一般に次のことが言えます。
•再帰プログラムは計算機に負荷をかけるプログラムである。
•時によっては,膨大な負荷をかけることもある。
•簡単に非再帰プログラムとして書けるものは再帰プログラムを使うべきではない。
それでも,再帰プログラムが基本的であると言われるのは何故でしょうか。
それは再帰プログラムが大きな力を秘めているからです。つまり
•再帰プログラムでは簡単に書けるが,非再帰プログラムはかなり複雑なプログラムになってしまうようなものがある。
ということです。
このような問題が意外とあるのです。再帰プログラム技法を,身につけたら,プログラミングを行う際,次のような視点で考えるのが良いかもしれません。
•まずは,非再帰プログラムで問題を考えてみる。
•難しいと判断した場合,再帰プログラムで考えてみる。

1010 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:18:47.18 ID:8kAWPtv+.net]
そして、もう一つの解説。俺が某大学のテキスト探してきた。
自分自身を呼び出したものが再帰なのだ。

大学のテキストだから書いてあることの
信頼性は高いだろう。

再帰関数講義pdf
akita-nct.jp/saka/lecturenote/2010/2e/text/recursive.pdf


2 再帰関数とは
2.1 再帰関数の例
自分自身を呼び出す関数を再帰関数 (recursive function) という.また,自分自身を呼び
出すことを再帰呼出し (recursive call) という.言葉の定義はともかく,具体的な例を見て
みよう.



2.2 なぜ,再帰関数なのか?
再帰関数と繰り返し文のどちらを使ってもプログラムが書ける場合,どちらを使うべき
だろうか? 両方使える場合は繰り替えし文を使うべきである.計算速度も早いし,メモリ
の消費も少ないからである.で

1011 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:20:26.48 ID:aWMMHCvX.net]
>>975
はいここでまた関係ない話になる。
今してる話は何が再帰か(定義と概念)、であって、
手段の問題ではない。
当然>>972もなんの関係もない。

1012 名前:ただの手順。

そんな考えだから再帰中に再帰中の内部記憶を操作するとような発想を平気でする。
再帰を再帰として扱ってはいない。これは概念の問題。
再帰を扱う人がそれを再帰扱いしなければ、当然それは再帰ではない。

再帰かどうかと言うのはそういった所でも大きく区分けされる。
[]
[ここ壊れてます]

1013 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 17:24:43.59 ID:miXQ60Mg.net]
>>982

>>932
>>934

1014 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:27:47.47 ID:aWMMHCvX.net]
だからその返信に詰まった時に安価書くのやめれっつーの
お前の再帰の定義が問題扱いされてるのに、
自分の正当性を得るために自分の定義を証明手段に使ってどうする
馬鹿なのか

1015 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:28:54.74 ID:1q8+1kZD.net]
>>984
自分が狂ってる事を正当化するために自分が書いた狂った定義を持ち出すのは
もはや負けを認めているのに等しいよな



1016 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 17:29:38.53 ID:miXQ60Mg.net]
>>932
のリンクの大学教授の定義をコピペしたのが
>>934


1017 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:32:05.22 ID:1q8+1kZD.net]
>>986
今度は権威を使うのか
"虎の威を借る狐"
でもその虎が狂っていたらどうなる?ただの殺人虎だ

1018 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:34:21.82 ID:8kAWPtv+.net]
>>986

> >>932
> のリンクの大学教授の定義をコピペしたのが
> >>934
> だ

>>932のリンクってこれだよね?
ews2.cc.niigata-u.ac.jp/~takeuchi/tbasic/BackGround/Recursive.html
★再帰を使わない例
この階乗関数を Basic プログラムとして実現してみると,(Tiny Basic には階乗関数 Factorial が内蔵されていますから,
実際にこのようなプログラムを書く必要はありませんが。)

Function Kaijyou(n)
If n = 0 then
Kaijyou = 1
Else
Kaijyou = Kaijyou(n-1)*n
End if
End Function

となります。しかし,実は階乗関数は,再帰を使わなくても,
次のように実現することが出来ます。

Function Kaijyou(n)
F = 1
For i = 1 to n
F = F * i
Next i
Kaijyou = F
End Function
↑再帰を使わなくても,次のように実現することが出来ます。

1019 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:34:24.36 ID:aWMMHCvX.net]
もう一度教えてやろう。
それは普通は使わない定義

1020 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 17:34:49.74 ID:miXQ60Mg.net]
だから、お前らは、俺に対して、感情的反駁しかしてねーし

1021 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:36:03.31 ID:1q8+1kZD.net]
>>988
うはw
捏造入ってたのか
こりゃちゃんとリンク先見ないとな

>>990
何回でも言います
感情的になってるのはそっちです

1022 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:37:16.64 ID:1q8+1kZD.net]
再帰定義は、ありまぁーす!みたいな展開になってきたな

1023 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 17:37:25.62 ID:miXQ60Mg.net]
>>989
算数からやり直したらどう?
算数→数学→情報処理となって
再帰定義がなんぞやって定義されているんだよ

1024 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:37:27.94 ID:aWMMHCvX.net]
あと答えられなくなったとき必ず
答えなくなったり話散らすね。
直接的に繋がりのある返答はかなり珍しい

他の人が増えてきて読みにくいんで終わり

1025 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:38:07.17 ID:uhlPSgY9.net]
>>946
おーうまくいくね>>984 では,これに苦心したんだが‥



1026 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:38:14.61 ID:aWMMHCvX.net]
>>993
数学用語とプログラム用語は別物だと言ったはずだ

1027 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 17:39:58.36 ID:miXQ60Mg.net]
>>996
お前の中ではな

1028 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:40:39.85 ID:aWMMHCvX.net]
ついにそうゆうことしか書けなくなったわけだね

1029 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:40:58.46 ID:1q8+1kZD.net]
>>993
おやお前数学出来るのか
じゃあマクスウェルの方程式とかナビエ・ストークスの方程式の意味は説明出来るんだよな?

1030 名前:デフォルトの名無しさん [2015/09/06(日) 17:41:53.70 ID:LZy823VQ.net]
暇人か

1031 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:42:12.67 ID:1q8+1kZD.net]
>>994
自分を守るのが精一杯でちゃんと他人の質問に答えれなくなってるよな

1032 名前:1001 [Over 1000 Thread.net]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

1033 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前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