なあ、再帰関数好きな人いる? パート3 [転載禁止]©2ch.net
再帰と繰り返しは相互に変換可能なんだから、再帰で実行時間が読めないならば、繰り返しでも読めない。 こんなじょうしきも知らないの? 再帰はシステムダウンの危険がある。 処理速度もはるかに遅くなる。 再帰の場合には、こうした実行時間が読めない特有の問題点がある。 > 再帰はシステムダウンの危険がある。 そう言う環境ならば、システムダウンの可能性は繰り返しでもある。 > 処理速度もはるかに遅くなる。 ヘボが作った繰り返しは再帰よりはるかに遅い。 普通の言語は対応してる 変な言語は使うもんじゃない # 1 def f if 条件 処理 else f() end end # 2 def f if 条件 f() end end # 3 def f case 条件 when LABEL f() end end 末尾再帰されるパターンわからない奴wwwwwwwwwwwwっうぃる? ID:EjHtX5K0のような白痴ばかりだから 再帰厨だと馬鹿にされることになる。 再帰を愛して使うんだったら、 ループ版にはない深刻なデメリットがある事ぐらいちゃんと注意した上で、 効率や安全性を無視したプログラミングを楽しむべき。 繰り返しの唯一の利点は回数の制御が再帰よりも容易であること。 これ以外の利点はない。 バカにはそれが理解できないらしいが。 再帰はID:zNzoBoA2のように低知能には理解不能という弱点があるけど ID:zNzoBoA2のような低知能の出現率は低いので全然問題無い むしろ低知能者を検出試験としてのメリットの方が大きい もし再帰が理解出来たつもりなら、ちゃんとループに直せるぐらいのプログラミング技術は備えなくちゃ。 最低でもそれくらいの技術や知能が無ければ 再帰を楽しむことはできないよ。 「再帰には深刻なデメリットがある」キリッ なんて発言する低知能人は再帰を理解してるはずが無い、理解不能なものを怖れている。未開人と同じ。 ループを恐れるのは、ループにするだけの知識・経験を欠いているから。 その程度じゃあプログラミングの世界からすぐに消えるだけの存在。 再帰厨は、現実で満たされないのでスレで妄想を垂れ流すことしかできないクズ。 関数内にjmpも好き勝手にやるタイプだからどうとも言わんけど、 再帰否定派はまさか単一のアーキテクチャの話してないよな? アルゴリズムとして再帰がイケてないって話だよな? >>186 必死で再帰を否定しているバカを弄っているだけで、繰り返しを否定しているわけでは無い やっぱり低知能なんだな。 みなさん、これが「弄ってるって言いたいバカ」ですw 迷信を信じ込んで再帰を否定してるバカが 深刻なデメリット(爆笑)、例えば > 処理速度もはるかに遅くなる。 を、実証すればスレ終了するのに。 >>191 そういう超基本的なプログラミング知識が無いのに なんでプログラム板にいるの? そもそもプログラミング経験無いだろ、お前。 異様に伸びてると思ったら深刻な問題祭りかい いくらでも例外は挙げられるけど 再帰で書こうがループで書こうが計算時間や空間計算量はそんなに変わらんから 書きやすく、読みやすい方で書いたほうが良いんじゃない? そんなに変わらないって言うのは十分大きな入力に対して精々2〜3倍以下に納まるって意味だからね。 1時間掛かる処理を20マイクロ秒速くする為にごちゃごちゃ書き換えるのは結構な事だけど。 はるかと言っても所詮定数倍でしょ。 しかも一桁違うケースは 関数呼び出しがやや高価なスクリプト系の言語でもほとんどないでしょ。 >>193 いやね,絶対的に再帰でないと書けない,いや非常に書きにくいものはあるのは確かで. たとえば代数式の解析を非再帰的で記述しろといわれると「はたして出来るのか??」と逡巡してしまう. こういう話題があまり発展しないのはどうしたわけですかね 関係ないけどquick-sort を三項演算子とコンマ演算子で書く話題,誰か‥私は挫折した‥ 再帰の深刻なデメリットと言えば、コンパイラ設計者が甘えてる事によってバグを触ったり 異常に速度遅くなるパターンが放置されてたりする事 なんの言語とは言わないけど それは再帰のデメリットではなくそういうクソコンパイラしかない言語のデメリット >>192 能書きはいいからとっとと実証しろ。超基本的な知識なんだろ。 「はるかに遅い」とか言ってるバカ仲間のサイトでも良いぞ。 >>197 なんか食パン裏返してこっちが表だとか必死に言ってるようなレスだな >>201 こうするとなかなか興味深いことになるね。 本当に興味深いと思ってるだけで他意は無いよ。 fun_rec(){ if [ $1 -gt 5000 ] ; then time fun_for return fi fun_rec $(( $1 + 1 )) } >>203 たしかにおもしろい。 再帰の深さに比例して時間がかかる。 再帰が深くなると処理に時間がかかるようになるのか、 別の時間を測ってしまっているのか。わからん。これはわからん。 >>201 必死で再帰否定してるバカは知能が低いというエビデンス乙 シェル関数は呼び出しのたびに名前解決するのでペナルティが大きい Cの場合は入った時にフレーム作成と出る時にフレーム復元 c86なら、レジスタ操作4ステップ(複合命令なら2ステップ)だ。 名前解決なんかリンク時に終わってる。 最近の関数呼び出しは引数をスタックに積まずにレジスタ渡しみたいだから 再帰で何段ネストしちゃっててもレジスタに収まってる限りは爆速なんじゃね 名前解決まで計算時間に含めるなら もう再帰云々じゃなくて長大な再帰なしの一つの関数で全部こなせって話になるんだがな >>207 いや、そうはならない。 レジスタの退避が必要になるから、自己再帰するならどっちにしても同じだけpush/popは必要になる。 最適化が掛かったらその限りじゃないけど。 >>205 呼び出しだけじゃなく参照もね、iの。 localでもスタックフレームなめてるのかな? >>209 スタッフフレームは再帰に必要なステップだから、再帰のペナルティとしてあえて受け入れた。 シェルスクリプトを持ち出した時点で「スタックは容量制限が厳しい(場合もある)リソース」 を自分で否定しちゃうところが再帰否定してるバカが低知能であるもう一つのエビデンス(笑) (場合もある)を知らないのか、教わってないのか知らないが、全ての場合だと思い込んでるところもバカの、特徴だね。 >>210 再帰で書いた何の変哲もないフィボナッチ関数をビルドしたケースを示すよ https://gist.github.com/pixie-grasper/ba2d0ade523b8599c182 gccではr12を、clangではraxを、rbp/rbxの他に退避してるのが分かる。 そんな事をすると 既に退避させてある値を別なレジスタに退避させてから、退避させたい値を退避するコードを吐く羽目になるけど レジスタが最低でも加算無限個無いと出来ないからね。仕方ないね。 externしていないstatic関数とかならレジスタ渡しもふつうにある。 もちろんCランタイム・コンパイラによる >>204 bashはダイナミックスコープだから再帰の深いところでは 変数の参照に時間がかかるのかな。いまはその辺を疑ってる。 だいたい再帰で問題が無いなんて クイックソートで再帰が役に立たない事すら知らないってことか? 処理件数が増えたら速度の差なんて、何万倍どころじゃないし。 >>219 ファーwwwwwwwwwwwwwwwwwwwwwwwwwww >>222 きったねえソースだな。どこの糞コード持ってきてんだ。 見せてやるよ、本気のクイックソートってやつをな。 void qsort(int a[], int left, int right) { int i, last; if (left >= right) return; swap(a, left, (left + right) / 2); last = left; for (i = left + 1; i <= right; i++) if(a[i] < a[left]) swap(a, ++last, i); swap(a, left, last); qsort(a, left, last - 1); qsort(a, last + 1, right); } >>223 10000倍高速化の比較対象はそれでも良いぞ。 一万倍とかwwww どこをどうやったら一万倍差がつくんだ >>225 クイックソートの最悪の時間計算量はn^2なので データによってはとても大変なんよ。 アルゴリズムの抽象化に静的言語使うチンパンとか話にならないから(´・ω・`) def qsort a , left , right return if left >= right swap a , left , (left + right) / 2 last = left (left + 1).step(right) do |i| if a[i] < a[left] swap a , last+=1 , i end end swap a , left , last qsort a , left , last - 1 qsort a , last + 1, right end >>225 最低10000倍ね。笑 >>219 >処理件数が増えたら速度の差なんて、何万倍どころじゃないし。 あ、小学生のように0.0001万倍とか言い逃れるかも。爆笑 ID:u0B3Sjd8 10000倍の高速化まだ? 常識的で簡単そうな口ぶりだったけど。 万は間違いだったとしても、最低でも倍速は楽勝なんだろ。 >>232 速度以前に >>223 は簡単にスタックオーバーフローするよ。 それを防ぐ方法を教えてやってよ。 >>233 繰り返し版が明示的スタックに使うヒープと同サイズに マシンスタックの上限を変更すればOK いや、君に言ったわけじゃないし、最適化を教えてやれってことなんだけど。 >>233 バカなの? >>222 読めないの? 10000倍の高速化まってんだから、くだらねー横槍入れないように。 お前が10000万倍高速化するならかまってやんよ。 >>226 繰り返しか再帰かに関係ないがな。 pivotの選び方次第だろ。 それは明示的にスタック使う繰り返し版クイックソートでも同じ。 >>238 >>225 に対するレスとして >>226 はおかしいだろ。 気にならんのか? >>240 最悪パターンでもよいから、10000倍高速化しろよ。 スキルない人間をいくら叩いても何も出てこないのに ここは動物園かよ 再帰を必死に否定しているバカの主張 1 スタックが制限の厳しいリソースである環境が全てだと思い込み、再帰の致命的なペナルティだと主張する 2 シェル関数呼び出しをエビデンスとして、再帰が130倍遅いと主張する 3 再帰版のqsortは数万倍遅いと主張するが、数万倍速いはずの非再帰版を示さない 4 知能が低く再帰を理解できない。それをもって再帰は難解と主張する。 >>245 そうやって執拗に絡むのもはっきりいって馬鹿丸出しだよ。 せっかく相手がクイックソートのコードを書いてくれたんだから そのコードの問題点を指摘する方が賢そうに見えると思ったんだけどね。 >>246 さらなる意味不明なバカが出てきたな。 コード出したのは再帰を必死で否定してるバカじゃないぞ。 最初期は再帰をサポートしてなかった計算言語があるらしい 今はハードウェアレベルで再帰が実装されてるからな。 それを思えばいかに再帰が本質的にプログラミングに必要とされてるかってことだな。 計算可能性を探求する試みにおいて最初に出たのが、 エルブラン・ゲーデルの一般帰納関数だからね。 次がラムダ計算。 その次がノイマン型計算機直系の先祖であるチューリングマシン。 10000倍だっておとなしいぐらい。 再帰だと落ちまくるから∞倍だって当たり前だろ。 メモリ足りないなら動かないのは再帰もループも変わらんだろ。 ループのほうが本質的にメモリ使用量少なくなるとかなら話は変わってくるが。 これだね。本当に知能が低い。 > 1 スタックが制限の厳しいリソースである環境が全てだと思い込み、再帰の致命的なペナルティだと主張する >再帰もループも変わらんだろ。 なんで試してみないんだ? 再帰とループでクイックソート ループ方式なら、データが何千万件あろうと無問題 覚えたての知識を使ってレスバトルするだけのスレなんていらねーから いらないスレを使って自分の意見を垂れ流すとか有効活用乙としか >>252 再帰の方は、関数呼び出し大量に発生するから、リターンアドレス待避とレジスタ待避に、メモリーが喰われる。 >>259 ループの方は今どの範囲についてソートしているのかという情報が大量に発生するから同じ議論が成り立つ訳だが。 >>260 ループはヒープ、再帰はスタック つまり、ヒープとスタックがぼくらを助けてくれるんだ! >>254 >>222 (再帰版qsort)で5000万件ソートしてみた。楽勝で終了する。 必死で再帰を否定しているバカが低知能だという事がまた証明されてしまった。 頭が悪いって本当にかわいそう。 >>262 再帰版でうまくいくのだったら非再帰版ではもっとうまくいく,という発想はないのかね? >>263 うまくいくって言ったって高々定数倍速くなるだけだろ? 非再帰版を書いたり保守したりするコストより新しい速いマシンを買ったほうが安く上がるって発想は無いのかね? >>263 知能障害者って本当にかわいそう。 5000万件でソート出来てるってことは、「再帰はスタックあふれる」という迷信が嘘だという発想には至らないのかね。 クイックソートの深さの制御はすでに研究し尽くされてて、全然問題ないんだよ。 read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる