アカウント名:
パスワード:
これ、ループじゃないですよね。
状態 k を関数 f(k) と評価して、関数の返り値 kintermediate を 相手の出方の予想関数に g(f(k)) と与えると 状態 k1 が得られて、f(k) - g(f(k)) が心地よく小さくなるまでこれを n 回にわたって再帰的に呼ぶと理想の状態に達するわけですよね? でも、この状態 kn って常に kn-1 との差分方程式の形でしか表現できないので、状態 k0 から kn までのすべての状態を保持しないといけなくないですか?
純粋なループなら g(f(k)) の一般項なので、kn-1 を捨てながらイテレーションを続ければ平衡状態まで思考を続けられるはず。ところがこれは再帰なので、"計算"を続けるといずれかの地点でスタック領域が埋まって、関数の最終行で例外が飛び、思考が打ち切られて行動を決定せざるを得なくなるんじゃないでしょうか。
で、リンク先を読むと一般人は n = 0~1 でそれが発生するよ、と書いてありますね。なるほど。
> これ、ループじゃないですよね。
ループと再帰が可換であることは理解してますか?
状態 k0 から kn の列 {k_i | i=0...n } をパラメータとして,fという関数が f({k_i}) を評価すると考えればループとなります
もう少しプログラマの人にもわかるように説明すると- {k_j | j=0...(i-1) } の情報をスタックに持たせて,サブルーチン f に k_iだけ引数で与えれば再帰処理- サブルーチン f に {k_i | i=0...n }を全部与えるなら,ループ処理となります
つまり両者は,計算機上での処理の実行方法の違いでしかありません.実装方法の違いとも言えます.そしてやってる計算・処理は同じです.
つまり「ループじゃなくて再帰」と言う指摘は「ループ処理は再帰でも処理できる(実装できる)」という言ってるに過ぎません.
そりゃそうです.可換ですから.
なんとなーく昔そんなことを聞いたかなとは思ってました。ただ、実際には「相手がこう出てくるはずだから、それに対して……」処理は人の頭ではループ処理にはなってなくて、常に途中の状態も評価しながら最終行でオブジェクトが増えていっていると思うんですよね。その辺が「ループじゃなくて再帰」の含意でした。
人の頭にはメモリがないからオブジェクトを参照する度にコンストラクタも走るし渡されたオブジェクトのコンストラクタも走る、だから計算量が爆発する、みたいな考え方の方が正確だったかな。
> 人の頭にはメモリがないからオブジェクトを参照する度にコンストラクタも走るし渡されたオブジェクトのコンストラクタも走る、だから計算量が爆発する、みたいな考え方の方が正確だったかな。
神経細胞の巨大なネットワークである脳の中で「コンストラクタが走る」みたいな考え方のどこが正確なんですか?
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
ナニゲにアレゲなのは、ナニゲなアレゲ -- アレゲ研究家
ループじゃなくて再帰 (スコア:5, 興味深い)
これ、ループじゃないですよね。
状態 k を関数 f(k) と評価して、関数の返り値 kintermediate を 相手の出方の予想関数に g(f(k)) と与えると 状態 k1 が得られて、f(k) - g(f(k)) が心地よく小さくなるまでこれを n 回にわたって再帰的に呼ぶと理想の状態に達するわけですよね? でも、この状態 kn って常に kn-1 との差分方程式の形でしか表現できないので、状態 k0 から kn までのすべての状態を保持しないといけなくないですか?
純粋なループなら g(f(k)) の一般項なので、kn-1 を捨てながらイテレーションを続ければ平衡状態まで思考を続けられるはず。ところがこれは再帰なので、"計算"を続けるといずれかの地点でスタック領域が埋まって、関数の最終行で例外が飛び、思考が打ち切られて行動を決定せざるを得なくなるんじゃないでしょうか。
で、リンク先を読むと一般人は n = 0~1 でそれが発生するよ、と書いてありますね。なるほど。
Re: (スコア:0)
> これ、ループじゃないですよね。
ループと再帰が可換であることは理解してますか?
状態 k0 から kn の列 {k_i | i=0...n } をパラメータとして,fという関数が f({k_i}) を評価すると考えればループとなります
もう少しプログラマの人にもわかるように説明すると
- {k_j | j=0...(i-1) } の情報をスタックに持たせて,サブルーチン f に k_iだけ引数で与えれば再帰処理
- サブルーチン f に {k_i | i=0...n }を全部与えるなら,ループ処理
となります
つまり両者は,計算機上での処理の実行方法の違いでしかありません.実装方法の違いとも言えます.
そしてやってる計算・処理は同じです.
つまり「ループじゃなくて再帰」と言う指摘は
「ループ処理は再帰でも処理できる(実装できる)」という言ってるに過ぎません.
そりゃそうです.可換ですから.
Re:ループじゃなくて再帰 (スコア:2)
ループと再帰が可換であることは理解してますか?
なんとなーく昔そんなことを聞いたかなとは思ってました。ただ、実際には「相手がこう出てくるはずだから、それに対して……」処理は人の頭ではループ処理にはなってなくて、常に途中の状態も評価しながら最終行でオブジェクトが増えていっていると思うんですよね。その辺が「ループじゃなくて再帰」の含意でした。
人の頭にはメモリがないからオブジェクトを参照する度にコンストラクタも走るし渡されたオブジェクトのコンストラクタも走る、だから計算量が爆発する、みたいな考え方の方が正確だったかな。
Re: (スコア:0)
> 人の頭にはメモリがないからオブジェクトを参照する度にコンストラクタも走るし渡されたオブジェクトのコンストラクタも走る、だから計算量が爆発する、みたいな考え方の方が正確だったかな。
神経細胞の巨大なネットワークである脳の中で「コンストラクタが走る」みたいな考え方のどこが正確なんですか?