【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デフォルトの名無しさん
NGNG0102デフォルトの名無しさん
NGNGエピメニデス文だね!
0103デフォルトの名無しさん
NGNG読もう、読もうと思っててすぐ忘れてしまうん。
0104山崎渉
NGNGピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ 山崎渉
0105デフォルトの名無しさん
NGNGそれなりに面白いが、プログラムよりの話はそんなに出ない。
専門知識は不用。
0106デフォルトの名無しさん
NGNG買ってきますた。
0107デフォルトの名無しさん
NGNG0108デフォルトの名無しさん
NGNGclass 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デフォルトの名無しさん
NGNG0110デフォルトの名無しさん
NGNG0111デフォルトの名無しさん
NGNG0112山崎 渉
NGNG__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
0113山崎 渉
NGNG__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
011436 ◆0qj84cFptE
NGNG同意
はなしは変わるけど、携帯ゲーム機"プレイステーションポータブル(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山崎 渉
NGNG0116デフォルトの名無しさん
NGNGって、可能かな?
インタプリタでもいいけど。
0117山崎 渉
NGNG│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
0118デフォルトの名無しさん
NGNG0119デフォルトの名無しさん
NGNG0120デフォルトの名無しさん
NGNGなぜ嫌われるかワカラン
0121デフォルトの名無しさん
NGNG1とかマジックナンバー書くやつ低脳(w
0122デフォルトの名無しさん
NGNG0123デフォルトの名無しさん
NGNG#define ONE 1
q = p + ONE;
0124デフォルトの名無しさん
NGNGString shine() {
shine shineyo = new shine();
}
}
0125デフォルトの名無しさん
NGNGそれがどうした。
0126デフォルトの名無しさん
NGNGsizeof(char) でも sizeof char でもどっちでも良い。
(へえー)
0127デフォルトの名無しさん
NGNGすれ違いな上に嘘を書くな。
0128デフォルトの名無しさん
NGNGオマエモナー
AA(ry
0130デフォルトの名無しさん
NGNG0131デフォルトの名無しさん
NGNG型キャスト式だから()が必須らしいな
0132デフォルトの名無しさん
NGNG0133たわらん
NGNGここにめーるしてね!
0134デフォルトの名無しさん
NGNGchar * 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デフォルトの名無しさん
NGNGif(n/m != 0) pnum(n/m,m);
putchar('0'+n%m+n%m/10*7);
}
0136デフォルトの名無しさん
NGNG0137デフォルトの名無しさん
NGNG0138デフォルトの名無しさん
NGNGあるけど教えない
遅レスすまそ
0139マイク ◆yrBrqfF1Ew
NGNG0140デフォルトの名無しさん
NGNG0141デフォルトの名無しさん
NGNGさんくす。
0142デフォルトの名無しさん
NGNG0143デフォルトの名無しさん
2005/04/10(日) 15:33:350144デフォルトの名無しさん
2005/04/11(月) 14:54:41copy hornet.bat hornet
cd hornet
call hornet.bat
という、hornet.bat と名付けられたバッチファイルを
autoexec.bat に仕込まれて起動直後に固まってしまっているのを
10年ぐらい前にどこかの駅ビルでみたことがある。
当時は再帰なんて知らなかったから素直に感動した。
いま、試してみたらもう無理だった。
0145デフォルトの名無しさん
2005/04/12(火) 02:07:442kでコレは動いた。
md hoge
copy %0 hoge
cd hoge
%0
0146デフォルトの名無しさん
2005/04/12(火) 10:23:350147デフォルトの名無しさん
2005/04/18(月) 16:13:23repeat.
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外部イテレータしかないC++とかJavaではStateパターンが定石
だと思うけど、内部イテレータのある言語ではもっとうまい手
がないかな。
0149デフォルトの名無しさん
2005/04/18(月) 21:47:470150デフォルトの名無しさん
2005/04/19(火) 00:05:220151デフォルトの名無しさん
2005/04/19(火) 02:01:590152デフォルトの名無しさん
2005/04/24(日) 22:30:160153デフォルトの名無しさん
2005/04/25(月) 01:11:57「後の行を先に印字キューへ書き込む」ために再帰を使ったよ。
何で必要だったかというと、プリンタからぶら下がってくる紙にそのまま読める順で文が印刷
されているというシステムだったから。
void editxxx(char *p) {
if( *p!=ETX ) { /* pのポイントする位置が終端のパターンでないなら、*/
editxxx(p+strlen(p)+1);/* 次の位置以降を(自分に)下請けに出す */
enque(p);/* 自分の位置のテキストを書く*/
}
}
0154デフォルトの名無しさん
2005/04/25(月) 03:25:530155デフォルトの名無しさん
2005/04/25(月) 06:51:17多いので最近は書かなくなった。
0156デフォルトの名無しさん
2005/04/25(月) 14:18:35使えたけど、数百行だったら使えなかったな。
0157デフォルトの名無しさん
2005/04/25(月) 21:01:440158デフォルトの名無しさん
2005/04/26(火) 06:13:03リーダビリティのよいコードになったと思ってる。
「こういう理由で再帰を使う。スタック深さはこれ位」とコメントにも書いたし。
0159初心者
2005/04/27(水) 05:14:440160デフォルトの名無しさん
2005/04/27(水) 09:32:43print 教えて;
教えてくん();
}
0161デフォルトの名無しさん
2005/04/27(水) 09:38:35もう十分教えてクンです。あとはいろいろな所で書き込みをするだけです。頑張って!
0162デフォルトの名無しさん
2005/04/28(木) 16:05:52(*´д`)
やな再帰だな
0163デフォルトの名無しさん
2005/04/28(木) 18:15:25159 を参照しろよ
0164デフォルトの名無しさん
2005/04/28(木) 18:17:420165デフォルトの名無しさん
2005/04/28(木) 19:01:320166デフォルトの名無しさん
2005/04/28(木) 20:53:250167デフォルトの名無しさん
2005/04/28(木) 20:54:080168デフォルトの名無しさん
2005/04/29(金) 03:24:410169デフォルトの名無しさん
2005/04/29(金) 19:53:080170デフォルトの名無しさん
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:290172デフォルトの名無しさん
2005/05/04(水) 02:06:08七行プログラムスレから飛んできたけど、
トリッキーなコード その2
http://pc8.2ch.net/test/read.cgi/tech/1038215563/
が最適な気がする。
0173デフォルトの名無しさん
2005/05/07(土) 20:14:45このにじういっせいきに、
さいきよびだしごときですたっくをあふれさせてしまうしょりけいなんて。
0174デフォルトの名無しさん
2005/05/08(日) 01:22:20>>173はスタックの最大深さの見積りもしないのか?
0175デフォルトの名無しさん
2005/05/08(日) 03:22:27クロージャの生成と廃棄が頻繁になる分、遅くなるけどな。
0176173
2005/05/08(日) 05:18:09でもそれとこれとは別。
スタックを溢れさせないような実装は可能なんだし、
架空の話でまでスタックを溢れさせてしまうなんて悲しすぎるじゃないか。
0177デフォルトの名無しさん
2005/05/14(土) 14:26:24if(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:010179デフォルトの名無しさん
2005/05/15(日) 07:13:42えーと、>>170 の関数で superfunc(4, 3, 5)とか計算すると
普通にスタックオーバーフロー起こすんですが・・・。
LispでもJavaでもCでも駄目でした。
よく考えてみれば、これは掛け算も累乗もみんな足し算の組み合わせで計算してるわけで、
3を5回も3乗する ((((3^3)^3)^3)^3) となると膨大な足し算をすることになって
そりゃあオーバーフローもするわな、と。
今の処理系でこれをオーバーフローせずに計算し切る言語ってあるんだろうか?
0180デフォルトの名無しさん
2005/05/15(日) 17:28:31Haskellならどうかな?遅延評価を行うため、この手の再帰には強い。
0181デフォルトの名無しさん
2005/05/15(日) 18:51:44main = 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あってない。
IntじゃなくてIntegerにして見れ。
0183デフォルトの名無しさん
2005/05/15(日) 19:25:430184デフォルトの名無しさん
2005/05/15(日) 19:59:54うぎゃー本当だ。
500MBにして計算中だけど帰ってこない・・・・
0185デフォルトの名無しさん
2005/05/15(日) 20:01:52その代わりHaskellは糞遅いからね。
0186デフォルトの名無しさん
2005/05/15(日) 20:03:11メモリ何GB積めばいいんだろ?
0187デフォルトの名無しさん
2005/05/15(日) 20:13:31ghcでこのプログラムを走らせると、スタック500M、ヒープ500Mだと、先にヒープの
方がなくなる。これ以上増やすと、ハードディスクガリガリ言うので諦めた。
4G上等の方、追試おねがい〜。
0188デフォルトの名無しさん
2005/05/15(日) 20:26:25便利な言語だから好きだけど。
0189デフォルトの名無しさん
2005/05/15(日) 20:42:18C、C++ばかり使ってる俺に取っては奇っ怪な文法に見えたが、慣れると
それなりにいいもんだね。
遅延評価という事は、評価を後に回していい物を片っ端からメモリに
積んで行くのでメモリ消費が激しいんだろうね。
後、Integerは任意精度の整数だから、多倍長計算という事になって、
スピードが著しく低下しているみたい。アッカーマン関数程度で我慢しとくかな。
ackermann 4 2 が65533というのは合っているのかな?結果が出たのは
初めてみたよ。2秒ほどで答えが出た。
0190デフォルトの名無しさん
2005/05/15(日) 21:31:420191デフォルトの名無しさん
2005/05/15(日) 21:34:19大きな数定義する再帰関数
0192デフォルトの名無しさん
2005/05/15(日) 22:14:09=2^2^2^2-3=2^16-3=65536-3=65533
あってたか。
0193デフォルトの名無しさん
2005/05/16(月) 02:24:21http://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:050196デフォルトの名無しさん
2005/05/16(月) 18:56:480197デフォルトの名無しさん
2005/05/16(月) 19:50:48>でもそれと最後まで計算し切れるかどうかは別だから。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
プ。結局だめなんじゃん。
0198デフォルトの名無しさん
2005/05/17(火) 00:43:18bignum対応した処理系なら大丈夫じゃないかね。
0199デフォルトの名無しさん
2005/05/17(火) 00:49:460200デフォルトの名無しさん
2005/05/17(火) 02:46:380201デフォルトの名無しさん
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というか、この関数、遅延評価は無理だっぺ。
0206デフォルトの名無しさん
2005/05/19(木) 03:04:06遅延評価しても高速化は期待できないんじゃないか?
0207デフォルトの名無しさん
2005/05/19(木) 08:26:370208デフォルトの名無しさん
2005/05/25(水) 01:04:080209デフォルトの名無しさん
2005/05/25(水) 01:22:45詳しく
0210デフォルトの名無しさん
2005/06/11(土) 09:45:08アッカーマンはコンパイル時に評価すれば超高速だぜ
0211デフォルトの名無しさん
2005/11/23(水) 16:36:000212デフォルトの名無しさん
2005/11/23(水) 16:39:120213デフォルトの名無しさん
2005/11/23(水) 16:59:180214デフォルトの名無しさん
2005/11/29(火) 19:43:01printf("ぬるぽ");
nullpo();
}
0215デフォルトの名無しさん
2006/01/03(火) 00:24:21http://pc8.2ch.net/test/read.cgi/tech/1136124255/36
0216デフォルトの名無しさん
2006/01/06(金) 12:54:10http://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/
0217Mb
2006/03/14(火) 22:36:570218デフォルトの名無しさん
2006/03/15(水) 01:26:490219http://www.vector.co.jp/soft/win95/util/se072729.html
2006/03/18(土) 20:26:49もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
0220デフォルトの名無しさん
2006/03/20(月) 11:35:290221デフォルトの名無しさん
2006/03/20(月) 16:17:030222デフォルトの名無しさん
2006/03/24(金) 07:11:25と思ってぐぐってみたら、フリーソフトじゃんな。
作者に直接メール送れよなw
バイナリ単位での置換をするんじゃ64bit化も糞もないと思うんだがどうだろうか?
■ このスレッドは過去ログ倉庫に格納されています