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

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

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

再帰を使った面白い関数・メソッドを書いてください。
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();}
■ このスレッドは過去ログ倉庫に格納されています