再 帰
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/01/01(日) 23:04:15ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
!!!!!!!!!!
0003デフォルトの名無しさん
2006/01/01(日) 23:22:04何やってんだよ
0004デフォルトの名無しさん
2006/01/01(日) 23:24:184様ですか?
0005デフォルトの名無しさん
2006/01/01(日) 23:26:384様です。
0006デフォルトの名無しさん
2006/01/01(日) 23:31:154様でしたね。
0007デフォルトの名無しさん
2006/01/02(月) 01:49:43{
if(!n) puts("う"), return 1;
else if(n == 1) puts("わ"), return 1;
else puts("あ"), return fact(n - 1);
}
int main(void)
{
return fact(1000);
}
0008デフォルトの名無しさん
2006/01/02(月) 03:51:410009デフォルトの名無しさん
2006/01/02(月) 05:03:020010デフォルトの名無しさん
2006/01/02(月) 07:33:11これだと
[出力結果]
あ*999
わう
になってしまうような気がする俺ガイル。
俺はただの馬鹿野郎ですか?
0011デフォルトの名無しさん
2006/01/02(月) 08:58:41そもそも数字は出てこないし
足してもいないし掛けてもいない
0012デフォルトの名無しさん
2006/01/02(月) 09:02:12int fact(int n)
{
if(!n) puts("う"), return 1;
else if(n == 1) puts("わ"), return 1;
else fact(n - 1), puts("あ"), return 1;
}
int main(void)
{
return fact(1000);
}
0013デフォルトの名無しさん
2006/01/02(月) 09:03:30になってしまうな orz
0014デフォルトの名無しさん
2006/01/02(月) 09:05:150015デフォルトの名無しさん
2006/01/02(月) 09:09:14新たな初心者スレ?w
0016デフォルトの名無しさん
2006/01/02(月) 10:53:22あを999個書くの面倒で、あ*999としたんだろ。
int fact(int n)
{
if(!n) return 1;
else if(n == 1000) puts("う"), return 1;
else if(n == 999) puts("わ"), return 1;
else if(n == 9) puts("!"), return 1;
else if(n < 9) puts("!"), return 1;
else fact(n - 1), puts("あ"), return 1;
}
int main(void)
{
return fact(1000);
}
こうか?自動的にw改行されるとして、また、1000個ほどあると仮定して。
0017デフォルトの名無しさん
2006/01/02(月) 15:05:09これだと「う」しか表示されないワナ
0018デフォルトの名無しさん
2006/01/02(月) 15:10:08素直にこう書けばいいんだよ。
int fact(int n)
{
if(!n) puts("う");
else if(n == 1) puts("わ");
else puts("あ");
return fact(n - 1);
}
int main(void)
{
return fact(1000);
}
0019デフォルトの名無しさん
2006/01/02(月) 16:26:07{
if(!n) return 1;
else if(n == 1000) puts("う"), fact(n - 1);
else if(n == 999) puts("わ"), fact(n - 1);
else if(n == 9) puts("!"), fact(n - 1);
else if(n < 9) puts("!"), fact(n - 1);
else puts("あ"), fact(n - 1);
}
int main(void)
{
return fact(1000);
}
0020今年初プログラミング
2006/01/02(月) 16:44:56where
fact' 0 = 'う' : fact' 1
fact' 1 = 'わ' : fact' 2
fact' n = 'あ' : fact' (n+1)
main = putStrLn $ take 1000 fact
0021デフォルトの名無しさん
2006/01/02(月) 16:55:58{
if( !n ) return 1;
else if(n == 1000) puts("う");
else if(n == 999) puts("わ");
else if(n == 9) puts("!");
else if(n < 9) puts("!");
else puts("あ");
fact(n - 1);
}
int main(void)
{
return fact(1000);
}
0022デフォルトの名無しさん
2006/01/02(月) 16:58:15fact = 'う' : 'わ' : aaa
where
aaa = 'あ' : aaa
0023デフォルトの名無しさん
2006/01/02(月) 17:00:090024デフォルトの名無しさん
2006/01/02(月) 17:05:100025デフォルトの名無しさん
2006/01/02(月) 17:06:370026デフォルトの名無しさん
2006/01/02(月) 17:28:02where
fact' x y = x ++ fact' y ("ぁ" ++ x ++ y)
0027デフォルトの名無しさん
2006/01/02(月) 17:31:070028デフォルトの名無しさん
2006/01/02(月) 18:16:50(case x
(0 (write-string "うわ"))
(t (fact (1- x)) (write-char #¥あ))))
0029デフォルトの名無しさん
2006/01/02(月) 18:38:35厳密には再帰じゃないけど。
0030デフォルトの名無しさん
2006/01/02(月) 18:50:53現代のプログラミングの基本中の基本が出来ていない似非プログラマ。
0031デフォルトの名無しさん
2006/01/02(月) 19:07:26(defun fact (x)
(progn
(write-string "うわ")
(labels
((fact1 (y) (unless (zerop y) (write-char #¥あ) (fact1 (1- y)))))
(fact1 x))))
これで末尾呼び出しになってる?
0032デフォルトの名無しさん
2006/01/02(月) 20:26:36let rec f id ed vl =
if id >= ed
then vl
else match id with
0 -> f (id + 1) ed (vl ^ "う")
| 1 -> f (id + 1) ed (vl ^ "わ")
| n -> f (id + 1) ed (vl ^ "あ") in
f 0 len ""
let main =
print_endline (fact 1000)
0033デフォルトの名無しさん
2006/01/02(月) 22:23:330034デフォルトの名無しさん
2006/01/02(月) 22:39:55ttp://pc8.2ch.net/test/read.cgi/tech/1136124255/
0035デフォルトの名無しさん
2006/01/02(月) 22:56:570036デフォルトの名無しさん
2006/01/03(火) 00:23:24http://pc8.2ch.net/test/read.cgi/tech/1048088635/215
0037デフォルトの名無しさん
2006/01/04(水) 19:04:24if (n == 0) {
puts("!!");
return;
}
puts("A");
b(n-1);
}
void b(int n) {
if (n == 0) {
puts("?");
return;
}
puts("H");
b(n-1);
}
int main() {
a(100);
}
0038デフォルトの名無しさん
2006/01/09(月) 01:47:330039デフォルトの名無しさん
2006/01/09(月) 01:52:11それは、コンパイル時に設定する最大スタックサイズしだいじゃないかな??
0040デフォルトの名無しさん
2006/01/09(月) 01:53:440041デフォルトの名無しさん
2006/01/09(月) 01:56:190042デフォルトの名無しさん
2006/01/09(月) 08:00:02やはり再帰が原因のスタックオーバーフローでしょうか?
0043デフォルトの名無しさん
2006/01/09(月) 08:11:13スタック使いきってるなら暴走じゃなくて segv とかでプロセスがクラッシュ
するんじゃないか?
0044デフォルトの名無しさん
2006/01/09(月) 08:39:070045デフォルトの名無しさん
2006/01/09(月) 11:37:010046デフォルトの名無しさん
2006/01/09(月) 14:26:04末尾再帰に限定しないの?
ヒープとか使うの?
0047デフォルトの名無しさん
2006/01/10(火) 22:48:14くわしきゅ
0048デフォルトの名無しさん
2006/01/11(水) 08:48:49http://pc8.2ch.net/test/read.cgi/tech/1136124255/l50
0049デフォルトの名無しさん
2006/01/11(水) 10:49:31fact(N) :- N > 0,write(うわ),M is N * -1,fact(M).
fact(N) :- write(あ),M is N + 1,fact(M).
0050デフォルトの名無しさん
2006/01/11(水) 11:50:55それは再帰違う
0051デフォルトの名無しさん
2006/01/11(水) 13:07:39fact(0) :- !.
fact(N) :- integer(N),N > 0,write(うわ),M is N * -1,fact(M).
fact(N) :- integer(N),N < 0,write(あ),M is N + 1,fact(M).
が、好ましいコード。
0052デフォルトの名無しさん
2006/01/15(日) 12:08:19y=x
0053デフォルトの名無しさん
2006/01/15(日) 14:51:170054デフォルトの名無しさん
2006/01/21(土) 20:21:35再帰かよ。
0055デフォルトの名無しさん
2006/01/21(土) 20:53:220056デフォルトの名無しさん
2006/01/26(木) 00:45:040057デフォルトの名無しさん
2006/03/26(日) 17:30:15b (x) = x(a)
a (b)
0058デフォルトの名無しさん
2006/03/27(月) 22:44:22Cで書こうとしてちょっと悩んだ。
0059デフォルトの名無しさん
2006/05/14(日) 22:33:22G=(N,Σ,P,S)
N={S,A,B,C,D}
Σ={う,わ,あ,!,!}
P={
S→うA,
A→わB,
B→あB|C,
C→!D,
D→!D|ε
}
S=S
0060デフォルトの名無しさん
2006/07/23(日) 23:33:340061デフォルトの名無しさん
2006/07/28(金) 19:17:270063デフォルトの名無しさん
2006/09/23(土) 23:54:40http://uniuni.dfz.jp/moeclc2/?0&0K1lp3K5ok820coasKtUyTzXBYDK
2,クロワッサン
http://uniuni.dfz.jp/moeclc3/?0&97&0K1lp2K3K5lfwUxJzn5CYEJPYWO
3,legal
http://uniuni.dfz.jp/moeclc2/?0&0q01603o04C5HbJtq0yJAqaLEMJPP
4,めだまおやぎ
5,クルサード
6,ケルディン
7,ささらん
http://uniuni.dfz.jp/moeclc3/?2&97&0K1lp3K5KoJvUyUzTEK
8,Rviz
9,Tyranno
10,ANOTHER
http://uniuni.dfz.jp/moeclc2/?2&0F1ek2K3K5KsJtUyn5BSDUQ15
11,ムラディン
http://uniuni.dfz.jp/moeclc4/?3&97&0K1mg3K5p0tpkuUzKEoQPnIWbM
12,ミルカッセ
http://uniuni.dfz.jp/moeclc2/?2&1ek2K3I4F54a6r57KHTIJJKNI
13,ディアス
14,キュー
http://uniuni.dfz.jp/moeclc3/?2&97&1602K3I4F5C6K7KIUJJKJOKPY
15,Ligy
http://uniuni.dfz.jp/moeclc4/?0&97&0K1ie3K4bW5I8JkVvKzTEKNKXN
0064デフォルトの名無しさん
2006/10/31(火) 09:50:270065デフォルトの名無しさん
2006/11/02(木) 03:18:100066デフォルトの名無しさん
2006/11/04(土) 16:00:450067デフォルトの名無しさん
2006/11/04(土) 16:25:26でも、再帰させるときは迷う。
再帰しなくて済む方法がないか考える。
処理速度が下がりそうじゃない?
でも、個人的に再帰好き。巧く書けると気持ちいい。
0068デフォルトの名無しさん
2006/11/04(土) 22:44:14だから再帰を除去しない。
末尾再帰以外でそこがボトルネックだと形式的にスタックを使う形に置き換えるのはするけどな。
0069デフォルトの名無しさん
2007/01/08(月) 15:53:42大体イヤでも再帰になる
0070デフォルトの名無しさん
2007/04/30(月) 18:43:540071デフォルトの名無しさん
2007/04/30(月) 19:10:04データ構造のみスタックにして対処しています
0072デフォルトの名無しさん
2007/05/01(火) 06:43:19なぜ?
0073名無しさん@Vim%Chalice
2007/06/10(日) 21:38:51んでみんなに質問
再起でないとだめな場合ってどんな場合?
0074デフォルトの名無しさん
2007/06/10(日) 22:08:030075デフォルトの名無しさん
2007/06/10(日) 22:11:17コンポジットパターンの実装で、オブジェクトをトラバースするような処理では
スーパークラスのメソッドの再起になりやすいな
0076デフォルトの名無しさん
2007/06/10(日) 22:19:340077デフォルトの名無しさん
2007/06/11(月) 11:59:390078デフォルトの名無しさん
2007/06/11(月) 13:18:030079デフォルトの名無しさん
2007/06/11(月) 20:48:530080デフォルトの名無しさん
2007/06/11(月) 22:50:090081デフォルトの名無しさん
2007/06/11(月) 23:04:510082デフォルトの名無しさん
2007/06/11(月) 23:06:090083デフォルトの名無しさん
2007/06/12(火) 00:38:300084デフォルトの名無しさん
2007/06/12(火) 00:43:04class node {
node *left;
node *right;
public:
void execute() {
hogehoge...;
left->execute();
right->execute();
}
};
void foo(node *root) {
root->execute();
}
これが再帰ですよ。
0085デフォルトの名無しさん
2007/06/12(火) 20:24:30append([],X,X).
append([A|X],Y,[A|Z]) :- append(X,Y,Z).
Prologの有名なappend/3の定義ですが、
?- append([1,2],[a,b],X).
X=[1,2,a,b]
はともかく、
?- append(X,Y,[1,2,a,b]).
X=[],Y=[1,2,a,b];
X=[1],Y=[2,a,b];
X=[1,2],Y=[a,b];
X=[1,2,a],Y=[b];
X=[1,2,a,b],Y=[];
を再帰でなく書くことは
可能だけど面倒。
0086デフォルトの名無しさん
2007/06/13(水) 05:38:04Prologだと、どこかで再帰を使わないと
書けないのでは?
0087デフォルトの名無しさん
2007/06/13(水) 21:10:50一緒に仕事したくねー
0088デフォルトの名無しさん
2007/06/13(水) 21:30:510089デフォルトの名無しさん
2007/06/14(木) 18:39:51list_length/2 は
使って良いとして(これも再帰を使っているが)、
findall/3 の中でassert/1 retract/1 を
繰り返して何とかなりそうに思ったが
だめかな。
0090デフォルトの名無しさん
2007/06/14(木) 18:53:30生成の方は全然だめ。 ?- append(X,Y,[1,2,a,b]).
repeat/1 か for/3 それと list_nth/2 が欲しいですね。
どれも再帰述語だな。
0091デフォルトの名無しさん
2007/06/14(木) 20:49:050092デフォルトの名無しさん
2007/06/14(木) 23:57:420093デフォルトの名無しさん
2007/06/15(金) 13:09:020094デフォルトの名無しさん
2007/06/15(金) 13:11:20処理の繰り返しの中で使用する変数(コンテキスト)をスタックに置くのが再帰ですから
スタックを自力で用意するか、そのようなコンテキストがそもそも存在しないのなら
別にループでも構いませんよ。
0095デフォルトの名無しさん
2007/06/15(金) 14:03:520096デフォルトの名無しさん
2007/06/15(金) 21:00:01きたろうです
再帰しげるでs
0097デフォルトの名無しさん
2007/06/15(金) 23:00:270098名無しさん@Vim%Chalice
2007/06/16(土) 14:20:010099デフォルトの名無しさん
2007/06/16(土) 14:53:230100デフォルトの名無しさん
2007/06/16(土) 16:50:480101デフォルトの名無しさん
2007/06/16(土) 17:06:21あえて再帰を使ってそれが末尾再帰になってる可能性というのはどのくらいあるんだ?
0102デフォルトの名無しさん
2007/06/16(土) 17:22:00コール→リターン命令じゃなくジャンプ命令になるってだけ
可能性というよりはもっと作為的な物であって、プログラムを書く人間の
意図に依存してる
0103デフォルトの名無しさん
2007/06/16(土) 18:09:10C++のコンパイラには最適化をやってくれるのもが多いがJavaやC#はやらんみたいだ。
0104デフォルトの名無しさん
2007/06/16(土) 18:14:270105デフォルトの名無しさん
2007/06/16(土) 18:31:47元々再帰的な処理を、リソースの無駄遣い無くそのまま書き下せるんだから
末尾再帰にするのは意味あるよ。>>103 は単にループ以外使いたくない
だけでしょ。
0106デフォルトの名無しさん
2007/06/16(土) 19:12:10試してみたがC#とJavaの両方ともコンパイル時およびJIT(HotSpot, ngenなど)時に
末尾再帰の最適化はやってくれなかった。きっちりスタックオーバーフローが起きる。
>>105
ほしいと思ってるのが関数が末尾再帰であることを保障するキーワード。
末尾再帰の最適化がなされなかった場合にコンパイルエラーまたは実行時にAssertするような機能。
0107デフォルトの名無しさん
2007/06/16(土) 19:24:41Web で見た感じだと IBM の JVM は末尾再帰の最適化してるみたいね。
HotSpot は RFE が上がってて in progress になってた。
どちらも古い情報だったんで、現状どうなってるかは分からないけど。
0108デフォルトの名無しさん
2007/07/24(火) 00:52:22■ このスレッドは過去ログ倉庫に格納されています