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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
人は繰り返す・・・
そして神は再帰する・・・

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

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



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

漏れもいやだYOYO
41:03/03/20 00:49
えーん、かいてよー・・・
5デフォルトの名無しさん:03/03/20 00:53
int main(void)
{
  cout << "Hello World!!" << endl;
  return main();
}
#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);

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

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

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

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

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

人類滅亡のその日に

関数はreturnする。
>>33
いや、全人類が男と閉経後のばばぁのみになった時点でreturnだ。
>>28
ネット越しにスワップアウトするシステムが実装されたら・・・
37デフォルトの名無しさん:03/03/22 18:56
HTMLのハイパーリンクは一方通行だから、再「帰」っていう感じはしないなあ・・・・
>>37
たとえ戻ったとしてもそれに何の意味があるというのか。
前にこんなの書いたなぁ。
ファイルから一行取得する関数。

ファイルの一行目に何文字あろうと、
全部がんばってとってきてヒープに格納するやつ

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;
}

あんま、再帰をうまく利用してるって感じはしないけど。
しかし、今見るとなにやってるかぜんぜんわからん(藁
>>39
>   char linebuf[BUFSIZ+1];
>   do{
>     linebuf[i] = (char)fgetc( istream );
>     if( linebuf[i]==EOF || linebuf[i]=='\n' ){

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

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

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

>>51
>とりあえず sizeof(char) する奴嫌い。

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

C++でmain呼んじゃダメだろ。馬鹿
まえどっかに、1に>>36みたく書いてるやつあったべ。
6739:03/03/24 22:43
>>59
feof イイ!! そんな便利なもんがあるのワスれてた。
うにコード対応?わけわからんソース修正してくれて感謝。

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

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

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

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

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

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

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

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

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

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

int gcm( int x, int y )
{
int z;
while(z=x%y) x=y, y=z;
return y;
}
括弧の内側にスペースがはいっていませんよ。
7839:03/03/26 02:39
>>77
漏れの想像力をはるかに超えたオチ!
笑わせようとしたつもりが笑わされた!
「とりあえず 〜 奴嫌い。」とくると思ったのに!悔しい!悔しい!
ifやwhileと括弧の間にスペースが(ry
>>75はyを返す関数ですか?
>>80
確かにそうだw
8239:03/03/26 23:41
>>80
えっ?
えーと、いやいや。皆さんを試したんですよ僕は。
見てないんじゃないかとおもって。あは、あははは。




>>ナナシサソ59さんへ
59さん!緊急事態です! if の後に return が抜けちゃってました!
しかも、80さんに指摘されてユーグリッドの互除法を、
再度調べ直してたら gcm でなくて gcd であることにも気が付きました!
さりげなく直しておいてください!!
unicodeに対応しつつ、何事も無かったかのようにさりげなく直しておいてください!!
再帰で感動したのは「ハノイの塔」だったなあ・・・(遠い目)
これ、簡単なベンチマークにイイと思うんだけど。
実際にn枚目の皿に相当する数値をメモリ内で移動させるようにして
やらせてみた。16枚以上は、1秒間だけ走らせてその時間を基にどの位で
終わるか表示させて遊んだな。60枚位で何億年とか出て面白かった。
うっほっほ。
85def hage:03/03/29 19:40
puts "禿"
>>85
void printhex( unsigned int n )
{
  if( n > 0xf ) printhex( n >> 4 );
  putchar( "0123456789ABCDEF"[ n & 0xf ] );
}
8783:03/03/29 21:13
にゃるほど。実際にデバック用のコードで、こんな感じのは使ってますね。
勿論再帰版ではなくて桁数決めて非再帰コードですが。昔、演習問題ですが
stringの長さを数えるのに再帰を使ってる例がありましたね。
文字列の長さ数えるのに、文字数分ワードをpushするんかい、おい!
とか思いましたが、学問として正しさのみを云々するには面白い問題ですね。
再帰なら、オセロとかのプログラムでCPUに先読みさせるときに使ったなぁ。
コッホコッホ
90山崎渉:03/04/17 15:48
(^^)
>>92 相互
>>91 リンク
再帰スレで相互といったら
相互再帰だろうがぁぁぁっっっっっ!!!!!!
俺も再帰って凄いなと思ったのは相互再帰のコードを見た時だ。
相互ってないやつはフーンって感じだったけど。
95デフォルトの名無しさん:03/05/15 14:01
実務にアクロバットは要らない。
96デフォルトの名無しさん:03/05/15 15:06
カリーカリー
97デフォルトの名無しさん:03/05/15 20:24
>>80 yを返す関数
で思い出したけど、Y-combinator って何よ?
再帰は、複雑になりそうなところをシンプルに記述出来るのが
メリットなのだが、>>39 (>>59) は再帰を使ったことで
readsize という引数が増えるなどプログラムを複雑化しており、
本末転倒
>>98
関数型言語系スレの過去ログにあったよ
101の書く事を信用してはいけない
>>101
エピメニデス文だね!
「ゲーデル・エッシャー・バッハ」って面白い?
読もう、読もうと思っててすぐ忘れてしまうん。
104山崎渉:03/05/28 13:01
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
>>103
それなりに面白いが、プログラムよりの話はそんなに出ない。
専門知識は不用。
>105
買ってきますた。
ぷよぷよの繋がったぷよの数を数えるのに再帰使ったよん。
108デフォルトの名無しさん:03/06/15 18:02
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();
  }
}

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

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
113山崎 渉:03/07/15 14:20

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
11436 ◆0qj84cFptE :03/07/23 16:54
>>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と比較してみてどうなんですかね?(シェアのことは抜きで)
115山崎 渉:03/08/02 02:42
(^^)
116デフォルトの名無しさん:03/08/13 23:01
自分自身をファイルに出力してコンパイルして実行して自分自身をファイルに出力してコンパイルして実行して・・・・・

って、可能かな?

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

q = p + ONE;
124デフォルトの名無しさん:03/08/17 00:58
class shine {
String shine() {
shine shineyo = new shine();
}
}
125デフォルトの名無しさん:03/08/17 00:59
>>122
それがどうした。
return 同様 sizeof は関数では無いので
sizeof(char) でも sizeof char でもどっちでも良い。
(へえー)
>>126
すれ違いな上に嘘を書くな。
>>127
オマエモナー
AA(ry
129126:03/08/17 21:59
>>127
スレ違いはともかく、無知は罪だねえ。
sizeofで()がなくてもいいのは変数のとき。型名には必須。
sizeof演算子のオペランドは識別子か
型キャスト式だから()が必須らしいな
132デフォルトの名無しさん:03/10/14 20:23
再帰を反復に置き換える汎用アルゴリズムはないものか
133たわらん:03/10/15 00:19
[email protected]
ここにめーるしてね!
134デフォルトの名無しさん:04/05/25 22:28
// 可変長文字列の読み込み
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 ;
}
void pnum(int n, int m){
if(n/m != 0) pnum(n/m,m);
putchar('0'+n%m+n%m/10*7);
}
136デフォルトの名無しさん:04/11/13 08:19:13
いまだに戻ってこない
137デフォルトの名無しさん:04/11/18 04:11:40







138デフォルトの名無しさん:04/11/18 04:42:45
>>132
あるけど教えない
遅レスすまそ
139マイク ◆yrBrqfF1Ew :04/11/18 07:00:47
人は繰り返しマイクは降臨しネラどもはひれ伏し崩壊する。
140デフォルトの名無しさん:04/11/22 10:37:03
141デフォルトの名無しさん:04/12/19 14:40:41
>>138
さんくす。
142デフォルトの名無しさん:05/03/16 17:24:11 ID:??? BE:149957478-
test
143デフォルトの名無しさん:2005/04/10(日) 15:33:35
int foo() { return foo() }
144デフォルトの名無しさん:2005/04/11(月) 14:54:41
md hornet
copy hornet.bat hornet

cd hornet
call hornet.bat

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

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

md hoge
copy %0 hoge
cd hoge
%0
146デフォルトの名無しさん:2005/04/12(火) 10:23:35
いあ、ハングさせるのが無理だったという意
147デフォルトの名無しさん: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)へ戻っていってしまう。
148デフォルトの名無しさん:2005/04/18(月) 21:33:18
Lispでよく状態遷移ループの処理を相互再帰を使って書くよね。

外部イテレータしかないC++とかJavaではStateパターンが定石
だと思うけど、内部イテレータのある言語ではもっとうまい手
がないかな。
149デフォルトの名無しさん:2005/04/18(月) 21:47:47
>>149を読め。
150デフォルトの名無しさん:2005/04/19(火) 00:05:22
そんなところで再帰しなくても>>149
151デフォルトの名無しさん:2005/04/19(火) 02:01:59
main(){for(;;)fork();}
152デフォルトの名無しさん:2005/04/24(日) 22:30:16
10 RUN
153デフォルトの名無しさん: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);/* 自分の位置のテキストを書く*/
}
}
154デフォルトの名無しさん:2005/04/25(月) 03:25:53
上は、なしで。
155デフォルトの名無しさん:2005/04/25(月) 06:51:17
昔はよく書いたけどなんだかんだでスタックオーバーフローすることが
多いので最近は書かなくなった。
156デフォルトの名無しさん:2005/04/25(月) 14:18:35
そうだねえ、俺も組み込みで使ったのは153が初めて。せいぜい十数行って判ってるから
使えたけど、数百行だったら使えなかったな。
157デフォルトの名無しさん:2005/04/25(月) 21:01:44
ネタじゃなかったのか
158デフォルトの名無しさん:2005/04/26(火) 06:13:03
ちゃんと動いてるよ。メモリ使用量の見極めをきっちりやる必要があったけど、
リーダビリティのよいコードになったと思ってる。
「こういう理由で再帰を使う。スタック深さはこれ位」とコメントにも書いたし。
159初心者:2005/04/27(水) 05:14:44
教えてくんになりたいのですが、どうすればなれるのですか?
160デフォルトの名無しさん:2005/04/27(水) 09:32:43
教えてくん() {
print 教えて;
教えてくん();
}
161デフォルトの名無しさん:2005/04/27(水) 09:38:35
>>159
もう十分教えてクンです。あとはいろいろな所で書き込みをするだけです。頑張って!
162デフォルトの名無しさん:2005/04/28(木) 16:05:52
>>159
(*´д`)

やな再帰だな
163デフォルトの名無しさん:2005/04/28(木) 18:15:25
>>159
159 を参照しろよ
164デフォルトの名無しさん:2005/04/28(木) 18:17:42
最近再帰使ってないなぁ。
165デフォルトの名無しさん:2005/04/28(木) 19:01:32
毎日使ってるなあ。
166デフォルトの名無しさん:2005/04/28(木) 20:53:25
167デフォルトの名無しさん:2005/04/28(木) 20:54:08
168デフォルトの名無しさん:2005/04/29(金) 03:24:41
このスレはスタックがあふれたのでもう書けません。
169デフォルトの名無しさん:2005/04/29(金) 19:53:08
再帰ッカーの集いスレ
170デフォルトの名無しさん: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);
}
171デフォルトの名無しさん:2005/05/04(水) 01:49:29
これがなんだと言うのだ
172デフォルトの名無しさん:2005/05/04(水) 02:06:08
>>170
七行プログラムスレから飛んできたけど、

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

が最適な気がする。
173デフォルトの名無しさん:2005/05/07(土) 20:14:45
>>168
このにじういっせいきに、
さいきよびだしごときですたっくをあふれさせてしまうしょりけいなんて。
174デフォルトの名無しさん:2005/05/08(日) 01:22:20
末尾再帰じゃなければ普通はそのうち溢れる。
>>173はスタックの最大深さの見積りもしないのか?
175デフォルトの名無しさん:2005/05/08(日) 03:22:27
すべての関数呼び出しは末尾呼び出しに変換可能。
クロージャの生成と廃棄が頻繁になる分、遅くなるけどな。
176173:2005/05/08(日) 05:18:09
しないのか? と問われれば する と答えておこう。
でもそれとこれとは別。
スタックを溢れさせないような実装は可能なんだし、
架空の話でまでスタックを溢れさせてしまうなんて悲しすぎるじゃないか。
177デフォルトの名無しさん: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;
}
178デフォルトの名無しさん:2005/05/14(土) 14:28:01
あぁ、z = 0 になると -1 になるのか。 orz...
179デフォルトの名無しさん:2005/05/15(日) 07:13:42
>>173
えーと、>>170 の関数で superfunc(4, 3, 5)とか計算すると
普通にスタックオーバーフロー起こすんですが・・・。
LispでもJavaでもCでも駄目でした。
よく考えてみれば、これは掛け算も累乗もみんな足し算の組み合わせで計算してるわけで、
3を5回も3乗する ((((3^3)^3)^3)^3) となると膨大な足し算をすることになって
そりゃあオーバーフローもするわな、と。
今の処理系でこれをオーバーフローせずに計算し切る言語ってあるんだろうか?
180デフォルトの名無しさん:2005/05/15(日) 17:28:31
>>179
Haskellならどうかな?遅延評価を行うため、この手の再帰には強い。
181デフォルトの名無しさん: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+
182デフォルトの名無しさん:2005/05/15(日) 19:23:46
>>181
あってない。
IntじゃなくてIntegerにして見れ。
183デフォルトの名無しさん:2005/05/15(日) 19:25:43
俺もghcでやったけどスタック100MBでもオーバーフローしたよ。
184デフォルトの名無しさん:2005/05/15(日) 19:59:54
>>182>>183
うぎゃー本当だ。
500MBにして計算中だけど帰ってこない・・・・
185デフォルトの名無しさん:2005/05/15(日) 20:01:52
>>180
その代わりHaskellは糞遅いからね。
186デフォルトの名無しさん:2005/05/15(日) 20:03:11
今度はヒープが256Mでヒープ切れと来た。Haskellでもだめか。
メモリ何GB積めばいいんだろ?
187デフォルトの名無しさん:2005/05/15(日) 20:13:31
あかんわ。ヒープ500Mにしてもヒープ切れが出る。
ghcでこのプログラムを走らせると、スタック500M、ヒープ500Mだと、先にヒープの
方がなくなる。これ以上増やすと、ハードディスクガリガリ言うので諦めた。
4G上等の方、追試おねがい〜。
188デフォルトの名無しさん:2005/05/15(日) 20:26:25
あと、Haskellは糞メモリ消費激しいからね。

便利な言語だから好きだけど。
189デフォルトの名無しさん:2005/05/15(日) 20:42:18
>>188
C、C++ばかり使ってる俺に取っては奇っ怪な文法に見えたが、慣れると
それなりにいいもんだね。
遅延評価という事は、評価を後に回していい物を片っ端からメモリに
積んで行くのでメモリ消費が激しいんだろうね。
後、Integerは任意精度の整数だから、多倍長計算という事になって、
スピードが著しく低下しているみたい。アッカーマン関数程度で我慢しとくかな。
ackermann 4 2 が65533というのは合っているのかな?結果が出たのは
初めてみたよ。2秒ほどで答えが出た。
190デフォルトの名無しさん:2005/05/15(日) 21:31:42
悪化ー慢関数でしょ
191デフォルトの名無しさん:2005/05/15(日) 21:34:19
http://oshiete1.goo.ne.jp/kotaeru.php3?q=21195
大きな数定義する再帰関数
192デフォルトの名無しさん: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
あってたか。
193デフォルトの名無しさん:2005/05/16(月) 02:24:21
194デフォルトの名無しさん: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)

って感じで呼び出す。
スタック *は* 消費しない。
でもそれと最後まで計算し切れるかどうかは別だから。
195デフォルトの名無しさん:2005/05/16(月) 18:33:05
プ
196デフォルトの名無しさん:2005/05/16(月) 18:56:48
なんだよー、わらうなよー
197デフォルトの名無しさん:2005/05/16(月) 19:50:48
>>194
>でもそれと最後まで計算し切れるかどうかは別だから。
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
プ。結局だめなんじゃん。
198デフォルトの名無しさん:2005/05/17(火) 00:43:18
たぶん整数のオバーフローの話だと思う。
bignum対応した処理系なら大丈夫じゃないかね。
199デフォルトの名無しさん:2005/05/17(火) 00:49:46
スタックは消費しなくてもヒープを消費するという落ちだろ。
200デフォルトの名無しさん:2005/05/17(火) 02:46:38
よく見てなかった。
201デフォルトの名無しさん:2005/05/17(火) 09:01:05
テールリカーションが有効なのは
処理を全部現在のと同等の次の段階に回せる場合
次の段階が複雑化していくなら全然有効じゃない
202デフォルトの名無しさん:2005/05/18(水) 19:56:55
末尾再帰に有効も糞もあるか。
何を言ってるんだおまえは?
203デフォルトの名無しさん:2005/05/19(木) 00:49:17
巨大数っていう概念を初めて知りました・・・。
もしかして、数学板やN88Basicでaのb乗を a^b って書くのは
a↑bが元になってるのでしょうか?
204デフォルトの名無しさん:2005/05/19(木) 01:47:00
昔作ったゲームで、ダンジョンの自動生成に使ったな。
いまなら再帰なんぞ使わずに書くだろうけど。
205デフォルトの名無しさん:2005/05/19(木) 01:51:48
しかし、Cでどのようにアッカーマン関数を遅延評価するようにしても遅い。
というか、この関数、遅延評価は無理だっぺ。
206デフォルトの名無しさん:2005/05/19(木) 03:04:06
アッカーマン関数も>>170もすべての引数について正格(引数が必ず評価される)から、
遅延評価しても高速化は期待できないんじゃないか?
207デフォルトの名無しさん:2005/05/19(木) 08:26:37
たぶんもともとはAPLでないかと
208デフォルトの名無しさん:2005/05/25(水) 01:04:08
隊長!Mathematicaが敗北しました!
209デフォルトの名無しさん:2005/05/25(水) 01:22:45
>>208
詳しく
210デフォルトの名無しさん:2005/06/11(土) 09:45:08
>>206
アッカーマンはコンパイル時に評価すれば超高速だぜ
211デフォルトの名無しさん:2005/11/23(水) 16:36:00
再起。
212デフォルトの名無しさん:2005/11/23(水) 16:39:12
再起不能
213デフォルトの名無しさん:2005/11/23(水) 16:59:18
風雲再起
214デフォルトの名無しさん:2005/11/29(火) 19:43:01
void nullpo(){
 printf("ぬるぽ");
 nullpo();
}
215デフォルトの名無しさん:2006/01/03(火) 00:24:21
216デフォルトの名無しさん:2006/01/06(金) 12:54:10
217Mb:2006/03/14(火) 22:36:57
Oracle の 9i 以降だと、SQL で再帰が書ける。
218デフォルトの名無しさん:2006/03/15(水) 01:26:49
PL/SQL じゃなくて?
TextSS のWindowsXP(Professional)64bit化おながいします

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