1 名前:名無しのプログラマ [2015/08/09(日) 17:46:33.69 ID:Icb40LOY.net] for,while使うの嫌いで基本的に再帰多用するんだが、だめなの? 皆から敬遠されてる気がする
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] 一人でそうゆうこと書いてて満足か?