【recursive 】 再 帰 【リカーシブ】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGそして神は再帰する・・・
再帰を使った面白い関数・メソッドを書いてください。
0002デフォルトの名無しさん
NGNG0003デフォルトの名無しさん
NGNG人は繰り返す・・・
そして神は再帰する・・・
再帰を使った面白い関数・メソッドを書いてください。
2 :デフォルトの名無しさん :03/03/20 00:44
いやだYO
漏れもいやだYOYO
00041
NGNG0005デフォルトの名無しさん
NGNG{
cout << "Hello World!!" << endl;
return main();
}
0006デフォルトの名無しさん
NGNG#include <stdlib.h> /* exit( ) で必要 */
unsigned long Fibo(int n);
void main(void);
/* n のフィボナッチ数を返す */
unsigned long Fibo(int n)
{
unsigned long f; /* フィボナッチ数をしまう */
switch (n) {
case 1:
case 2: /* n が1か2なら */
f = 1L; /* f は1 */
break;
default: /* それ以外は再帰呼び出し */
f = Fibo(n - 1) + Fibo(n - 2);
break;
}
return (f); /* f の値をリターン */
}
void main(void)
{
int n; /* n のフィボナッチ数を求める */
printf("1 から 98 迄の整数を入力して下さい\t");
scanf("%d", &n);
0007デフォルトの名無しさん
NGNGif(n > 98) { /* n が 98より大きければ何もしないで終了 */
printf("数字が大き過ぎます\n");
exit(0);
}
/* フィボナッチ数を表示 */
printf("\nFibonacci 数は %lu\n", Fibo(n));
}
00081
NGNG0009デフォルトの名無しさん
NGNG0010デフォルトの名無しさん
NGNG0011デフォルトの名無しさん
NGNGreturn main(argc, argv);
}
00121
NGNG0013+++
NGNG0014デフォルトの名無しさん
NGNG再起をうまく使ったGoFデザインパターンあったろう。
Compositeパターン、Visitorパターンとか。
0015デフォルトの名無しさん
NGNG0016デフォルトの名無しさん
NGNG((lambda (n)
((lambda (l) (l l n))
(lambda (l n)
(if (< n 2)
n
(+ (l l (- n 1))
(l l (- n 2)))))))
30)
=>832040
0017デフォルトの名無しさん
NGNG0018デフォルトの名無しさん
NGNG再帰関数で書いたことがあったが、少し階層が深くなるだけですぐ
stack overflowになったし、関数呼び出しのオーバーヘッドが凄過ぎて
遅くて使いモンにならなかったYO・・・。もう何年も前の話。
0019デフォルトの名無しさん
NGNG再帰が悪いんじゃなくて末尾再帰最適化に対応してないコンパイラ若しくは書き方が悪かったんだと思われ
0020デフォルトの名無しさん
NGNG0021デフォルトの名無しさん
NGNG連鎖のところに使われているだけだろ
0022デフォルトの名無しさん
NGNGstruct Power {
enum { Value = Power<A, N - 1>::Value * A };
};
template <int A>
struct Power <A, 1>{
enum { Value = A };
};
0023デフォルトの名無しさん
NGNG{
main();
return 0;
}
0024デフォルトの名無しさん
NGNG0025デフォルトの名無しさん
NGNG「いろんな方向につながっているもの」を数えるのに、再帰って便利だよね。
シミュレーションゲームとかでありがちな、移動可能なヘクスを数え上げるのにも
便利だし。
0026デフォルトの名無しさん
NGNGオセロとかマインスイーパ作ったときに使ったなぁ・・・。
こう書くとWindows3.0のプログラマみたいだな。俺。
0027デフォルトの名無しさん
NGNGはっはっは!永遠に終わらないじゃん(爆笑!
0028デフォルトの名無しさん
NGNG俺はスタックかそれに準ずるメモリのオーバーフローで悲惨な終わり方をするに1リカーシブ。
0029デフォルトの名無しさん
NGNG0030デフォルトの名無しさん
NGNGなんか初心を思い出した。
さ、今日も朝までがんばろう。
0031デフォルトの名無しさん
NGNGGOTOで・・・とか言おうとしたけど確かに難しいな。スタック自分で実装するとかか。
0032デフォルトの名無しさん
NGNG0033デフォルトの名無しさん
NGNG人類滅亡のその日に
関数はreturnする。
0034デフォルトの名無しさん
NGNGいや、全人類が男と閉経後のばばぁのみになった時点でreturnだ。
0035デフォルトの名無しさん
NGNGネット越しにスワップアウトするシステムが実装されたら・・・
0036デフォルトの名無しさん
NGNGhttp://pc2.2ch.net/test/read.cgi/tech/1048088635/
0037デフォルトの名無しさん
NGNG0038デフォルトの名無しさん
NGNGたとえ戻ったとしてもそれに何の意味があるというのか。
0039デフォルトの名無しさん
NGNGファイルから一行取得する関数。
ファイルの一行目に何文字あろうと、
全部がんばってとってきてヒープに格納するやつ
char* fstralloc( FILE* istream ){return __fstralloc( istream, 0 );}
char* __fstralloc( FILE* istream, int readsize )
{
int i = 0;
char linebuf[BUFSIZ+1];
do{
linebuf[i] = (char)fgetc( istream );
if( linebuf[i]==EOF || linebuf[i]=='\n' ){
linebuf[i]='\0';
return strcpy( &(((char*)malloc( (readsize+i+1)*sizeof(char) ))[readsize]), linebuf ) - readsize;
}
}while(BUFSIZ>++i);
return memcpy( &__fstralloc( istream, readsize+BUFSIZ )[readsize], linebuf, BUFSIZ ) - readsize;
}
あんま、再帰をうまく利用してるって感じはしないけど。
しかし、今見るとなにやってるかぜんぜんわからん(藁
0040デフォルトの名無しさん
NGNG> char linebuf[BUFSIZ+1];
> do{
> linebuf[i] = (char)fgetc( istream );
> if( linebuf[i]==EOF || linebuf[i]=='\n' ){
とりあえずcharに代入してからEOFと比較すんのはやめとけ。
004139
NGNGテキストファイル限定ということでお許しください。(;´∀`)
再帰だからあんま変数増やしたくないんだよね。
でも、4バイトぐらいならいいか。
0043デフォルトの名無しさん
NGNG0044デフォルトの名無しさん
NGNG0045デフォルトの名無しさん
NGNG1とかマジックナンバー書くやつ低脳。
0046デフォルトの名無しさん
NGNGマジックナンバーとか思ってるやつはバカ
*sizeof(char)自体無意味で冗長でつ
と言ってみるテスt
004739
NGNGそうきたか。
漏れの想像範囲を超える意見!感動した。
∧_∧
/⌒ヽ ) ・・・・モウコネエ世!
i三 ∪
|三 | トボトボ
(/~∪
三三
三三
三三
sizeof(char)自体冗長と思う人がいるんでつね。
いや、漏れ的にその辺どうでもいいと思うんだけどね。
わかりやすければ何でもいいと思う。
004839
NGNGああ、mallocのとこか。
た、確かに無駄かも知れぬ。
気にせんといて。
0049デフォルトの名無しさん
NGNG可読性のことを言ってるんですが・・・
0050デフォルトの名無しさん
NGNG0051デフォルトの名無しさん
NGNGC言語の使用でcharのサイズは1って決まってるんだってことを言いたいんだよ。
でも、sizeof(char)でいいよ。1で書くやつがいたら嫌。何の1なのかという意思を示すべしだね。
0052デフォルトの名無しさん
NGNG>とりあえず sizeof(char) する奴嫌い。
だとすると矛盾。
0053デフォルトの名無しさん
NGNGint kk(int);
int main(void)
{
int in;
scanf("%d",&in);
printf("%d",kk(in));
}
int kk(int jj)
{
return (jj>1)?jj*kk(jj-1):1;
}
0054デフォルトの名無しさん
NGNGでもn*sizeof(char)←これはあほだ。
0055デフォルトの名無しさん
NGNG可読性を高める為に、あえて そうするのは賢い。
0056デフォルトの名無しさん
NGNGあほがいます。
0057デフォルトの名無しさん
NGNG非常識なコード書いてると信用落とすよ
0058デフォルトの名無しさん
NGNG0059ナナシサソ
NGNGTCHAR* __fstralloc(FILE* istream, int readsize)
{
int i = 0;
TCHAR linebuf[BUFSIZ + 1];
do {
linebuf[i] = (TCHAR)_fgettc(istream);
if (feof(istream) || linebuf[i] == _T('\n')) {
linebuf[i] = _T('\0');
return _tcscpy(&(((TCHAR*)malloc((readsize + i + 1) * sizeof(TCHAR)))[readsize]), linebuf) - readsize;
}
} while (BUFSIZ > ++i);
return memcpy(&__fstralloc(istream, readsize + BUFSIZ)[readsize], linebuf, BUFSIZ) - readsize;
}
0060デフォルトの名無しさん
NGNGそれもおかしいでぇ。
memcpyのサイズ。
テストぐらいしようや。
0061デフォルトの名無しさん
NGNG副作用が跨る再帰はよくないよ。
0062デフォルトの名無しさん
NGNGじゃあお前はp=malloc(256*sizeof(char));とかやるのか・・・
0063しろーと
NGNGC言語仕様では、確か型ごとのサイズの保証はしてないんだよね?
0064デフォルトの名無しさん
NGNGcharだけは1だと決まっている。もしも1以外を返す処理系があったらそれは規格外。
ただしCHARBIT==8とは限らない。
0065デフォルトの名無しさん
NGNGC++でmain呼んじゃダメだろ。馬鹿
0066デフォルトの名無しさん
NGNG006739
NGNGfeof イイ!! そんな便利なもんがあるのワスれてた。
うにコード対応?わけわからんソース修正してくれて感謝。
>>61
尤もだ。確かにそうなんだが、realloc って中身消えるときないか?
VC のライブラリのバグで、もしかしたらもう直ってるかもしれんけど、
納期が近いのに悩まされたことがあってrealloc嫌いになった。
んでこの関数ができた。
>>66
↓これだ!「再帰」ってタイトルの奴だ。
1 名前:デフォルトの名無しさん 投稿日:2001/06/11(月) 15:44
http://piza.2ch.net/test/read.cgi?bbs=tech&key=992241842
006851
NGNG漏れは44じゃないよん。
書き方が悪くて50までに書き込んだことのある誰かが書いてる文章にも読めるな。
sizeof(char)がらみでは漏れの投稿は51だけ。でもって終了。
0069ナナシサソ59
NGNG伝えたかったことは、TCHAR は 1 バイトとは限らないから、
この場合はちゃんと sizeof() 書いとかなあかんなというお話。
>>67
linebuf[i] == _TEOF と書けばいいことに、今気付いた…。
<tchar.h> から引用
#ifdef _UNICODE
#define _TEOF WEOF
#else
#define _TEOF EOF
#endif
0070デフォルトの名無しさん
NGNG>>40
0071デフォルトの名無しさん
NGNG>この場合はちゃんと sizeof() 書いとかなあかんなというお話。
間違いを指摘されて苦しい言い訳してる様にしか見えないよ。
もういいから、C言語の初心者スレに帰れ。スレ違いなんだよ。
0072デフォルトの名無しさん
NGNG0073デフォルトの名無しさん
NGNGどっちで書くかは好みだと思うが。
007439
NGNGおまいのEOFへの指摘は誰よりも早いな。
>>71
まあ、sizeof(char)が好きだ、嫌いだ、掘った、掘られた言ってても、
73もいってるが、それぞれの好みの問題ってのはいつまでたっても解決しないよ。
漏れは 43 になに言われようと、とりあえず括弧の内側にスペース入れるしね。
44 になに言われようと、とりあえず sizeof(char) するしね。
とりあえず 70 は誰よりも速く EOF の指摘をするしね。
というか 43 みたいな指摘受けると括弧の内側にスペース7個ぐらい入れて、
「どうよ。これどうよ。角度とか。」とか聞きたくなるんですが。
007539
NGNG最大公約数を求めるユーグリッドの互除法ってやつを。
int gcm( int x, int y )
{
if(x%y) gcm( y, x%y );
return y;
}
007639
NGNGint gcm( int x, int y )
{
int z;
while(z=x%y) x=y, y=z;
return y;
}
0077デフォルトの名無しさん
NGNG0079デフォルトの名無しさん
NGNG0080デフォルトの名無しさん
NGNG0081デフォルトの名無しさん
NGNG確かにそうだw
008239
NGNGえっ?
えーと、いやいや。皆さんを試したんですよ僕は。
見てないんじゃないかとおもって。あは、あははは。
>>ナナシサソ59さんへ
59さん!緊急事態です! if の後に return が抜けちゃってました!
しかも、80さんに指摘されてユーグリッドの互除法を、
再度調べ直してたら gcm でなくて gcd であることにも気が付きました!
さりげなく直しておいてください!!
unicodeに対応しつつ、何事も無かったかのようにさりげなく直しておいてください!!
0083デフォルトの名無しさん
NGNGこれ、簡単なベンチマークにイイと思うんだけど。
実際にn枚目の皿に相当する数値をメモリ内で移動させるようにして
やらせてみた。16枚以上は、1秒間だけ走らせてその時間を基にどの位で
終わるか表示させて遊んだな。60枚位で何億年とか出て面白かった。
0084デフォルトの名無しさん
NGNG0085def hage
NGNG>>85
0086デフォルトの名無しさん
NGNG{
if( n > 0xf ) printhex( n >> 4 );
putchar( "0123456789ABCDEF"[ n & 0xf ] );
}
008783
NGNG勿論再帰版ではなくて桁数決めて非再帰コードですが。昔、演習問題ですが
stringの長さを数えるのに再帰を使ってる例がありましたね。
文字列の長さ数えるのに、文字数分ワードをpushするんかい、おい!
とか思いましたが、学問として正しさのみを云々するには面白い問題ですね。
0088デフォルトの名無しさん
NGNG0089デフォルトの名無しさん
NGNG0090山崎渉
NGNG0091デフォルトの名無しさん
NGNG0092デフォルトの名無しさん
NGNG0093デフォルトの名無しさん
NGNG相互再帰だろうがぁぁぁっっっっっ!!!!!!
0094デフォルトの名無しさん
NGNG相互ってないやつはフーンって感じだったけど。
0095デフォルトの名無しさん
NGNG0096デフォルトの名無しさん
NGNG0097デフォルトの名無しさん
NGNG0098デフォルトの名無しさん
NGNGで思い出したけど、Y-combinator って何よ?
0099デフォルトの名無しさん
NGNGメリットなのだが、>>39 (>>59) は再帰を使ったことで
readsize という引数が増えるなどプログラムを複雑化しており、
本末転倒
0100デフォルトの名無しさん
NGNG関数型言語系スレの過去ログにあったよ
0101デフォルトの名無しさん
NGNG■ このスレッドは過去ログ倉庫に格納されています