トップページ⇒tech
222コメント55KB

【recursive 】 再 帰 【リカーシブ】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
人は繰り返す・・・
そして神は再帰する・・・

再帰を使った面白い関数・メソッドを書いてください。
0002デフォルトの名無しさんNGNG
いやだYO
0003デフォルトの名無しさんNGNG
1 :デフォルトの名無しさん :03/03/20 00:43
人は繰り返す・・・
そして神は再帰する・・・

再帰を使った面白い関数・メソッドを書いてください。



2 :デフォルトの名無しさん :03/03/20 00:44
いやだYO

漏れもいやだYOYO
00041NGNG
えーん、かいてよー・・・
0005デフォルトの名無しさんNGNG
int main(void)
{
  cout << "Hello World!!" << endl;
  return main();
}
0006デフォルトの名無しさんNGNG
#include <stdio.h>
#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デフォルトの名無しさんNGNG

if(n > 98) { /* n が 98より大きければ何もしないで終了 */
printf("数字が大き過ぎます\n");
exit(0);
}
/* フィボナッチ数を表示 */
printf("\nFibonacci 数は %lu\n", Fibo(n));
}
00081NGNG
えーん、かいてよー・・・
0009デフォルトの名無しさんNGNG
GNU
0010デフォルトの名無しさんNGNG
もし9が書いたら俺も書いてやるよ
0011デフォルトの名無しさんNGNG
int main(int argc, char** argv){
  return main(argc, argv);
}
00121NGNG
処理系依存する再帰書くやつは馬鹿
0013+++NGNG
Stack overflow.....
0014デフォルトの名無しさんNGNG
>>1
再起をうまく使ったGoFデザインパターンあったろう。

Compositeパターン、Visitorパターンとか。
0015デフォルトの名無しさんNGNG
Chain of Responsibility
0016デフォルトの名無しさんNGNG
無名関数だけでFibonacci
((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デフォルトの名無しさんNGNG
再起不能...
0018デフォルトの名無しさんNGNG
むかしポリゴン人形関節座標系計算のためのマトリックス演算を
再帰関数で書いたことがあったが、少し階層が深くなるだけですぐ
stack overflowになったし、関数呼び出しのオーバーヘッドが凄過ぎて
遅くて使いモンにならなかったYO・・・。もう何年も前の話。
0019デフォルトの名無しさんNGNG
>>18
再帰が悪いんじゃなくて末尾再帰最適化に対応してないコンパイラ若しくは書き方が悪かったんだと思われ
0020デフォルトの名無しさんNGNG
PHP
0021デフォルトの名無しさんNGNG
>>15
連鎖のところに使われているだけだろ
0022デフォルトの名無しさんNGNG
template <int A, int N>
struct Power {
enum { Value = Power<A, N - 1>::Value * A };
};

template <int A>
struct Power <A, 1>{
enum { Value = A };
};
0023デフォルトの名無しさんNGNG
int main()
{
main();

return 0;
}
0024デフォルトの名無しさんNGNG
ぷよぷよの繋がったぷよの数を数えるのに再帰使ったよん。
0025デフォルトの名無しさんNGNG
>>24
「いろんな方向につながっているもの」を数えるのに、再帰って便利だよね。
シミュレーションゲームとかでありがちな、移動可能なヘクスを数え上げるのにも
便利だし。
0026デフォルトの名無しさんNGNG
>>25
オセロとかマインスイーパ作ったときに使ったなぁ・・・。

こう書くとWindows3.0のプログラマみたいだな。俺。
0027デフォルトの名無しさんNGNG
>>23
はっはっは!永遠に終わらないじゃん(爆笑!
0028デフォルトの名無しさんNGNG
>>27
俺はスタックかそれに準ずるメモリのオーバーフローで悲惨な終わり方をするに1リカーシブ。
0029デフォルトの名無しさんNGNG
((lambda (x) (display "a") (x x)) (lambda (x) (display "a") (x x)))
0030デフォルトの名無しさんNGNG
BASICで再帰くむのに悩んだのは中学生の頃か
なんか初心を思い出した。

さ、今日も朝までがんばろう。
0031デフォルトの名無しさんNGNG
>>30
GOTOで・・・とか言おうとしたけど確かに難しいな。スタック自分で実装するとかか。
0032デフォルトの名無しさんNGNG
int c(a, b){return !b||a==b ? 1: c(a-1, b) + c(a-1, b-1);}
0033デフォルトの名無しさんNGNG
まんこの中の女の子のまんこの中の女の子のまんこの中の女の子のまんこの中の・・・

人類滅亡のその日に

関数はreturnする。
0034デフォルトの名無しさんNGNG
>>33
いや、全人類が男と閉経後のばばぁのみになった時点でreturnだ。
0035デフォルトの名無しさんNGNG
>>28
ネット越しにスワップアウトするシステムが実装されたら・・・
0036デフォルトの名無しさんNGNG
ここ、役に立つよ。

http://pc2.2ch.net/test/read.cgi/tech/1048088635/
0037デフォルトの名無しさんNGNG
HTMLのハイパーリンクは一方通行だから、再「帰」っていう感じはしないなあ・・・・
0038デフォルトの名無しさんNGNG
>>37
たとえ戻ったとしてもそれに何の意味があるというのか。
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
>>39
>   char linebuf[BUFSIZ+1];
>   do{
>     linebuf[i] = (char)fgetc( istream );
>     if( linebuf[i]==EOF || linebuf[i]=='\n' ){

とりあえずcharに代入してからEOFと比較すんのはやめとけ。
004139NGNG
ぐあ、FF がくると終了しちまう。
テキストファイル限定ということでお許しください。(;´∀`)
再帰だからあんま変数増やしたくないんだよね。
でも、4バイトぐらいならいいか。
004239NGNG
41 は >>40 に対してのレスね。
0043デフォルトの名無しさんNGNG
とりあえず括弧の内側にスペース入れる奴嫌い。
0044デフォルトの名無しさんNGNG
とりあえず sizeof(char) する奴嫌い。
0045デフォルトの名無しさんNGNG
>>44
1とかマジックナンバー書くやつ低脳。
0046デフォルトの名無しさんNGNG
sizeof(char)はどんなときも1でつ
マジックナンバーとか思ってるやつはバカ
*sizeof(char)自体無意味で冗長でつ
と言ってみるテスt
004739NGNG
>>43 >>44 >>46
そうきたか。
漏れの想像範囲を超える意見!感動した。

        ∧_∧
       /⌒ヽ ) ・・・・モウコネエ世!
      i三 ∪  
       |三 |  トボトボ
      (/~∪
     三三
    三三
   三三

sizeof(char)自体冗長と思う人がいるんでつね。
いや、漏れ的にその辺どうでもいいと思うんだけどね。
わかりやすければ何でもいいと思う。
004839NGNG
というか、sizeof(char)ってどこで使ってたっけ?
ああ、mallocのとこか。
た、確かに無駄かも知れぬ。
気にせんといて。
0049デフォルトの名無しさんNGNG
>>46
可読性のことを言ってるんですが・・・
0050デフォルトの名無しさんNGNG
sizeof(char)がなかったらsizeof(char)がいくつか解らないじゃないか。
0051デフォルトの名無しさんNGNG
>>50
C言語の使用でcharのサイズは1って決まってるんだってことを言いたいんだよ。
でも、sizeof(char)でいいよ。1で書くやつがいたら嫌。何の1なのかという意思を示すべしだね。

0052デフォルトの名無しさんNGNG
>>51
>とりあえず sizeof(char) する奴嫌い。

だとすると矛盾。
0053デフォルトの名無しさんNGNG
#include<stdio.h>

int 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
>>51
でもn*sizeof(char)←これはあほだ。
0055デフォルトの名無しさんNGNG
そんな事は無い。1に決まってるんだってことを理解した上で
可読性を高める為に、あえて そうするのは賢い。
0056デフォルトの名無しさんNGNG
>>54
あほがいます。
0057デフォルトの名無しさんNGNG
>55
非常識なコード書いてると信用落とすよ
0058デフォルトの名無しさんNGNG
グローバル変数を0で初期化するみたいなもの。意味無い
0059ナナシサソNGNG
TCHAR* fstralloc(FILE* istream) { return __fstralloc(istream, 0); }
TCHAR* __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
>>59
それもおかしいでぇ。
memcpyのサイズ。
テストぐらいしようや。
0061デフォルトの名無しさんNGNG
そういう用途ならreallocのでいいと思うけど。
副作用が跨る再帰はよくないよ。
0062デフォルトの名無しさんNGNG
>>56
じゃあお前はp=malloc(256*sizeof(char));とかやるのか・・・
0063しろーとNGNG
sizeof(char)が1で無い環境ってあるの?
C言語仕様では、確か型ごとのサイズの保証はしてないんだよね?
0064デフォルトの名無しさんNGNG
>>63
charだけは1だと決まっている。もしも1以外を返す処理系があったらそれは規格外。
ただしCHARBIT==8とは限らない。
0065デフォルトの名無しさんNGNG
>>5

C++でmain呼んじゃダメだろ。馬鹿
0066デフォルトの名無しさんNGNG
まえどっかに、1に>>36みたく書いてるやつあったべ。
006739NGNG
>>59
feof イイ!! そんな便利なもんがあるのワスれてた。
うにコード対応?わけわからんソース修正してくれて感謝。

>>61
尤もだ。確かにそうなんだが、realloc って中身消えるときないか?
VC のライブラリのバグで、もしかしたらもう直ってるかもしれんけど、
納期が近いのに悩まされたことがあってrealloc嫌いになった。
んでこの関数ができた。

>>66
↓これだ!「再帰」ってタイトルの奴だ。

1 名前:デフォルトの名無しさん 投稿日:2001/06/11(月) 15:44
http://piza.2ch.net/test/read.cgi?bbs=tech&key=992241842
006851NGNG
>>52
漏れは44じゃないよん。
書き方が悪くて50までに書き込んだことのある誰かが書いてる文章にも読めるな。
sizeof(char)がらみでは漏れの投稿は51だけ。でもって終了。
0069ナナシサソ59NGNG
>>60
伝えたかったことは、TCHAR は 1 バイトとは限らないから、
この場合はちゃんと sizeof() 書いとかなあかんなというお話。

>>67
linebuf[i] == _TEOF と書けばいいことに、今気付いた…。

<tchar.h> から引用
#ifdef _UNICODE
#define _TEOF WEOF
#else
#define _TEOF EOF
#endif
0070デフォルトの名無しさんNGNG
>>69
>>40
0071デフォルトの名無しさんNGNG
>>69
>この場合はちゃんと sizeof() 書いとかなあかんなというお話。
間違いを指摘されて苦しい言い訳してる様にしか見えないよ。
もういいから、C言語の初心者スレに帰れ。スレ違いなんだよ。
0072デフォルトの名無しさんNGNG
C言語の初心者スレ・・・・俺に聞けスレのことか?
0073デフォルトの名無しさんNGNG
sizeof(char)ぐらいコンパイラが最適化するだろ。

どっちで書くかは好みだと思うが。
007439NGNG
>>40 >>70
おまいのEOFへの指摘は誰よりも早いな。

>>71
まあ、sizeof(char)が好きだ、嫌いだ、掘った、掘られた言ってても、
73もいってるが、それぞれの好みの問題ってのはいつまでたっても解決しないよ。

漏れは 43 になに言われようと、とりあえず括弧の内側にスペース入れるしね。
44 になに言われようと、とりあえず sizeof(char) するしね。
とりあえず 70 は誰よりも速く EOF の指摘をするしね。

というか 43 みたいな指摘受けると括弧の内側にスペース7個ぐらい入れて、
「どうよ。これどうよ。角度とか。」とか聞きたくなるんですが。
007539NGNG
ス、スレ違いになってしまったので責任を取って、
最大公約数を求めるユーグリッドの互除法ってやつを。

int gcm( int x, int y )
{
  if(x%y) gcm( y, x%y );
  return y;
}
007639NGNG
んで >>77 に、こっちの方が効率がよい罠 とか指摘されるに、210松方弘樹。

int gcm( int x, int y )
{
int z;
while(z=x%y) x=y, y=z;
return y;
}
0077デフォルトの名無しさんNGNG
括弧の内側にスペースがはいっていませんよ。
007839NGNG
>>77
漏れの想像力をはるかに超えたオチ!
笑わせようとしたつもりが笑わされた!
「とりあえず 〜 奴嫌い。」とくると思ったのに!悔しい!悔しい!
0079デフォルトの名無しさんNGNG
ifやwhileと括弧の間にスペースが(ry
0080デフォルトの名無しさんNGNG
>>75はyを返す関数ですか?
0081デフォルトの名無しさんNGNG
>>80
確かにそうだw
008239NGNG
>>80
えっ?
えーと、いやいや。皆さんを試したんですよ僕は。
見てないんじゃないかとおもって。あは、あははは。




>>ナナシサソ59さんへ
59さん!緊急事態です! if の後に return が抜けちゃってました!
しかも、80さんに指摘されてユーグリッドの互除法を、
再度調べ直してたら gcm でなくて gcd であることにも気が付きました!
さりげなく直しておいてください!!
unicodeに対応しつつ、何事も無かったかのようにさりげなく直しておいてください!!
0083デフォルトの名無しさんNGNG
再帰で感動したのは「ハノイの塔」だったなあ・・・(遠い目)
これ、簡単なベンチマークにイイと思うんだけど。
実際にn枚目の皿に相当する数値をメモリ内で移動させるようにして
やらせてみた。16枚以上は、1秒間だけ走らせてその時間を基にどの位で
終わるか表示させて遊んだな。60枚位で何億年とか出て面白かった。
0084デフォルトの名無しさんNGNG
うっほっほ。
0085def hageNGNG
puts "禿"
>>85
0086デフォルトの名無しさんNGNG
void printhex( unsigned int n )
{
  if( n > 0xf ) printhex( n >> 4 );
  putchar( "0123456789ABCDEF"[ n & 0xf ] );
}
008783NGNG
にゃるほど。実際にデバック用のコードで、こんな感じのは使ってますね。
勿論再帰版ではなくて桁数決めて非再帰コードですが。昔、演習問題ですが
stringの長さを数えるのに再帰を使ってる例がありましたね。
文字列の長さ数えるのに、文字数分ワードをpushするんかい、おい!
とか思いましたが、学問として正しさのみを云々するには面白い問題ですね。
0088デフォルトの名無しさんNGNG
再帰なら、オセロとかのプログラムでCPUに先読みさせるときに使ったなぁ。
0089デフォルトの名無しさんNGNG
コッホコッホ
0090山崎渉NGNG
(^^)
0091デフォルトの名無しさんNGNG
>>92 相互
0092デフォルトの名無しさんNGNG
>>91 リンク
0093デフォルトの名無しさんNGNG
再帰スレで相互といったら
相互再帰だろうがぁぁぁっっっっっ!!!!!!
0094デフォルトの名無しさんNGNG
俺も再帰って凄いなと思ったのは相互再帰のコードを見た時だ。
相互ってないやつはフーンって感じだったけど。
0095デフォルトの名無しさんNGNG
実務にアクロバットは要らない。
0096デフォルトの名無しさんNGNG
カリーカリー
0097デフォルトの名無しさんNGNG
http://a414s1.it.nanzan-u.ac.jp/textbook/text082100-3/node144.html
0098デフォルトの名無しさんNGNG
>>80 yを返す関数
で思い出したけど、Y-combinator って何よ?
0099デフォルトの名無しさんNGNG
再帰は、複雑になりそうなところをシンプルに記述出来るのが
メリットなのだが、>>39 (>>59) は再帰を使ったことで
readsize という引数が増えるなどプログラムを複雑化しており、
本末転倒
0100デフォルトの名無しさんNGNG
>>98
関数型言語系スレの過去ログにあったよ
0101デフォルトの名無しさんNGNG
101の書く事を信用してはいけない
■ このスレッドは過去ログ倉庫に格納されています