- ベストアンサー
再帰呼び出しについて(基本)
#include <stdio.h> void dan(int i); void kuku(void); void dan(int i) { int j; for (j = 1; j <= 9; j++) printf("%3d", i*j); putchar('\n'); } void kuku(void) { int i; for (i = 1; i <= 9; i++) dan(i); } int main(void) { kuku( ); return(0); } というプログラムがあるのですが、danとkukuを再帰呼び出しにしたいのですが、再帰の仕方がまったく分かりません。 知り合いに聞くと、両関数の引数を1つずつ増やすとよいと言われたのですが、手をつけられない状態です。 よろしくご教授お願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
無理やり再帰にしてみた。 この程度であれば再帰のプログラムは遅くなりますが。。。 #include <stdio.h> void dan(int i,int j); void kuku(int i); void dan(int i,int j) { if (j == 10){ putchar('\n'); return; } printf("%3d", i*j); dan(i,j+1); } void kuku(int i) { if (i == 10) return; dan(i,1); kuku(i+1); } int main(void) { kuku(1); return(0); }
その他の回答 (3)
- 和泉 博(@hiroshi09s)
- ベストアンサー率54% (59/109)
ソースのスペースは見易くするために2バイトコードを使っていますので、コピーする場合は半角スペースに直して下さい。 /* Make it recucive call program. * file name: tigen1990.c * execution: ./a.out * compile: gcc tigen1990.c * * 1 2 3 4 5 6 7 8 9 * 2 4 6 8 10 12 14 16 18 * 3 6 9 12 15 18 21 24 27 * 4 8 12 16 20 24 28 32 36 * 5 10 15 20 25 30 35 40 45 * 6 12 18 24 30 36 42 48 54 * 7 14 21 28 35 42 49 56 63 * 8 16 24 32 40 48 56 64 72 * 9 18 27 36 45 54 63 72 81 */ #include <stdio.h> void kuku(int); void dan(int, int); /* せっかくプロトタイプ宣言しているので * 見易い top-down記述を心掛けましょう。 */ int main(void) { kuku(1); return 0; } void kuku(int i) { if (i <= 9) { dan(i, 1); i += 1; /* recurcive call */ kuku(i); } } void dan(int i, int j) { if (j <= 9) { printf("%3d", i * j); j += 1; /* recurcive call */ dan(i, j); } else printf("\n"); }
- HackerX
- ベストアンサー率40% (2/5)
再帰呼び出しは、構造的にツリー構造になるかスタックになるようなことをしたい時にしますが、上記のプログラムだと再帰呼び出しをして何をどうすれば良いかさっぱり分かりません。 まず、どのような処理がしたいのでしょうか?
- DIooggooID
- ベストアンサー率27% (1730/6405)
何かの処理を行うために再起呼び出しにする、ということであれば、 理解できますが、・・・・ まず、再起呼び出しありきで、手続きを考えるというのは、なぜなの でしょうか? http://www.geocities.jp/ky_webid/c/056.html こちらで紹介されているとおり、自分自身を自分自身から呼び出す 手続きです。 目的を明確に示されたほうが良いと思います。