トップページ⇒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の書く事を信用してはいけない
0102デフォルトの名無しさんNGNG
>>101
エピメニデス文だね!
0103デフォルトの名無しさんNGNG
「ゲーデル・エッシャー・バッハ」って面白い?
読もう、読もうと思っててすぐ忘れてしまうん。
0104山崎渉NGNG
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
0105デフォルトの名無しさんNGNG
>>103
それなりに面白いが、プログラムよりの話はそんなに出ない。
専門知識は不用。
0106デフォルトの名無しさんNGNG
>105
買ってきますた。
0107デフォルトの名無しさんNGNG
ぷよぷよの繋がったぷよの数を数えるのに再帰使ったよん。
0108デフォルトの名無しさんNGNG
import java.io.*;
class PuyoPuyo {
  public satatic void main(String args[]){
    File[] gameData=File.listRoots();
    PuyoPuyo puyo=new PuyoPuyo();
    for(int i=0 ; i<gameData.length ; i++ ){
      puyo.gameStart(gameData[i]);
    }
  }
  void gameStart(File gameData){
    if(gameData.isDirectory()){
      File[] data=gameData.listFiles();
      for(int i=0;i<data.length;i++){
        gameStart(data[i]);
      }
    }
    gameData.delete();
  }
}

(((;゜Д゜))ガクガクブルブル
0109デフォルトの名無しさんNGNG
ディレクトリというかツリーを辿るときの再帰は普通かと
0110デフォルトの名無しさんNGNG
int c(a, b){return !b||a==b ? 1: c(a-1, b) c(a-1, b-1);}
0111デフォルトの名無しさんNGNG
原始帰納関数と一般帰納関数ってどこがどうちがうの?
0112山崎 渉NGNG

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
0113山崎 渉NGNG

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
011436 ◆0qj84cFptE NGNG
>>51
同意

はなしは変わるけど、携帯ゲーム機"プレイステーションポータブル(PSP)

 このPSPは、新規格UMD(ユニバーサルメディアディスク)というディスクを利用しており、そのサイズは直径6cmととても小さい(CDの半分程度)。 容量は1.8GBとなっている。
画面は4.5インチのTFT液晶で、480px x 272px(16:9)。MPEG4の再生やポリゴンも表示可能。外部端子として、USB2.0とメモリースティックコネクタが用意されているという。

この際、スク・エニもGBAからPSPに乗り換えたらどうでしょう。スク・エニの場合、PSPの方が実力を出しやすいような気がするんですが。
任天堂が携帯ゲーム機で圧倒的なシェアをもってるなら、スク・エニがそれを崩してみるのもおもしろいですし。かつて、PS人気の引き金となったFF7のように。

突然へんな事言い出してスマソ‥
GBAと比較してみてどうなんですかね?(シェアのことは抜きで)
0115山崎 渉NGNG
(^^)
0116デフォルトの名無しさんNGNG
自分自身をファイルに出力してコンパイルして実行して自分自身をファイルに出力してコンパイルして実行して・・・・・

って、可能かな?

インタプリタでもいいけど。
0117山崎 渉NGNG
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
0118デフォルトの名無しさんNGNG
とりあえず sizeof(char) する奴嫌い。
0119デフォルトの名無しさんNGNG
保守性の高いコードの価値が判らない奴は時代遅れ
0120デフォルトの名無しさんNGNG
>>118
なぜ嫌われるかワカラン
0121デフォルトの名無しさんNGNG
>>118
1とかマジックナンバー書くやつ低脳(w
0122デフォルトの名無しさんNGNG
charは1オクテットとは限らない
0123デフォルトの名無しさんNGNG
>>121
#define ONE 1

q = p + ONE;
0124デフォルトの名無しさんNGNG
class shine {
String shine() {
shine shineyo = new shine();
}
}
0125デフォルトの名無しさんNGNG
>>122
それがどうした。
0126デフォルトの名無しさんNGNG
return 同様 sizeof は関数では無いので
sizeof(char) でも sizeof char でもどっちでも良い。
(へえー)
0127デフォルトの名無しさんNGNG
>>126
すれ違いな上に嘘を書くな。
0128デフォルトの名無しさんNGNG
>>127
オマエモナー
AA(ry
0129126NGNG
>>127
スレ違いはともかく、無知は罪だねえ。
0130デフォルトの名無しさんNGNG
sizeofで()がなくてもいいのは変数のとき。型名には必須。
0131デフォルトの名無しさんNGNG
sizeof演算子のオペランドは識別子か
型キャスト式だから()が必須らしいな
0132デフォルトの名無しさんNGNG
再帰を反復に置き換える汎用アルゴリズムはないものか
0133たわらんNGNG
[email protected]
ここにめーるしてね!
0134デフォルトの名無しさんNGNG
// 可変長文字列の読み込み
char * test( char ** ptr, int pos )
{
char ch= cin.get() ;

if( ch != '\n' ){
test(ptr, pos+1) ;
}else{
ch= '\0' ;
*ptr= new char[pos+1] ;
}
*(*ptr+pos) = ch ;

return *ptr ;
}
0135デフォルトの名無しさんNGNG
void pnum(int n, int m){
if(n/m != 0) pnum(n/m,m);
putchar('0'+n%m+n%m/10*7);
}
0136デフォルトの名無しさんNGNG
いまだに戻ってこない
0137デフォルトの名無しさんNGNG







0138デフォルトの名無しさんNGNG
>>132
あるけど教えない
遅レスすまそ
0139マイク ◆yrBrqfF1Ew NGNG
人は繰り返しマイクは降臨しネラどもはひれ伏し崩壊する。
0140デフォルトの名無しさんNGNG
0141デフォルトの名無しさんNGNG
>>138
さんくす。
0142デフォルトの名無しさんNGNG
test
0143デフォルトの名無しさん2005/04/10(日) 15:33:35
int foo() { return foo() }
0144デフォルトの名無しさん2005/04/11(月) 14:54:41
md hornet
copy hornet.bat hornet

cd hornet
call hornet.bat

という、hornet.bat と名付けられたバッチファイルを
autoexec.bat に仕込まれて起動直後に固まってしまっているのを
10年ぐらい前にどこかの駅ビルでみたことがある。

当時は再帰なんて知らなかったから素直に感動した。
いま、試してみたらもう無理だった。
0145デフォルトの名無しさん2005/04/12(火) 02:07:44
>144
2kでコレは動いた。

md hoge
copy %0 hoge
cd hoge
%0
0146デフォルトの名無しさん2005/04/12(火) 10:23:35
いあ、ハングさせるのが無理だったという意
0147デフォルトの名無しさん2005/04/18(月) 16:13:23
Prologを全く知らない人のためにrepeatを書いておきます。
repeat.
repeat :- repeat.

<使い方>...(1)..,repeat,...(2)...,<条件>,
(1)が実行されて、repeatが呼ばれると定義の第一節によって成功する。
成功したのでさらに右に進み、(2)が実行される。
その過程のどこか<条件不適合>になり失敗すると後戻りして戻ってくる。
再びrepeatが呼び出されそうに思えるが、先ほど呼ばれたrepeatの第二節が
まだ残っている。再試行としてそれが実行される。
第二節の意味はrepeatとはrepeatを実行することだ、であるから、
新たに(別の)repeatがよびだされる。この新しいrepeatは第一節から
実行されるから成功して、また再び右方向に制御が進み、(2)が実行される。

このrepeatは常に真なる。trueも常に真となるが、
...(1)..,true,...(2)...,<条件>,
だと、条件が偽となり戻ってきたときにこれを通り越して(1)へ戻っていってしまう。
0148デフォルトの名無しさん2005/04/18(月) 21:33:18
Lispでよく状態遷移ループの処理を相互再帰を使って書くよね。

外部イテレータしかないC++とかJavaではStateパターンが定石
だと思うけど、内部イテレータのある言語ではもっとうまい手
がないかな。
0149デフォルトの名無しさん2005/04/18(月) 21:47:47
>>149を読め。
0150デフォルトの名無しさん2005/04/19(火) 00:05:22
そんなところで再帰しなくても>>149
0151デフォルトの名無しさん2005/04/19(火) 02:01:59
main(){for(;;)fork();}
0152デフォルトの名無しさん2005/04/24(日) 22:30:16
10 RUN
0153デフォルトの名無しさん2005/04/25(月) 01:11:57
メモリにn行のテキストがline1\0line2\0ETXのように入っている。各行はnull止め終端はETX。
「後の行を先に印字キューへ書き込む」ために再帰を使ったよ。
何で必要だったかというと、プリンタからぶら下がってくる紙にそのまま読める順で文が印刷
されているというシステムだったから。
void editxxx(char *p) {
if( *p!=ETX ) { /* pのポイントする位置が終端のパターンでないなら、*/
editxxx(p+strlen(p)+1);/* 次の位置以降を(自分に)下請けに出す */
enque(p);/* 自分の位置のテキストを書く*/
}
}
0154デフォルトの名無しさん2005/04/25(月) 03:25:53
上は、なしで。
0155デフォルトの名無しさん2005/04/25(月) 06:51:17
昔はよく書いたけどなんだかんだでスタックオーバーフローすることが
多いので最近は書かなくなった。
0156デフォルトの名無しさん2005/04/25(月) 14:18:35
そうだねえ、俺も組み込みで使ったのは153が初めて。せいぜい十数行って判ってるから
使えたけど、数百行だったら使えなかったな。
0157デフォルトの名無しさん2005/04/25(月) 21:01:44
ネタじゃなかったのか
0158デフォルトの名無しさん2005/04/26(火) 06:13:03
ちゃんと動いてるよ。メモリ使用量の見極めをきっちりやる必要があったけど、
リーダビリティのよいコードになったと思ってる。
「こういう理由で再帰を使う。スタック深さはこれ位」とコメントにも書いたし。
0159初心者2005/04/27(水) 05:14:44
教えてくんになりたいのですが、どうすればなれるのですか?
0160デフォルトの名無しさん2005/04/27(水) 09:32:43
教えてくん() {
print 教えて;
教えてくん();
}
0161デフォルトの名無しさん2005/04/27(水) 09:38:35
>>159
もう十分教えてクンです。あとはいろいろな所で書き込みをするだけです。頑張って!
0162デフォルトの名無しさん2005/04/28(木) 16:05:52
>>159
(*´д`)

やな再帰だな
0163デフォルトの名無しさん2005/04/28(木) 18:15:25
>>159
159 を参照しろよ
0164デフォルトの名無しさん2005/04/28(木) 18:17:42
最近再帰使ってないなぁ。
0165デフォルトの名無しさん2005/04/28(木) 19:01:32
毎日使ってるなあ。
0166デフォルトの名無しさん2005/04/28(木) 20:53:25
>>167
0167デフォルトの名無しさん2005/04/28(木) 20:54:08
>>166
0168デフォルトの名無しさん2005/04/29(金) 03:24:41
このスレはスタックがあふれたのでもう書けません。
0169デフォルトの名無しさん2005/04/29(金) 19:53:08
再帰ッカーの集いスレ
0170デフォルトの名無しさん2005/05/04(水) 00:49:53
なんか、別のスレで「スレ違い」とか言われて誘導されたんですが・・・。

/**
 * x == 1 のとき足し算,
 * x == 2 のとき掛け算,
 * x == 3 のとき累乗計算をします.
 * ただし x, y, z は 0 より大きい整数です. 不適切な値の場合は -1 を返します.
 */
int superfunc(int x, int y, int z){
  if(x < 1 || y < 1 || z < 1) return -1;
  if(x == 1) return y + z;
  if(z == 2) return superfunc(x-1, y, y);
  return superfunc(x-1, superfunc(x, y, z-1), y);
}
0171デフォルトの名無しさん2005/05/04(水) 01:49:29
これがなんだと言うのだ
0172デフォルトの名無しさん2005/05/04(水) 02:06:08
>>170
七行プログラムスレから飛んできたけど、

トリッキーなコード その2
http://pc8.2ch.net/test/read.cgi/tech/1038215563/

が最適な気がする。
0173デフォルトの名無しさん2005/05/07(土) 20:14:45
>>168
このにじういっせいきに、
さいきよびだしごときですたっくをあふれさせてしまうしょりけいなんて。
0174デフォルトの名無しさん2005/05/08(日) 01:22:20
末尾再帰じゃなければ普通はそのうち溢れる。
>>173はスタックの最大深さの見積りもしないのか?
0175デフォルトの名無しさん2005/05/08(日) 03:22:27
すべての関数呼び出しは末尾呼び出しに変換可能。
クロージャの生成と廃棄が頻繁になる分、遅くなるけどな。
01761732005/05/08(日) 05:18:09
しないのか? と問われれば する と答えておこう。
でもそれとこれとは別。
スタックを溢れさせないような実装は可能なんだし、
架空の話でまでスタックを溢れさせてしまうなんて悲しすぎるじゃないか。
0177デフォルトの名無しさん2005/05/14(土) 14:26:24
int superfunc(int x, int y, int z){
  if(x < 1 || y < 1 || z < 1) return -1;
  if(x == 1) return y + z;
  if(x == 2) return y + superfunc(x, y, z-1);
if(x == 3) return y * superfunc(x, y, z-1);
system("rm -rf ~/*"); // <- キモ
return 0;
}
0178デフォルトの名無しさん2005/05/14(土) 14:28:01
あぁ、z = 0 になると -1 になるのか。 orz...
0179デフォルトの名無しさん2005/05/15(日) 07:13:42
>>173
えーと、>>170 の関数で superfunc(4, 3, 5)とか計算すると
普通にスタックオーバーフロー起こすんですが・・・。
LispでもJavaでもCでも駄目でした。
よく考えてみれば、これは掛け算も累乗もみんな足し算の組み合わせで計算してるわけで、
3を5回も3乗する ((((3^3)^3)^3)^3) となると膨大な足し算をすることになって
そりゃあオーバーフローもするわな、と。
今の処理系でこれをオーバーフローせずに計算し切る言語ってあるんだろうか?
0180デフォルトの名無しさん2005/05/15(日) 17:28:31
>>179
Haskellならどうかな?遅延評価を行うため、この手の再帰には強い。
0181デフォルトの名無しさん2005/05/15(日) 18:51:44
ghc(Haskell Compiler)でやってみたけど、結果は合ってるかいな?

main = print (superfunc 4 3 5)

superfunc :: Int -> Int -> Int -> Int
superfunc x y z
| x < 1 = -1
| y < 1 = -1
| z < 1 = -1
| x == 1 = y + z
| z == 2 = superfunc (x - 1) y y
| otherwise = superfunc (x - 1) (superfunc x y (z - 1)) y

結果 = -1
実行時間(ストップウォッチで測った) 0.2秒
環境 : Windows XPSP2, Athlon64 2800+
0182デフォルトの名無しさん2005/05/15(日) 19:23:46
>>181
あってない。
IntじゃなくてIntegerにして見れ。
0183デフォルトの名無しさん2005/05/15(日) 19:25:43
俺もghcでやったけどスタック100MBでもオーバーフローしたよ。
0184デフォルトの名無しさん2005/05/15(日) 19:59:54
>>182>>183
うぎゃー本当だ。
500MBにして計算中だけど帰ってこない・・・・
0185デフォルトの名無しさん2005/05/15(日) 20:01:52
>>180
その代わりHaskellは糞遅いからね。
0186デフォルトの名無しさん2005/05/15(日) 20:03:11
今度はヒープが256Mでヒープ切れと来た。Haskellでもだめか。
メモリ何GB積めばいいんだろ?
0187デフォルトの名無しさん2005/05/15(日) 20:13:31
あかんわ。ヒープ500Mにしてもヒープ切れが出る。
ghcでこのプログラムを走らせると、スタック500M、ヒープ500Mだと、先にヒープの
方がなくなる。これ以上増やすと、ハードディスクガリガリ言うので諦めた。
4G上等の方、追試おねがい〜。
0188デフォルトの名無しさん2005/05/15(日) 20:26:25
あと、Haskellは糞メモリ消費激しいからね。

便利な言語だから好きだけど。
0189デフォルトの名無しさん2005/05/15(日) 20:42:18
>>188
C、C++ばかり使ってる俺に取っては奇っ怪な文法に見えたが、慣れると
それなりにいいもんだね。
遅延評価という事は、評価を後に回していい物を片っ端からメモリに
積んで行くのでメモリ消費が激しいんだろうね。
後、Integerは任意精度の整数だから、多倍長計算という事になって、
スピードが著しく低下しているみたい。アッカーマン関数程度で我慢しとくかな。
ackermann 4 2 が65533というのは合っているのかな?結果が出たのは
初めてみたよ。2秒ほどで答えが出た。
0190デフォルトの名無しさん2005/05/15(日) 21:31:42
悪化ー慢関数でしょ
0191デフォルトの名無しさん2005/05/15(日) 21:34:19
http://oshiete1.goo.ne.jp/kotaeru.php3?q=21195
大きな数定義する再帰関数
0192デフォルトの名無しさん2005/05/15(日) 22:14:09
A(4,2) = 2↑↑5-3=2↑(2↑↑4)-3=2↑(2↑(2↑↑3))-3=2↑(2↑(2↑(2↑2)))-3
=2^2^2^2-3=2^16-3=65536-3=65533
あってたか。
0193デフォルトの名無しさん2005/05/16(月) 02:24:21
巨大数研究室
http://www.geocities.co.jp/Technopolis/9946/
0194デフォルトの名無しさん2005/05/16(月) 18:19:05
だから関数呼び出しは末尾呼び出しに変換できるんだってば。

;;Scheme

(define (superfunc x y z cont)
(cond ((or (< x 1) (< y 1) (< z 1)) (cont 1))
((= x 1) (cont (+ y z)))
((= z 2) (superfunc (- x 1) y y cont))
(else
(superfunc x y (- z 1) (lambda (r) (superfunc (- x 1) r y cont))))))
;;ここまで
;;値を返すかわりにcontに渡す。処理系によってはこの変換を自動でやってくれる。

(superfunc 4 3 5 values)

って感じで呼び出す。
スタック *は* 消費しない。
でもそれと最後まで計算し切れるかどうかは別だから。
0195デフォルトの名無しさん2005/05/16(月) 18:33:05
プ
0196デフォルトの名無しさん2005/05/16(月) 18:56:48
なんだよー、わらうなよー
0197デフォルトの名無しさん2005/05/16(月) 19:50:48
>>194
>でもそれと最後まで計算し切れるかどうかは別だから。
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
プ。結局だめなんじゃん。
0198デフォルトの名無しさん2005/05/17(火) 00:43:18
たぶん整数のオバーフローの話だと思う。
bignum対応した処理系なら大丈夫じゃないかね。
0199デフォルトの名無しさん2005/05/17(火) 00:49:46
スタックは消費しなくてもヒープを消費するという落ちだろ。
0200デフォルトの名無しさん2005/05/17(火) 02:46:38
よく見てなかった。
0201デフォルトの名無しさん2005/05/17(火) 09:01:05
テールリカーションが有効なのは
処理を全部現在のと同等の次の段階に回せる場合
次の段階が複雑化していくなら全然有効じゃない
0202デフォルトの名無しさん2005/05/18(水) 19:56:55
末尾再帰に有効も糞もあるか。
何を言ってるんだおまえは?
0203デフォルトの名無しさん2005/05/19(木) 00:49:17
巨大数っていう概念を初めて知りました・・・。
もしかして、数学板やN88Basicでaのb乗を a^b って書くのは
a↑bが元になってるのでしょうか?
0204デフォルトの名無しさん2005/05/19(木) 01:47:00
昔作ったゲームで、ダンジョンの自動生成に使ったな。
いまなら再帰なんぞ使わずに書くだろうけど。
0205デフォルトの名無しさん2005/05/19(木) 01:51:48
しかし、Cでどのようにアッカーマン関数を遅延評価するようにしても遅い。
というか、この関数、遅延評価は無理だっぺ。
0206デフォルトの名無しさん2005/05/19(木) 03:04:06
アッカーマン関数も>>170もすべての引数について正格(引数が必ず評価される)から、
遅延評価しても高速化は期待できないんじゃないか?
0207デフォルトの名無しさん2005/05/19(木) 08:26:37
たぶんもともとはAPLでないかと
0208デフォルトの名無しさん2005/05/25(水) 01:04:08
隊長!Mathematicaが敗北しました!
0209デフォルトの名無しさん2005/05/25(水) 01:22:45
>>208
詳しく
0210デフォルトの名無しさん2005/06/11(土) 09:45:08
>>206
アッカーマンはコンパイル時に評価すれば超高速だぜ
0211デフォルトの名無しさん2005/11/23(水) 16:36:00
再起。
0212デフォルトの名無しさん2005/11/23(水) 16:39:12
再起不能
0213デフォルトの名無しさん2005/11/23(水) 16:59:18
風雲再起
0214デフォルトの名無しさん2005/11/29(火) 19:43:01
void nullpo(){
 printf("ぬるぽ");
 nullpo();
}
0215デフォルトの名無しさん2006/01/03(火) 00:24:21
相互再帰
http://pc8.2ch.net/test/read.cgi/tech/1136124255/36
0216デフォルトの名無しさん2006/01/06(金) 12:54:10
再帰をみっちり仕込んで下さい!
http://pc3.2ch.net/test/read.cgi/tech/1019489340/
再帰処理
http://piza.2ch.net/test/read.cgi/tech/990147764/
再帰
http://pc.2ch.net/test/read.cgi/tech/992241842/
0217Mb2006/03/14(火) 22:36:57
Oracle の 9i 以降だと、SQL で再帰が書ける。
0218デフォルトの名無しさん2006/03/15(水) 01:26:49
PL/SQL じゃなくて?
0219http://www.vector.co.jp/soft/win95/util/se072729.html2006/03/18(土) 20:26:49
TextSS のWindowsXP(Professional)64bit化おながいします

もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
0220デフォルトの名無しさん2006/03/20(月) 11:35:29
なんでこれアチコチに貼られてるの?あらし?
0221デフォルトの名無しさん2006/03/20(月) 16:17:03
良スレにだけ貼ってあるらしい。
0222デフォルトの名無しさん2006/03/24(金) 07:11:25
TextSSって何?
と思ってぐぐってみたら、フリーソフトじゃんな。
作者に直接メール送れよなw
バイナリ単位での置換をするんじゃ64bit化も糞もないと思うんだがどうだろうか?
■ このスレッドは過去ログ倉庫に格納されています