再       帰        

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
うわああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
ああああああああああああああああああああああああああああああああああああ
!!!!!!!!!!
2最凶VB厨房:2006/01/01(日) 23:18:08
>>2
どうした?
3デフォルトの名無しさん:2006/01/01(日) 23:22:04
>>3
何やってんだよ
4デフォルトの名無しさん:2006/01/01(日) 23:24:18
>>4
4様ですか?
5デフォルトの名無しさん:2006/01/01(日) 23:26:38
>>4
4様です。
6デフォルトの名無しさん:2006/01/01(日) 23:31:15
>>6
4様でしたね。
7デフォルトの名無しさん:2006/01/02(月) 01:49:43
int fact(int n)
{
if(!n) puts("う"), return 1;
else if(n == 1) puts("わ"), return 1;
else puts("あ"), return fact(n - 1);
}
int main(void)
{
return fact(1000);
}
8デフォルトの名無しさん:2006/01/02(月) 03:51:41
まったくもって再帰にする必要がねえな
9デフォルトの名無しさん:2006/01/02(月) 05:03:02
末尾再帰という
10デフォルトの名無しさん:2006/01/02(月) 07:33:11
>>7
これだと

[出力結果]
あ*999
わう

になってしまうような気がする俺ガイル。
俺はただの馬鹿野郎ですか?
11デフォルトの名無しさん:2006/01/02(月) 08:58:41
>>10
そもそも数字は出てこないし
足してもいないし掛けてもいない
12デフォルトの名無しさん:2006/01/02(月) 09:02:12
ああ、こういうことか

int 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);
}
13デフォルトの名無しさん:2006/01/02(月) 09:03:30
わうあ*9999
になってしまうな orz
14デフォルトの名無しさん:2006/01/02(月) 09:05:15
「う」は出てこないんじゃないか?w
15デフォルトの名無しさん:2006/01/02(月) 09:09:14
ん?
新たな初心者スレ?w
16デフォルトの名無しさん:2006/01/02(月) 10:53:22
>>10-11
あを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個ほどあると仮定して。
17デフォルトの名無しさん:2006/01/02(月) 15:05:09
>>16
これだと「う」しか表示されないワナ
18デフォルトの名無しさん: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);
}
19デフォルトの名無しさん:2006/01/02(月) 16:26:07
int fact(int n)
{
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);
}
20今年初プログラミング:2006/01/02(月) 16:44:56
fact = fact' 0
  where
    fact' 0 = 'う' : fact' 1
    fact' 1 = 'わ' : fact' 2
    fact' n = 'あ' : fact' (n+1)

main = putStrLn $ take 1000 fact
21デフォルトの名無しさん:2006/01/02(月) 16:55:58
int fact(int n)
{
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);
}
22デフォルトの名無しさん:2006/01/02(月) 16:58:15
>>20
fact = 'う' : 'わ' : aaa
where
aaa = 'あ' : aaa
23デフォルトの名無しさん:2006/01/02(月) 17:00:09
何を盛り上がってるんだお前らw
24デフォルトの名無しさん:2006/01/02(月) 17:05:10
再帰不能
25デフォルトの名無しさん:2006/01/02(月) 17:06:37
2chのスレ立てって簡単ですねって見本
26デフォルトの名無しさん:2006/01/02(月) 17:28:02
fact = 'う':'わ':fact' [] "あ"
  where
    fact' x y = x ++ fact' y ("ぁ" ++ x ++ y)
27デフォルトの名無しさん:2006/01/02(月) 17:31:07
C初心者とHaskell初心者が入り乱れてるなw
28デフォルトの名無しさん:2006/01/02(月) 18:16:50
(defun fact (x)
  (case x
    (0 (write-string "うわ"))
    (t (fact (1- x)) (write-char #¥あ))))
29デフォルトの名無しさん:2006/01/02(月) 18:38:35
```s.わ`.うi``s.あi

厳密には再帰じゃないけど。
30デフォルトの名無しさん:2006/01/02(月) 18:50:53
再帰が難しいとか言ってる奴は、
現代のプログラミングの基本中の基本が出来ていない似非プログラマ。
31デフォルトの名無しさん: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))))

これで末尾呼び出しになってる?
32デフォルトの名無しさん:2006/01/02(月) 20:26:36
let fact len =
 let 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)
33デフォルトの名無しさん:2006/01/02(月) 22:23:33
次のお題をどうぞ
34デフォルトの名無しさん:2006/01/02(月) 22:39:55
>ALL このスレへ行け。
ttp://pc8.2ch.net/test/read.cgi/tech/1136124255/
35デフォルトの名無しさん:2006/01/02(月) 22:56:57
36デフォルトの名無しさん:2006/01/03(火) 00:23:24
37デフォルトの名無しさん:2006/01/04(水) 19:04:24
void a(int n) {
 if (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);
}
38デフォルトの名無しさん:2006/01/09(月) 01:47:33
再帰ってどのくらいまでスタックすることが出来るんでしょうか?
39デフォルトの名無しさん:2006/01/09(月) 01:52:11
>>38
それは、コンパイル時に設定する最大スタックサイズしだいじゃないかな??
40デフォルトの名無しさん:2006/01/09(月) 01:53:44
100%?
41デフォルトの名無しさん:2006/01/09(月) 01:56:19
UNIX だとプロセス起動時にスタックサイズ変えられるけど
42デフォルトの名無しさん:2006/01/09(月) 08:00:02
qsort使って要素数10000000くらいの配列でソートしたら時々暴走するんです。
やはり再帰が原因のスタックオーバーフローでしょうか?
43デフォルトの名無しさん:2006/01/09(月) 08:11:13
気になるんなら、スタックをどのくらい使ってるか見てみれば良いじゃん
スタック使いきってるなら暴走じゃなくて segv とかでプロセスがクラッシュ
するんじゃないか?
44デフォルトの名無しさん:2006/01/09(月) 08:39:07
再帰でスタック消費するの?だっせー言語プゲラ
45デフォルトの名無しさん:2006/01/09(月) 11:37:01
M$のqsortは再帰はつかってないな
46デフォルトの名無しさん:2006/01/09(月) 14:26:04
>>44
末尾再帰に限定しないの?
ヒープとか使うの?
47デフォルトの名無しさん:2006/01/10(火) 22:48:14
>>44
くわしきゅ
48デフォルトの名無しさん:2006/01/11(水) 08:48:49
49デフォルトの名無しさん:2006/01/11(水) 10:49:31
fact(0) :- !.
fact(N) :- N > 0,write(うわ),M is N * -1,fact(M).
fact(N) :- write(あ),M is N + 1,fact(M).
50デフォルトの名無しさん:2006/01/11(水) 11:50:55
>36
それは再帰違う
51デフォルトの名無しさん:2006/01/11(水) 13:07:39
>>49
fact(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).

が、好ましいコード。
52デフォルトの名無しさん:2006/01/15(日) 12:08:19
x=y
y=x
53デフォルトの名無しさん:2006/01/15(日) 14:51:17
それは再帰違う
54デフォルトの名無しさん:2006/01/21(土) 20:21:35
>>54
再帰かよ。
55デフォルトの名無しさん:2006/01/21(土) 20:53:22
56デフォルトの名無しさん:2006/01/26(木) 00:45:04
>>54がスタックあふれを起こしましたよ
57デフォルトの名無しさん:2006/03/26(日) 17:30:15
a (x) = x(b)
b (x) = x(a)
a (b)
58デフォルトの名無しさん:2006/03/27(月) 22:44:22
>>57
Cで書こうとしてちょっと悩んだ。
59デフォルトの名無しさん:2006/05/14(日) 22:33:22
L(G):
G=(N,Σ,P,S)
N={S,A,B,C,D}
Σ={う,わ,あ,!,!}
P={
 S→うA,
 A→わB,
 B→あB|C,
 C→!D,
 D→!D|ε
}
S=S
60デフォルトの名無しさん:2006/07/23(日) 23:33:34
おもすれ
61デフォルトの名無しさん:2006/07/28(金) 19:17:27
tst
62 ◆YY8ebcAR4s :2006/09/17(日) 21:35:57
tst tst
63デフォルトの名無しさん:2006/09/23(土) 23:54:40
64デフォルトの名無しさん:2006/10/31(火) 09:50:27
a
65デフォルトの名無しさん:2006/11/02(木) 03:18:10
GNU's Not UNIX.
66デフォルトの名無しさん:2006/11/04(土) 16:00:45
そして再び最下層から1へ帰る
67デフォルトの名無しさん:2006/11/04(土) 16:25:26
おもしろそーなスレ発見。

でも、再帰させるときは迷う。
再帰しなくて済む方法がないか考える。

処理速度が下がりそうじゃない?

でも、個人的に再帰好き。巧く書けると気持ちいい。
68デフォルトの名無しさん:2006/11/04(土) 22:44:14
俺は末尾再帰を信じるぜ。
だから再帰を除去しない。

末尾再帰以外でそこがボトルネックだと形式的にスタックを使う形に置き換えるのはするけどな。
69デフォルトの名無しさん:2007/01/08(月) 15:53:42
コンポジットパターンを実装すると
大体イヤでも再帰になる
70デフォルトの名無しさん:2007/04/30(月) 18:43:54
再起age
71デフォルトの名無しさん:2007/04/30(月) 19:10:04
プログラムの再帰は必ずループに置き換えて
データ構造のみスタックにして対処しています
72デフォルトの名無しさん:2007/05/01(火) 06:43:19
>>71
なぜ?
73名無しさん@Vim%Chalice:2007/06/10(日) 21:38:51
再起なんて無いに越したことないだろ。
んでみんなに質問
再起でないとだめな場合ってどんな場合?
74デフォルトの名無しさん:2007/06/10(日) 22:08:03
つーか逆になんでそんなに再起を危険視するのが意味わからん
75デフォルトの名無しさん:2007/06/10(日) 22:11:17
>>73
コンポジットパターンの実装で、オブジェクトをトラバースするような処理では
スーパークラスのメソッドの再起になりやすいな
76デフォルトの名無しさん:2007/06/10(日) 22:19:34
バベルの塔
77デフォルトの名無しさん:2007/06/11(月) 11:59:39
ハノイじゃないか?つーか再起してどーする
78デフォルトの名無しさん:2007/06/11(月) 13:18:03
バベルの塔は死なん。何度でも蘇るのじゃ。
79デフォルトの名無しさん:2007/06/11(月) 20:48:53
つーかOOPL使えよいい加減
80デフォルトの名無しさん:2007/06/11(月) 22:50:09
かんけーねーだろ。バカか?
81デフォルトの名無しさん:2007/06/11(月) 23:04:51
うんこー
82デフォルトの名無しさん:2007/06/11(月) 23:06:09
未だに構造化設計乙
83デフォルトの名無しさん:2007/06/12(火) 00:38:30
OOだと再帰ができないと思っている人がいるみたいですね
84デフォルトの名無しさん:2007/06/12(火) 00:43:04
あ、おばかさんのためにちょっと例をだしてあげます。

class node {
 node *left;
 node *right;
public:
 void execute() {
  hogehoge...;
  left->execute();
  right->execute();
 }
};

void foo(node *root) {
 root->execute();
}

これが再帰ですよ。
85デフォルトの名無しさん:2007/06/12(火) 20:24:30
>>73
append([],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=[];
を再帰でなく書くことは
可能だけど面倒。
86デフォルトの名無しさん:2007/06/13(水) 05:38:04
>>85
Prologだと、どこかで再帰を使わないと
書けないのでは?
87デフォルトの名無しさん:2007/06/13(水) 21:10:50
再帰を毛嫌いするような奴とは
一緒に仕事したくねー
88デフォルトの名無しさん:2007/06/13(水) 21:30:51
木リストとかどうすんのよ
89デフォルトの名無しさん:2007/06/14(木) 18:39:51
>>86
list_length/2 は
使って良いとして(これも再帰を使っているが)、
findall/3 の中でassert/1 retract/1 を
繰り返して何とかなりそうに思ったが
だめかな。
90デフォルトの名無しさん:2007/06/14(木) 18:53:30
>>89 は結合の方でした。 ?- append([1,2],[a,b],X).
生成の方は全然だめ。 ?- append(X,Y,[1,2,a,b]).
repeat/1 か for/3 それと list_nth/2 が欲しいですね。
どれも再帰述語だな。
91デフォルトの名無しさん:2007/06/14(木) 20:49:05
再帰って、再帰を使わない等価な書き方が、必ずあるんじゃないの?
92デフォルトの名無しさん:2007/06/14(木) 23:57:42
おまえならできる
93デフォルトの名無しさん:2007/06/15(金) 13:09:02
 
94デフォルトの名無しさん:2007/06/15(金) 13:11:20
>>91
処理の繰り返しの中で使用する変数(コンテキスト)をスタックに置くのが再帰ですから
スタックを自力で用意するか、そのようなコンテキストがそもそも存在しないのなら
別にループでも構いませんよ。
95デフォルトの名無しさん:2007/06/15(金) 14:03:52
再帰を使わないとループを書けない言語では別だがな。
96デフォルトの名無しさん:2007/06/15(金) 21:00:01
シティーボーイズの大竹まことです

きたろうです


再帰しげるでs
97デフォルトの名無しさん:2007/06/15(金) 23:00:27
再帰キタ━━━━(゚∀゚)━━━━━ッ!!!
98名無しさん@Vim%Chalice:2007/06/16(土) 14:20:01
馬鹿PGほど無理やり再帰みたいなん使いたがる
99デフォルトの名無しさん:2007/06/16(土) 14:53:23
まともな大人は他人を馬鹿って言わない
100デフォルトの名無しさん:2007/06/16(土) 16:50:48
何このレッテルの貼り合い
101デフォルトの名無しさん:2007/06/16(土) 17:06:21
末尾再帰の最適化というのがあるのだが、
あえて再帰を使ってそれが末尾再帰になってる可能性というのはどのくらいあるんだ?
102デフォルトの名無しさん:2007/06/16(土) 17:22:00
勝手に最適化されるわけじゃなくて、末尾再帰になるように書いた時に
コール→リターン命令じゃなくジャンプ命令になるってだけ
可能性というよりはもっと作為的な物であって、プログラムを書く人間の
意図に依存してる
103デフォルトの名無しさん:2007/06/16(土) 18:09:10
意識して末尾再帰にするくらいならはじめから再帰なんて使わんよ。
C++のコンパイラには最適化をやってくれるのもが多いがJavaやC#はやらんみたいだ。
104デフォルトの名無しさん:2007/06/16(土) 18:14:27
Java は HotSpot の機能でなかったっけ?
105デフォルトの名無しさん:2007/06/16(土) 18:31:47
>>103
元々再帰的な処理を、リソースの無駄遣い無くそのまま書き下せるんだから
末尾再帰にするのは意味あるよ。>>103 は単にループ以外使いたくない
だけでしょ。
106デフォルトの名無しさん:2007/06/16(土) 19:12:10
>>104
試してみたがC#とJavaの両方ともコンパイル時およびJIT(HotSpot, ngenなど)時に
末尾再帰の最適化はやってくれなかった。きっちりスタックオーバーフローが起きる。

>>105
ほしいと思ってるのが関数が末尾再帰であることを保障するキーワード。
末尾再帰の最適化がなされなかった場合にコンパイルエラーまたは実行時にAssertするような機能。
107デフォルトの名無しさん:2007/06/16(土) 19:24:41
>>106
Web で見た感じだと IBM の JVM は末尾再帰の最適化してるみたいね。
HotSpot は RFE が上がってて in progress になってた。

どちらも古い情報だったんで、現状どうなってるかは分からないけど。
108デフォルトの名無しさん
また地獄に再帰する・・・・