なあ、再帰関数好きな人いる? パート3 [転載禁止]©2ch.net (914レス)
上下前次1-新
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
1(1): デフォルトの名無しさん [] 2015/11/28(土) 18:51:38.86 ID:Rc2MJzM/(1) AAS
なあ、再帰関数好きな人いる?
890(1): ◆QZaw55cn4c [sage] 2021/01/13(水) 21:38:42.47 ID:DfoNX22P(1) AAS
>>889?
kwsk
ループ変数は再帰関数でも必要なのでは?
891: デフォルトの名無しさん [sage] 2021/01/14(木) 06:32:41.62 ID:7/cCpBde(1) AAS
どんどんスタックにつめば確かにループ変数はいらない
ただ、人間のためにループ変数はあった方かいいと思うけど
892(1): デフォルトの名無しさん [] 2021/01/27(水) 21:57:40.49 ID:fE6h5Ua/(1) AAS
再帰関数を理解したとき、最初にこれ考えたやつは天才だと思ったね
実行速度やスタック問題はともかくコードは見ていて美しい以外の何者でもない。
893: デフォルトの名無しさん [sage] 2021/01/28(木) 02:47:34.69 ID:ggjwGOj3(1) AAS
CやUnix、オブジェクト指向なんかよりもはるかに古いんだよな
最初に実装されたのはlispかな
メモリを食いすぎるのでおもちゃしか動かなかったようだが
894: デフォルトの名無しさん [sage] 2021/01/29(金) 03:09:35.61 ID:5NtPwDh4(1) AAS
今の時代メモリ食いすぎても動くし遅くもならないよな
1億再帰とかやったら話は別だけど
895: デフォルトの名無しさん [sage] 2021/07/16(金) 14:24:10.16 ID:S3gddm5/(1/2) AAS
>>890
要らない
/* n の階乗を求める */
int fact(int n)
{
if(n==0){
return 1;
} else {
return fact(n-1);
}
}
実質ループする処理だけど、ループの回数数えるための
変数は一切出現しない。なおかつ n は不変。
896(1): デフォルトの名無しさん [sage] 2021/07/16(金) 14:26:08.03 ID:S3gddm5/(2/2) AAS
おお、"n*" を忘れた。こんな短い関数にバグ突っ込む俺(泣)
897(1): デフォルトの名無しさん [sage] 2021/07/19(月) 22:18:11.50 ID:hlpOkuZF(1) AAS
くだらん処理にスタックを使いたくないのでわしは使わん
ライブラリが殆ど無いマイナーCPUのマイナーCコンパイラでQuickSortを書いた時くらいじゃケケケ
898(1): デフォルトの名無しさん [sage] 2021/07/22(木) 20:45:12.08 ID:sSLTRpJ4(1) AAS
最近じゃオプティマイザがなるべくスタック使わないように
最適化してくれるんじゃなかったっけ?
899(1): ハノン ◆QZaw55cn4c [sage] 2021/07/25(日) 23:45:12.36 ID:rUybnQpf(1) AAS
>>898
末尾再帰ならそうだと思いますが、末尾再帰でなければ無理でしょう >>896-897 は末尾再帰じゃないから最適化されにくい、というか、されない
900: デフォルトの名無しさん [sage] 2021/10/02(土) 15:46:41.87 ID:qz0ghb/n(1/3) AAS
>>88(3): デフォルトの名無しさん [sage] 2015/11/28(土) 20:39:12.74 ID:R0seH/nX(3/13) AAS
ループより再帰のほうが抽象度が高いと言っている?
そこは俺にはよくわからん。
俺的にはプログラムには必要最小限の機能を使うべきで、
本質的にループより再帰のほうが強力なのだから
可能な限りループを使うべきと思ってる。
もちろん再帰をループにするためにスタックを自前で用意するといったことでは本末転倒だが。
ループと再帰の能力は同じです
かなり古い計算論の結果です
901: デフォルトの名無しさん [sage] 2021/10/02(土) 15:52:22.08 ID:qz0ghb/n(2/3) AAS
>>892
ゲーデル先生
902(1): デフォルトの名無しさん [sage] 2021/10/02(土) 16:12:27.49 ID:qz0ghb/n(3/3) AAS
>>899
結合法則を仮定していいドメインなら
CPS変換を用いて最適化する手法が随分前からあります
結合法則はGPU並列化でも使われてます
浮動小数点の場合は工夫しないと誤差が変わりますが
ちなみにC++ conceptの初期案でもaxiomで法則を記述出来ました
903(1): ハノン ◆QZaw55cn4c [sage] 2021/10/02(土) 20:52:53.81 ID:7AkA9F3V(1) AAS
>>902
scheme の継続渡しに関係しますか?
キーワードありがとうございます
904: デフォルトの名無しさん [sage] 2021/10/04(月) 21:48:56.27 ID:tW+d3xqB(1) AAS
>>903
そう
Continuation-passing style, defunctionalization, and associativity
Categorical Structure of ContinuationPassing Style
この辺のサンプルプログラム読んで
905: デフォルトの名無しさん [sage] 2021/11/01(月) 12:26:41.37 ID:ZNnEkaFK(1) AAS
履歴をとってるループが再帰
906: デフォルトの名無しさん [] 2022/09/07(水) 22:59:05.75 ID:hj8+EGae(1) AAS
すき
しかし再帰絶対書かないマンが思いの外多くて草生えるわ
末尾最適化できない再起をループに展開したって結局キューだのスタックオブジェクトでヒープ使うわけで
メモリ大幅に節約できると勘違いしてる基地外とか話にならん
再帰深度がたかだか1000段とかでスタックフレームにデカいオブジェクトブチ込んだりしなきゃ
素直に再帰で組むのがいいに決まってるじゃないか
数学的演算でもしない限り業務用でスタック溢れるケースを探す方が大変
907: デフォルトの名無しさん [] 2022/09/08(木) 09:28:47.03 ID:JEMfdspa(1) AAS
スタックとヒープは別物
共有してるアーキテクチャもあるが
908: デフォルトの名無しさん [sage] 2022/09/08(木) 13:02:30.59 ID:o4zCWVHV(1) AAS
ループに展開できる処理をわざわざ再帰で書く奴も大概やけどな。
909(1): デフォルトの名無しさん [sage] 2022/09/08(木) 15:04:24.55 ID:wt4RcFVD(1) AAS
展開できないものあるの
910: ハノン ◆QZaw55cn4c [sage] 2022/09/11(日) 14:15:38.74 ID:gVwBfSXr(1) AAS
>>909
二方向に再帰するもの、は展開に苦労しますね
式の評価は、再帰じゃないと書けないですね
911: デフォルトの名無しさん [sage] 2022/09/15(木) 12:56:10.95 ID:LWNlvRIc(1) AAS
てst
912: デフォルトの名無しさん [] 2024/01/02(火) 13:18:51.50 ID:yx0oLXiq(1) AAS
再帰的データ構造は再帰でたどるのが楽なんだけど
ループで処理したほうが途中で抜けたり処理を組み合わせやすい
そこで再帰的な処理を遅延リストと組み合わせてループで処理するやり方がいまでは一般的な気がする
こういうふうに C#
外部リンク:paiza.io
913: デフォルトの名無しさん [sage] 2024/01/04(木) 11:34:09.71 ID:iR4GsMlV(1) AAS
何が一般的なのか知らんがかなり変態的なコードだな
ループでGetEnumerator呼び出したりMoveNextの戻り値を見ずCurrentを取り出したりは一般的じゃないぞ
つーかバグだろそれ
914: デフォルトの名無しさん [sage] 2024/11/23(土) 05:47:56.88 ID:dIdD47Ip(1) AAS
将棋やオセロ、ぷよぷよなんかは再帰処理使うよね
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.023s