なあ、再帰関数好きな人いる? パート2 [転載禁止]©5ch.io
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2015/09/06(日) 17:35:49.88ID:8kAWPtv+http://ews2.cc.niigata-u.ac.jp/~takeuchi/tbasic/BackGround/Recursive.html
★再帰を使わない例
この階乗関数を Basic プログラムとして実現してみると,
(Tiny Basic には階乗関数 Factorial が内蔵されていますから,
実際にこのようなプログラムを書く必要はありませんが。)
Function Kaijyou(n)
If n = 0 then
Kaijyou = 1
Else
Kaijyou = Kaijyou(n-1)*n
End if
End Function
となります。しかし,実は階乗関数は,再帰を使わなくても,
次のように実現することが出来ます。
Function Kaijyou(n)
F = 1
For i = 1 to n
F = F * i
Next i
Kaijyou = F
End Function
↑再帰を使わなくても,次のように実現することが出来ます。
0002デフォルトの名無しさん
2015/09/06(日) 17:36:17.93ID:8kAWPtv+http://akita-nct.jp/saka/lecturenote/2010/2e/text/recursive.pdf
2 再帰関数とは
2.1 再帰関数の例
自分自身を呼び出す関数を再帰関数 (recursive function) という.また,自分自身を呼び
出すことを再帰呼出し (recursive call) という.言葉の定義はともかく,具体的な例を見て
みよう.
2.2 なぜ,再帰関数なのか?
再帰関数と繰り返し文のどちらを使ってもプログラムが書ける場合,どちらを使うべき
だろうか? 両方使える場合は繰り替えし文を使うべきである.計算速度も早いし,メモリ
の消費も少ないからである.
0003デフォルトの名無しさん
2015/09/06(日) 17:43:43.89ID:aWMMHCvXでもまぁ一応乙と言っておくか
0004デフォルトの名無しさん
2015/09/06(日) 17:44:52.56ID:8kAWPtv+あいつが目につくスレで、
さらにずっと目につく>>1に
この内容を見せつけるのが目的ですからw
0005デフォルトの名無しさん
2015/09/06(日) 17:44:52.67ID:1q8+1kZD0006デフォルトの名無しさん
2015/09/06(日) 17:52:38.85ID:8kAWPtv+レスしていいんだぞ。
お前w
0007デフォルトの名無しさん
2015/09/06(日) 17:55:08.01ID:COxCJFRo0008デフォルトの名無しさん
2015/09/06(日) 17:56:56.08ID:uhlPSgY9>>1 の方が馬鹿なのか?
0009NAS6 ◆n3AmnVhjwc
2015/09/06(日) 17:59:11.55ID:miXQ60Mg別に痛くも痒くもなんともないが
ttp://peace.2ch.net/test/read.cgi/tech/1439109993/979
0010デフォルトの名無しさん
2015/09/06(日) 17:59:20.08ID:8kAWPtv+俺は某大学のページを見つけてきただけだ。
0011デフォルトの名無しさん
2015/09/06(日) 18:02:24.93ID:aWMMHCvXチルダ入ってるけど
0012デフォルトの名無しさん
2015/09/06(日) 18:03:42.37ID:8kAWPtv+0013デフォルトの名無しさん
2015/09/06(日) 18:09:08.28ID:8kAWPtv+馬鹿のオレオレ定義と
どっちが信頼できるかって話だ。
もちろん信頼できるのは馬鹿よりも>>1のリンク先を
書いた人に決まっているだろう。
その信頼できる人が「再帰を使った例」に対して
「再帰を使わない例」をこのように書いているわけだ。
0014NAS6 ◆n3AmnVhjwc
2015/09/06(日) 18:16:43.96ID:miXQ60Mgお前バカだろ
>>1
の同じリンクの中に
>>1
の引用と
>>9
の引用があるんだが
わかんねえやつだなーーー
0015デフォルトの名無しさん
2015/09/06(日) 18:18:21.82ID:8kAWPtv+何がいいたいのかさっぱりわからない。
俺は、第三者(書いた本人)以外の
間違った解釈が含まれないように
忠実にコピペしただけだ。
0016デフォルトの名無しさん
2015/09/06(日) 18:20:41.78ID:1eGH5HCM糞言語か糞本の業者が
糞宣伝張るの忘れたの?
0017NAS6 ◆n3AmnVhjwc
2015/09/06(日) 18:23:39.56ID:miXQ60Mg「再帰を使わない例」をこのように書いているわけだ。
で、それを踏まえての
>>9
の引用に続くんだろ
それで、得々と
「再帰を使った例」に対して「再帰を使わない例」
を挙げられて、俺が何が困ると思うの?
0018デフォルトの名無しさん
2015/09/06(日) 18:26:27.73ID:8kAWPtv+http://peace.2ch.net/test/read.cgi/tech/1439109993/719
719 名前:NAS6 ◆n3AmnVhjwc [] 投稿日:2015/09/05(土) 12:25:42.76 ID:zGjt7Ia9 [22/59]
int sum = 0;
for(int i = 1; i <= 10; i++) {
sum = sum + i;
}
な、これは再帰だろ、頭が悪いんだから、教授に迷惑をかけるなよ
0019デフォルトの名無しさん
2015/09/06(日) 18:26:37.13ID:aWMMHCvXそもそもこれはBASIC普及サイトだろうよ
このホームページは, Tiny Basic を中心としたプログラミング言語 Basicのページです。しかし,プログラム言語は「言語」です。言語はあることを表現する手段です。表現する内容を持たなければ,そもそもの存在意義がありません。
Basic を勉強しようと思う動機は人によって様々だと思います。
コンピュータをより効率的に使いたい,計算をしたい,データ処理をしたい,ゲームを作りたい,ともかく遊んでみたい, ・・・
どのような動機でも構いませんが,プログラミング言語自身の研究者でなければ,言語を使って何かをしたいという動機を持っているはずです。
何を目的とするのかを見定め,目的とする内容について勉強することが必要でしょう。それからプログラミングに取り組んで下さい。そうでなければ,プログラミングを勉強を始めても,すぐに飽きてしまいますし,実際のところ余り身につきません。
Tiny Basic の Sample や このホームページにある「Basic 入門」の中に出てくるプログラムの中にはその背景や内容を知らないと,プログラム自身の意味もわからないものもあるかと思います。
このページでは,そのようなことのについての説明を多少ですが纏めてみたいと思います。
私自身のメモ書きの寄せ集めのようなものですが,順次増やして行こうと思います。何かの参考になれば幸いです。
大学や新潟の記述は見つからず。
プログラムに対する理解度も高くないように思う
まぁもう消えるからつついてもしょうがないが
0020デフォルトの名無しさん
2015/09/06(日) 18:28:22.06ID:8kAWPtv+再帰だと主張するNAS6とは反対に、
再帰を使わない例とかいてある>>1のコードに
似ているわけだ。(+の代わりに*になっているだけ)
> となります。しかし,実は階乗関数は,再帰を使わなくても,
> 次のように実現することが出来ます。
>
> Function Kaijyou(n)
> F = 1
> For i = 1 to n
> F = F * i
> Next i
> Kaijyou = F
> End Function
0021デフォルトの名無しさん
2015/09/06(日) 18:29:15.25ID:8kAWPtv+何いってんのお前?
誰が書いたかわからずに批判するのはやめとけ
恥ずかしいからさw
0022デフォルトの名無しさん
2015/09/06(日) 18:31:59.21ID:aWMMHCvX0023NAS6 ◆n3AmnVhjwc
2015/09/06(日) 18:33:39.15ID:miXQ60Mghttp://peace.2ch.net/test/read.cgi/tech/1439109993/719
http://peace.2ch.net/test/read.cgi/tech/1439109993/870
http://peace.2ch.net/test/read.cgi/tech/1439109993/860
http://peace.2ch.net/test/read.cgi/tech/1439109993/931
http://peace.2ch.net/test/read.cgi/tech/1439109993/933
http://peace.2ch.net/test/read.cgi/tech/1439109993/979
0024デフォルトの名無しさん
2015/09/06(日) 18:34:55.94ID:8kAWPtv+でもまあ、>>2にちょっとだけ書いてあるっしょ?
再帰を使った場合と「再帰を使わない」つまりループを使った場合で
どちらを使うべきか。
両方使える場合には、再帰を使うべきじゃない。
0025デフォルトの名無しさん
2015/09/06(日) 18:35:40.96ID:8kAWPtv+素人のお前がいくら言った所で、
>>1のリンク先の先生が書いたことのほうが
何万倍も信用度が高い。
0026デフォルトの名無しさん
2015/09/06(日) 18:36:53.88ID:aWMMHCvXおまえはお前で再帰を使わない例があるとかなり致命的だろうよ
なにしろ
sum = sum + 1
sum = sum + 2
これだけで再帰なんだから
普通の人は再帰と言わんから致命的でもなんでもない。
0027デフォルトの名無しさん
2015/09/06(日) 18:37:49.60ID:aWMMHCvXじゃあ頑張ってな
0028デフォルトの名無しさん
2015/09/06(日) 18:38:28.51ID:8kAWPtv+うむ。
再帰を使わない例と明確に言って
このコードを書いているからな。
明らかにこれは再帰ではないのだ。
> となります。しかし,実は階乗関数は,再帰を使わなくても,
> 次のように実現することが出来ます。
>
> Function Kaijyou(n)
> F = 1
> For i = 1 to n
> F = F * i
> Next i
> Kaijyou = F
> End Function
0029NAS6 ◆n3AmnVhjwc
2015/09/06(日) 18:38:45.11ID:miXQ60Mgだから俺は、それはその通りだと思うし、で、だからどうしたの?
前スレで
再帰関数書式は定義に忠実な書き方で
ループ書式は最適化された書き方で
ってずっと書いてるけど?
0030デフォルトの名無しさん
2015/09/06(日) 18:41:03.57ID:8kAWPtv+まとめw まとめw
719 名前:NAS6 ◆n3AmnVhjwc [] 投稿日:2015/09/05(土) 12:25:42.76 ID:zGjt7Ia9 [22/59]
int sum = 0;
for(int i = 1; i <= 10; i++) {
sum = sum + i;
}
な、これは再帰だろ、頭が悪いんだから、教授に迷惑をかけるなよ
↓
偉い先生
> となります。しかし,実は階乗関数は,再帰を使わなくても,
> 次のように実現することが出来ます。
>
> Function Kaijyou(n)
> F = 1
> For i = 1 to n
> F = F * i
> Next i
> Kaijyou = F
> End Function
0031デフォルトの名無しさん
2015/09/06(日) 18:41:49.75ID:aWMMHCvXおちょくると言う発想もまた不快感を覚えるが
0032デフォルトの名無しさん
2015/09/06(日) 18:42:24.38ID:uhlPSgY90033デフォルトの名無しさん
2015/09/06(日) 18:43:10.98ID:8kAWPtv+えっと、何が悪いの?
お前BASIC作れるの?
0034NAS6 ◆n3AmnVhjwc
2015/09/06(日) 18:50:09.99ID:miXQ60Mg俺は、3DCGレンダリングライブラリを
VisualStudio標準ライブラリから自力で作れるよ
0035デフォルトの名無しさん
2015/09/06(日) 18:52:09.34ID:CPTXWrAhそれ>>1のリンク先の人より
凄くないからw
0036NAS6 ◆n3AmnVhjwc
2015/09/06(日) 18:56:32.19ID:miXQ60Mg0037デフォルトの名無しさん
2015/09/06(日) 19:00:35.87ID:1q8+1kZDおい、NASがゲームプログラマーだと?
怖くてプレイ出来ないからやめてくれ
0038NAS6 ◆n3AmnVhjwc
2015/09/06(日) 19:02:42.24ID:miXQ60Mg3Dライブラリを使った3Dエンドプログラムじゃなくて
VisualStudio標準ライブラリから3Dエンジンを作ったんだよ
0039デフォルトの名無しさん
2015/09/06(日) 19:06:49.22ID:1q8+1kZDクォータニオンを理解していれば誰でも作れるんだが
ロボットアームの操作は出来ないだろうがな
0040デフォルトの名無しさん
2015/09/06(日) 19:11:03.76ID:CPTXWrAh> おい、NASがゲームプログラマーだと?
安心しろ。それはないw
0041デフォルトの名無しさん
2015/09/06(日) 19:11:51.49ID:1q8+1kZDワロタ
0042NAS6 ◆n3AmnVhjwc
2015/09/06(日) 19:14:14.02ID:miXQ60Mg3DライブラリはXNAなり.NETなりの
ドット描画だけしか使ってないよ
XNAなり.NETなりのドット描画だけ利用して
三角形塗りつぶしやら陰面消去やらライティングやら全部計算
0043デフォルトの名無しさん
2015/09/06(日) 19:15:53.04ID:1q8+1kZD自己評価がどれだけ高くても、それと人がそれを認めてくれるかどうかとは全く無関係なのだ
悔しかったらノーベル賞でも取ってみろ
0044デフォルトの名無しさん
2015/09/06(日) 19:16:17.46ID:CPTXWrAhで、参考にした本は?
そのサンプルソースを
移植しただけだろう?
0045片山博文MZ ◆T6xkBnTXz7B0
2015/09/06(日) 19:16:40.24ID:0zNPIayW関係者の皆様は御協力をお願い申し上げます。
0046NAS6 ◆n3AmnVhjwc
2015/09/06(日) 19:20:49.01ID:miXQ60Mg二次篩法より使えるよ
素数ってエラストテネスの篩とか考えると
2×3=6でふるって
7以上の素数って6で割った余りは1、5が素数の必要条件で
2×3×5=30でふるって
31以上の素数って30で割った余りは1、7、11、13、17、19、23、29が素数の必要条件
6の場合、はじけないのは2/6、30の場合、はじけないのは8/30、
になるから、その素数単純判定法がめちゃくちゃ計算量が少ないんじゃないかなぁ・・・
はじけない確率P、ガウスの素数確率G
G=1/ln6=0.55811
P=2/6=0.3333333
G=1/ln30=0.2940141
P=8/30=0.266666667
で、素数かもしれない判定は
if((X mod 6)==(1 or 5))
if((X mod 30)==(1 or 7 or 11 or 13 or 17 or 19 or 23 or 29))
こんな感じでできる
これでふるわれたら合成数確定
エラストテネスの篩のようなはじきかたです
0047デフォルトの名無しさん
2015/09/06(日) 19:21:26.17ID:2wudt5S9再起にしようが、For(do / while)ループにしようが
ちゃんと動けばどっちでも良いよ。
枯れた技術で議論するほどないですから。
只、なぜ再起関数で実装することを選んだのか、
逆に再起関数で実装したほうが良いケースがあるのに
Forループで実装したのかという理由というか方針みたいなものを
しっかり持ってほしい。
気分でこっちとか、こっちが嫌だからコレとかは勘弁してほしい。
他人のソースを読むと、方針(癖ともいう)がしっかりしている人
ほど、書き方が安定していて、結果的には読みやすいコードになる
んですよね。
0048デフォルトの名無しさん
2015/09/06(日) 19:22:21.22ID:1q8+1kZD都合が悪くなると話題を逸らす癖なおそうね
0049NAS6 ◆n3AmnVhjwc
2015/09/06(日) 19:25:43.74ID:miXQ60Mgボーンデジタル
Eric Lengyel
狩野智英
ゲームプログラミングのための3Dグラフィックス数学
0050デフォルトの名無しさん
2015/09/06(日) 19:31:38.86ID:CPTXWrAh本見て、それを写しただけなのに
できるよ自慢。
0051NAS6 ◆n3AmnVhjwc
2015/09/06(日) 19:35:08.19ID:miXQ60Mgを借りてきて、中身見てみろ
理論説明書であってサンプルコードなんぞない
0052NAS6 ◆n3AmnVhjwc
2015/09/06(日) 19:39:48.94ID:miXQ60Mgのzipにソースがあるからソースを見れば
丸写しのサンプルコードなんてないのが分かるだろう
0053デフォルトの名無しさん
2015/09/06(日) 19:40:18.53ID:1q8+1kZD0054NAS6 ◆n3AmnVhjwc
2015/09/06(日) 19:46:43.62ID:CQ0buOj1>>23
0055NAS6 ◆n3AmnVhjwc
2015/09/06(日) 19:50:29.69ID:CQ0buOj10056デフォルトの名無しさん
2015/09/06(日) 19:51:04.84ID:HtOLHH16http://www-formal.stanford.edu/jmc/recursive.pdf
In general (we shall discuss an exception), the routine for a recursive function
uses itself as a subroutine.
0057デフォルトの名無しさん
2015/09/06(日) 19:52:59.61ID:JSf18249読めねえよ何語だよこれ
0058NAS6 ◆n3AmnVhjwc
2015/09/06(日) 19:55:55.22ID:miXQ60Mgだから別に異議はないよ
0059NAS6 ◆n3AmnVhjwc
2015/09/06(日) 19:58:14.66ID:miXQ60Mgについては
俺はNO
0060デフォルトの名無しさん
2015/09/06(日) 19:59:07.85ID:JSf18249それは誰も否定しないと思うの心。
0061デフォルトの名無しさん
2015/09/06(日) 20:01:47.59ID:JSf18249再帰は僕らの周りにいっぱいあるんだよ!!
0062NAS6 ◆n3AmnVhjwc
2015/09/06(日) 20:03:48.46ID:miXQ60Mgこれが再帰的ではないっつうから
int sum = 0;
for(int i = 1; i <= 10; i++) {
sum = sum + i;
}
0063NAS6 ◆n3AmnVhjwc
2015/09/06(日) 20:07:21.15ID:miXQ60Mgfor(int i = 1; i <= 10; i++) {
sum = sum + i;
}
左辺がn+1項までの和でそれを右辺がn項までの和を使って
再定義しているから、再帰的
0064デフォルトの名無しさん
2015/09/06(日) 20:08:32.12ID:JSf18249文脈があるんだよね。
再帰関数で行う処理を再帰処理と言ってる文脈では、
それは再帰処理ではないよね。
一口に再帰と言ってもいろいろあるんすよ。
0065NAS6 ◆n3AmnVhjwc
2015/09/06(日) 20:12:56.71ID:CQ0buOj1再帰関数のみが再帰的
については
俺はNO
0066デフォルトの名無しさん
2015/09/06(日) 20:15:19.80ID:JSf18249それはわかったよw
再帰関数で行う処理を再帰処理と言う人がいたと
仮定するとその人の言う再帰処理とナスシックスの言う再帰処理が
違うものであるっていうのはわかるっしょ。
それがわかってれば十分かと。
たとえば女の子に君を食べたいと言ったら
それはとても恐ろしいカニバリストととも取れるし
とてもいやらしいことをしているエロスジェントルメンかもしれないわけっしょ。
食べるという言葉一つとっても文脈に応じて概念が変わるもんなんよ。
一方の論理が成立すればもう一方が論理的に間違いだというものではないのよね。
この語句はこうも解釈できて、この解釈に基づくならこういう論理も成り立つよねって
話っすね。
0067デフォルトの名無しさん
2015/09/06(日) 20:16:39.91ID:n7lw0XxHfor文
func(v)
{
for(i; i < size(v); i++) {
do_something(v[i])
}
return;
}
再帰
func(v)
{
if (size(v) == 0) { return; }
do_something(head(v))
return func(tail(v));
}
のどっちがいいかについて話し合えよ。
俺は再帰のほうが好き。
0068NAS6 ◆n3AmnVhjwc
2015/09/06(日) 20:24:07.13ID:CQ0buOj1正しくはこうだ
for文
func(v)
{
for(i; i < size(v); i++) {
do_something(v[i]);
}
return;
}
再帰
func(v)
{
if(size(v) == 0) { return; }
do_push_something(head(v));
func(tail(v));
do_pop_something();
return;
}
0069NAS6 ◆n3AmnVhjwc
2015/09/06(日) 20:44:13.39ID:miXQ60Mgfor文
func(v)
{
for(i; i < size(v); i++) {
do_something(v[i]);
}
return;
}
再帰
next(v);//再帰の次の順番のノードを返す
func(v)
{
if(size(v) == 0) { return; }
do_something_push(v);
v = next(v);
func(v);
do_something_pop(v);
return;
}
0070NAS6 ◆n3AmnVhjwc
2015/09/06(日) 20:48:07.01ID:miXQ60Mgが
ただのi++
だとしたら・・・
んー、だから、なんで、
再帰の利点をことごとく消したコードで
どっちが好きって聞くのかなぁ
0071デフォルトの名無しさん
2015/09/06(日) 20:50:15.72ID:n7lw0XxHtailはcdr
0072デフォルトの名無しさん
2015/09/06(日) 20:54:08.38ID:n7lw0XxHheadは1つめのアドレス、tailは2つめのアドレスを指す
0073NAS6 ◆n3AmnVhjwc
2015/09/06(日) 20:56:22.14ID:miXQ60Mg再帰のvは木構造
0074デフォルトの名無しさん
2015/09/06(日) 20:58:05.08ID:oxuCnkg+for文で書けるならfor文で書く
0075NAS6 ◆n3AmnVhjwc
2015/09/06(日) 20:58:44.37ID:miXQ60Mgpush&pop処理ができるのと
木構造を扱えることなんだけど
それを全部消したらforが良いに決まってんじゃん
0076デフォルトの名無しさん
2015/09/06(日) 21:02:00.73ID:CPTXWrAhpush,popはできるけどなw
スタックさえあればいい。
ループ+スタックで処理するのが速い。
0077デフォルトの名無しさん
2015/09/06(日) 21:04:54.02ID:HtOLHH16他の奴らはスレタイに従って、このスレでは「再帰」を再帰的関数と言う意味で使い、
再帰的処理は「再帰的処理」と書いている。
0078NAS6 ◆n3AmnVhjwc
2015/09/06(日) 21:05:48.26ID:CQ0buOj1木構造はfor文で扱いづらいだろ
0079NAS6 ◆n3AmnVhjwc
2015/09/06(日) 21:07:43.50ID:CQ0buOj1再帰関数の利点
0080NAS6 ◆n3AmnVhjwc
2015/09/06(日) 21:10:06.11ID:CQ0buOj1ディレクトリサーチをfor文で書きたくない
0081NAS6 ◆n3AmnVhjwc
2015/09/06(日) 21:22:43.43ID:miXQ60Mgをどうしてもやるなら
searchInit(初期化)と
searchEnd(終了判定)と
searchNext(次のノード検索)を
ラッピングして作るんならwhileで書ける
searchDir(){
...
searchInit();
...//最初のノードの処理
while(searchEnd()){
...
searchNext();
...//次のノードの処理
}
...
}
0082NAS6 ◆n3AmnVhjwc
2015/09/06(日) 21:25:54.39ID:miXQ60Mg>>80
をどうしてもやるなら
searchInit(初期化)と
searchEnd(終了判定)と
searchNext(次のノード検索)を
ラッピングして作るんならwhileで書ける
searchDir(){
...
searchInit();
...//最初のノードの処理
while(!searchEnd()){
...
searchNext();
...//次のノードの処理
}
...
}
0083NAS6 ◆n3AmnVhjwc
2015/09/06(日) 21:28:49.37ID:miXQ60MgsearchNext()は再帰関数になる
0084NAS6 ◆n3AmnVhjwc
2015/09/06(日) 21:29:25.88ID:miXQ60MgsearchNext()は再帰関数を使う
0085NAS6 ◆n3AmnVhjwc
2015/09/06(日) 21:44:47.37ID:miXQ60Mgtemplate<typename T> NAS6_Utl::NAS6_cntn_ptr
template<typename T> NAS6_Utl::NAS6_tree_clct
は、テンプレートベースのコンテナポインタとツリーコレクションです
メモリリークは現在のメイン.cpp上にはありません
0086NAS6 ◆n3AmnVhjwc
2015/09/06(日) 22:01:15.10ID:miXQ60Mg>>82
のようにラッピングしたためノード探索が↓の書式のように簡単に書けます
ttp://nas6.main.jp/NAS6_tree_clct.h
//再帰構文例1
template<typename T>
void recHoge1(NAS6_tree_clct<T>* root, string fk) {
bool parent = false;
if (&root->recursiveInit() == nullptr) return;
NAS6_tree_clct<T>* crnt = root;
//crnt = root; の時のcrntに適用の処理
//or : //if (crnt->conformkey(crnt, fk) != string::npos) //{...} //キー検索の時
while (!crnt->recursiveIsEnd(root)) {
parent = false;
crnt = &(crnt->recursiveNext(root), parent);
//or : //crnt = &(crnt->recursiveKeyNext(root, fk, parent));
//if(!parent) //{...} //crnt = Next; の時のcrntに適用の処理
//else //{...} //親に戻った時の処理
}
}
0087NAS6 ◆n3AmnVhjwc
2015/09/06(日) 22:07:29.52ID:miXQ60Mg0088デフォルトの名無しさん
2015/09/06(日) 22:15:17.13ID:JSf18249どういうとき使うん?
0089NAS6 ◆n3AmnVhjwc
2015/09/06(日) 23:35:13.33ID:miXQ60Mgコンテナポインタ
任意のクラスのスマートポインタ&コンテナ
ツリーコレクション
任意のクラスを木構造で管理
0090NAS6 ◆n3AmnVhjwc
2015/09/06(日) 23:48:47.99ID:miXQ60Mg解説サイト
template<typename T> NAS6_Utl::NAS6_cntn_ptr
template<typename T> NAS6_Utl::NAS6_tree_clct
は、テンプレートベースのコンテナポインタとツリーコレクションです
コンテナポインタは、任意のクラスのスマートポインタとコンテナの機能があります
ツリーコレクションは、任意のクラスを木構造で管理するときに用います
メモリリークは現在のメイン.cpp上にはありません
使用例
メイン.cpp
ttp://nas6.main.jp/sptr.cpp
0091片山博文MZ ◆T6xkBnTXz7B0
2015/09/06(日) 23:51:25.17ID:0zNPIayWclass tree {
...
protected:
shared_ptr<T_BASE> m_parent;
std::vector<shared_ptr<T_BASE>> m_children;
};
0092片山博文MZ ◆T6xkBnTXz7B0
2015/09/06(日) 23:53:22.84ID:0zNPIayWclass tree {
typedef ... self_type;
...
protected:
shared_ptr<self_type> m_parent;
std::vector<shared_ptr<self_type>> m_children;
};
0093NAS6 ◆n3AmnVhjwc
2015/09/06(日) 23:53:25.36ID:miXQ60Mg_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
メモリリークゼロ
void main() {
int *p = new int;
#ifdef _MSC_VER
って書くと、int分4バイトだけリーク
0094片山博文MZ ◆T6xkBnTXz7B0
2015/09/06(日) 23:59:51.61ID:0zNPIayW0095デフォルトの名無しさん
2015/09/07(月) 00:48:01.44ID:9G8ikCm4それほど複雑でない処理で手っ取り早く片付ける時は使うけど、用意周到にコード書けるときは絶対使わない。怖い。
0096デフォルトの名無しさん
2015/09/07(月) 01:22:27.71ID:kPPvOKmq認めたようだな。
int sum = 0;
for(int i = 1; i <= 10; i++) {
sum = sum + i;
}
馬鹿が理解するのは
こんなにも時間がかかると。
ま、偉い先生がこう言ってるのだから、反論の余地はないかw
> となります。しかし,実は階乗関数は,再帰を使わなくても,
> 次のように実現することが出来ます。
>
> Function Kaijyou(n)
> F = 1
> For i = 1 to n
> F = F * i
> Next i
> Kaijyou = F
> End Function
0097デフォルトの名無しさん
2015/09/07(月) 03:10:41.77ID:y/EkzV5ZNAS6は当初と言ってることがかなり変わってるぞ
0098デフォルトの名無しさん
2015/09/07(月) 06:51:26.87ID:07GvV3Oa/#\_/#\ / ̄  ̄\
| ### (#) ### | / ヽ
/ヽ##ノ \.#ノ、 / |
/ │ | , -===-、|
| -===-、| │ / ヽ
│ / ヽ ヽ/ | |
ヽ/ │| |_| |_|
|_| |_| (.__.) |_.)
(.__) -◎ |_ ) │ -● |
| | | | | |
⊂二⊃⊂二⊃ ⊂二 ⊃⊂二⊃
0099NAS6 ◆n3AmnVhjwc
2015/09/07(月) 07:30:46.76ID:z69KZ2wJ別に俺にとって、再帰処理について、このスレで新たな知見なんてないし、変わるはずがないよ
0100NAS6 ◆n3AmnVhjwc
2015/09/07(月) 07:39:15.86ID:z69KZ2wJ何が怖いの?next()が書けない?
for文
func(v)
{
for(i; i < size(v); i++) {
do_something(v[i]);
}
return;
}
再帰関数
next(v);//再帰の次の順番のノードを返す
func(v)
{
if(size(v) == 0) { return; }
do_something_push(v);
v = next(v);
func(v);
do_something_pop(v);
return;
}
0101NAS6 ◆n3AmnVhjwc
2015/09/07(月) 07:52:34.61ID:z69KZ2wJ認めたようだな。
int sum = 0;
for(int i = 1; i <= 10; i++) {
sum = sum + i;
}
認めるも何も間違った知見に、すり寄る気なんてさらさらありません
0102NAS6 ◆n3AmnVhjwc
2015/09/07(月) 07:58:38.43ID:z69KZ2wJfor(int i = 1; i <= 10; i++) {
sum = sum + i;
}
これは再帰関数ではもちろんないけど
再帰処理というのがあやふやならば
少なくとも再帰的アルゴリズム
その理由は
左辺はn+1項までの和
それを右辺のn項までの和を使って再定義しているから
0103デフォルトの名無しさん
2015/09/07(月) 08:13:10.69ID:y/EkzV5Z俺は
0104デフォルトの名無しさん
2015/09/07(月) 08:15:32.27ID:y/EkzV5Z関数が定義される以前のアセンブラやニーモニック的な状態であたかも関数や再帰があるような物言いをしてたでしょ
注意されて注意されてやっと再帰と再帰処理を区別しつつあるようだけど
0105デフォルトの名無しさん
2015/09/07(月) 08:21:54.67ID:y/EkzV5Zsum = sum
これsumの「定義」じゃないですから。
数学とは違います。代入と言います。上書きです。
0106デフォルトの名無しさん
2015/09/07(月) 09:57:21.60ID:H/A72o7Yんじゃ、これは? scheme
(let loop ((sum 0)
(i 1))
(if (<= i 10)
(loop (+ sum i)
(+ i 1))
sum))
0107デフォルトの名無しさん
2015/09/07(月) 11:16:26.65ID:kPPvOKmqschemeはしらんけど、ここを読む限り、
https://www.shido.info/lisp/scheme7.html
> 7. 繰り返し
> 2. 再帰
> 再帰関数とは関数定義の中で自分自身を呼び出す関数です。
> 4. 名前つき let
> ループを表すのに名前つき let という構文が使えます。
> 名前つき let は Scheme で繰り返しを表す標準的な方法です。
これに該当するんじゃね?
0108デフォルトの名無しさん
2015/09/07(月) 11:45:28.48ID:62mgHfQ4他人にもそれを押し付けようとするから困った存在だよな
迷惑以外の何物でもない
0109デフォルトの名無しさん
2015/09/07(月) 12:09:37.70ID:ksoqvTq6一番の問題は、NASは自分の頭の中で処理したことと、書き表したコードが区別できていないこと。
自分の脳内で一緒だとみなしたものが、外界でも同じものであると妄信している。
ある処理Xは再帰処理でできる(脳内で解釈)、ということと、
ある処理Xを再帰的に実現する(実際にコードを書く)、ということの区別ができないので、
処理Xを非再帰的に書くことも再帰処理だとみなしている。
だからsumを求める処理は再帰的にも非再帰的にも実現できるが、NASの脳内で2つのアルゴリズムは「やりたいことは同じ」という一点で同一視されているので、
非再帰的に書いたコードも再帰だと言ってしまう。
再帰的に実現「できる」ことが根拠ならば、解析解sum(n) = (int)(n * (1 + n) * 0.5)も再帰処理になるけど、
多分脳内ですぐに同一だと解釈できないから再帰じゃないと言うんじゃないかな。
皆がそれは再帰ではない、といくら言っても通じないのはここにある。
あと発作的に自作の木構造のトラバースを書いたコードをコピペしまくって再帰だ、と言っちゃうのも、
「木構造は再帰的に表せる」「木構造に対する処理は再帰的に書ける」という事実から、
「俺の関数は木構造に対する処理だから再帰」という理屈を出しているのも、脳内と外界の区別がついてないということで説明がつく。
こういう人を一言で表す言葉を知っているが、差別的な表現なので控えておく。
0110NAS6 ◆n3AmnVhjwc
2015/09/07(月) 13:16:13.43ID:z69KZ2wJ変数の代入は、変数の再定義だろ
再定義って言葉が気に入らないなら
つうか単語をいちいち突っ込む基地外に付き合ってやるけど
*1
左辺はn+1項までの和
右辺のn項までの和を使って、左辺に代入しているから
再帰的とは
あるものが定義されている場合,
その定義の中に,更にその定義されるべきものが,簡単化されて,含まれているとき,
それは「再帰的である」と言われます。
循環論法に似ていますが,少し違います。
再帰的はその部分に含まれるものが全く同じものではなくて,
簡単になったもので,最終的終了条件が明示されているものです。
に従って、*1は再帰的アルゴリズムである
0111NAS6 ◆n3AmnVhjwc
2015/09/07(月) 13:32:36.36ID:z69KZ2wJその定義の中に,更にその定義されるべきものが,簡単化されて,含まれているとき,
それは「再帰的である」と言われます。
int sum = 0;
for(int i = 1; i <= 10; i++) {
sum = sum + i;
}
左辺のsum(n+1項)に、右辺のsum(n項)として、簡単化されて含まれているから
再帰的である
0112NAS6 ◆n3AmnVhjwc
2015/09/07(月) 13:41:36.65ID:z69KZ2wJ最適化してループで書いたら
その処理は再帰処理じゃなくなるとか
意味が分かりませぬなぁ
0113NAS6 ◆n3AmnVhjwc
2015/09/07(月) 13:45:32.18ID:z69KZ2wJ再帰関数で書かれた再帰的アルゴリズムを
最適化してループで書いたら
その処理は再帰的アルゴリズムじゃなくなるとか
意味が分かりませぬなぁ
0114NAS6 ◆n3AmnVhjwc
2015/09/07(月) 13:52:33.44ID:z69KZ2wJの和訳が
再帰処理、再帰的アルゴリズム
同じっちゃあ同じだけど、
処理の方が実装寄りで
アルゴリズムは理論寄りかな
0115NAS6 ◆n3AmnVhjwc
2015/09/07(月) 14:03:41.19ID:z6iBy9wS>NASの脳内で2つのアルゴリズムは「やりたいことは同じ」という一点で
>同一視されているので、
*1
sumを求める処理は非再帰的に実現できない
再帰的とは
あるものが定義されている場合,
その定義の中に,更にその定義されるべきものが,簡単化されて,含まれているとき,
それは「再帰的である」と言われます。
*1の理由は
sumが定義されていて
そのsumに、より簡単なsumを含まないで
sumは実現できないから
0116NAS6 ◆n3AmnVhjwc
2015/09/07(月) 14:13:54.73ID:z6iBy9wS他人にもそれを押し付けようとするから困った存在だよな
迷惑以外の何物でもない
sumを求める処理は非再帰的に実現できない
理由
sumが定義されていて
そのsumに、より簡単なsumを含まないで
sumは実現できないから
0117デフォルトの名無しさん
2015/09/07(月) 14:20:48.03ID:79mVKqba0118NAS6 ◆n3AmnVhjwc
2015/09/07(月) 14:35:10.70ID:z6iBy9wS###########################
sumを求める処理は非再帰的に実現できない
理由
sumが定義されていて
そのsumに、より簡単なsumを含まないで
sumは実現できないから
###########################
非再帰的に作るんなら
sum=sum+i;
右辺にsumは使っちゃダメ
sumが定義されていて
そのsumに、より簡単なsumを含まないで
sumを実現することが非再帰的だから
0119NAS6 ◆n3AmnVhjwc
2015/09/07(月) 14:37:30.27ID:z6iBy9wS0120NAS6 ◆n3AmnVhjwc
2015/09/07(月) 14:55:19.37ID:z6iBy9wSabs = base + offset
座標なら
ディスプレイ = パース * カメラ * グローバル * ローカル
の回転処理
base + offsetで、アセンブラが動いているからね
こういう感じの構造だと
base = base + a
こういうのが頻出する
ポインタなんて、もうそのまんま
0121デフォルトの名無しさん
2015/09/07(月) 14:56:59.86ID:79mVKqbaお前が間違ってんだよ
>>119
キチガイに親切にされてもこっちが迷惑なんだって
0122NAS6 ◆n3AmnVhjwc
2015/09/07(月) 15:06:07.99ID:arnw7zUzこれのどこが?
再帰的とは
あるものが定義されている場合,
その定義の中に,更にその定義されるべきものが,簡単化されて,含まれているとき,
それは「再帰的である」と言われます。
循環論法に似ていますが,少し違います。
再帰的はその部分に含まれるものが全く同じものではなくて,
簡単になったもので,最終的終了条件が明示されているものです。
sumを求める処理は非再帰的に実現できない
理由
sumが定義されていて
そのsumに、より簡単なsumを含まないで
sumは実現できないから
0123デフォルトの名無しさん
2015/09/07(月) 15:08:14.34ID:79mVKqbaいろいろおかしい
昨日から見てるけどお前狂ってるわ
0124デフォルトの名無しさん
2015/09/07(月) 15:12:32.30ID:79mVKqbaなぜなら狂ってる奴にとってはそれが正しいのだから絶対に受け入れない
どんな屁理屈を使ってもはねつける
だから嫌われんだよ
0125NAS6 ◆n3AmnVhjwc
2015/09/07(月) 15:23:05.26ID:z69KZ2wJこの時
f(n+1) = g(f(n))
このようにf()が定義されたらf()は再帰(帰納)的
再帰的とは
あるものが定義されている場合,
その定義の中に,更にその定義されるべきものが,簡単化されて,含まれているとき,
それは「再帰的である」と言われます。
循環論法に似ていますが,少し違います。
再帰的はその部分に含まれるものが全く同じものではなくて,
簡単になったもので,最終的終了条件が明示されているものです。
0126NAS6 ◆n3AmnVhjwc
2015/09/07(月) 15:24:06.23ID:z69KZ2wJ自己紹介乙
0127デフォルトの名無しさん
2015/09/07(月) 15:28:47.77ID:79mVKqbaああその言葉言っちゃったね
「自己紹介乙」というのは投影性同一視を日頃から使う人間しか口にしない
要するにNASは自分の事が本当は嫌いなんだよ
でもそれは受け入れないから他人にかけつる
犯罪犯すなよ、危ないぞお前
0128デフォルトの名無しさん
2015/09/07(月) 15:31:59.16ID:ksoqvTq6int sum = (int)(10 * (1 + 10) * 0.5));
できるから。最適化したら再帰しなくて済むから。
あと何度も繰り返すが、再定義と再帰的定義は全く別物。
C/C++で再帰的定義が許されるのはデータ型と関数の定義のときだけで、右辺値にundefinedな値を持ってくることができない。
値の再帰的定義ってのは、haskellなどの非正格の言語じゃないとできない。
四則演算+関数定義だけの言語でいいから処理系を作ってみるといい。あんたの定義するところの再帰が如何に無意味か分かるから。
0129NAS6 ◆n3AmnVhjwc
2015/09/07(月) 15:36:13.42ID:z69KZ2wJ大辞林 第三版の解説
さいきてき【再帰的】
�@自己の行為の結果が自己に戻ってくること。フィードバック。
�A(数学などで)定義の中に定義されるものが含まれていること。
sum = sum + i;
これは�@にも�Aにも該当する
0130デフォルトの名無しさん
2015/09/07(月) 15:40:44.85ID:79mVKqbaあまりにも図星だから完全に無視するしかないわけだ
0131デフォルトの名無しさん
2015/09/07(月) 15:43:58.32ID:79mVKqba議論の場で「自己紹介乙」という言葉が禁物なのは
その言葉を使った時点で「俺は負けを認めます」と言ってるのと同義だからだ
NASは既に負けてんだよ
クソ弱いなお前
0132NAS6 ◆n3AmnVhjwc
2015/09/07(月) 15:46:47.55ID:z6iBy9wSうん、確かにこれは非再帰だね
>C/C++で再帰的定義が許されるのはデータ型と関数の定義のときだけで、右辺値にundefinedな値を持ってくることができない。
>右辺値にundefinedな値を持ってくることができない
初項が決まらないと帰納法は開始できないからね
>データ型
?プリミティブ型のこと?
任意のクラスで、再帰的定義ができるよ、やり方次第
0133NAS6 ◆n3AmnVhjwc
2015/09/07(月) 15:52:38.66ID:arnw7zUzあはは、数学も情報処理もできなくて
日本語もほんの少ししから分からないからムキになってるwww
0134デフォルトの名無しさん
2015/09/07(月) 15:54:13.94ID:kPPvOKmq0135NAS6 ◆n3AmnVhjwc
2015/09/07(月) 16:10:37.84ID:z6iBy9wS>C/C++で再帰的定義が許されるのはデータ型と関数の定義のときだけで、右辺値にundefinedな値を持ってくることができない。
>データ型
?プリミティブ型のこと?
ん?普通に任意のクラスで、再帰的定義ができるだろ
データ型が任意のクラスってことなら、再帰的定義に何の不都合があるの?
0136NAS6 ◆n3AmnVhjwc
2015/09/07(月) 16:15:30.24ID:z6iBy9wS0137デフォルトの名無しさん
2015/09/07(月) 16:18:13.76ID:H/A72o7Yところが、named letは先の例だと、loopという名を持つ再帰関数を定義して、呼び出しているんだ。
0138NAS6 ◆n3AmnVhjwc
2015/09/07(月) 16:27:05.14ID:z6iBy9wS初項が決まらないと帰納法は開始できないからね
当たり前かと思ったけど丁寧に書くと
g():ある変換関数、n:ある項
そして、n = 0, f(n = 0)、つまり初項が決定された時
f(n + 1) = g(f(n))
このようにf()が定義されたらf()は再帰(帰納)的
再帰的とは
あるものが定義されている場合,
その定義の中に,更にその定義されるべきものが,簡単化されて,含まれているとき,
それは「再帰的である」と言われます。
循環論法に似ていますが,少し違います。
再帰的はその部分に含まれるものが全く同じものではなくて,
簡単になったもので,最終的終了条件が明示されているものです。
0139NAS6 ◆n3AmnVhjwc
2015/09/07(月) 16:46:15.11ID:z69KZ2wJ>(let loop ((sum 0)
>(i 1))
>(if (<= i 10)
>(loop (+ sum i)
>(+ i 1))
>sum))
c++で等価に書いたら
void loop(int& sum, int& i){
if(i <= 10) loop(sum + i, i + 1);
}
void main(){
int s = 0,i = 1;
loop(s, i);
}
だろ
0140デフォルトの名無しさん
2015/09/07(月) 16:48:54.74ID:kPPvOKmq> ところが、named letは先の例だと、loopという名を持つ再帰関数を定義して、呼び出しているんだ。
あんたがどう思うが関係なく、
リンク先には再帰ではないと書いてある事実が重要
0141NAS6 ◆n3AmnVhjwc
2015/09/07(月) 16:49:20.19ID:z69KZ2wJvoid loop(int& sum, int& i){
sum = sum + i;
i = i + 1;
if(i <= 10) loop(sum, i);
}
void main(){
int s = 0,i = 1;
loop(s, i);
}
0142デフォルトの名無しさん
2015/09/07(月) 16:50:45.70ID:kPPvOKmq再帰をループに置き方たら再帰じゃない。
同じ問題を、再帰を使ったやり方と
再帰を使わないやり方で解くことができる。
等価であっても、再帰ではなく、
再帰を使わずにループで、等価な処理が出来るだけ。
再帰は単に自分の関数自身を呼び出すかどうかで決まる。
0143NAS6 ◆n3AmnVhjwc
2015/09/07(月) 17:07:40.99ID:z69KZ2wJあ、これも再帰だ
右辺の中にsumの簡単な項が含まれてた
n項公差d
sum=a1+a2+...+an=(n(2a1+d(n-1)))/2
だから、どうしたって
等差数列の和は、数列の簡単な項が含まれる
0144NAS6 ◆n3AmnVhjwc
2015/09/07(月) 17:15:39.39ID:z6iBy9wSさいきてき【再帰的】
�@自己の行為の結果が自己に戻ってくること。フィードバック。
�A(数学などで)定義の中に定義されるものが含まれていること。
の【再帰(的)】処理って俺は使ってる
0145NAS6 ◆n3AmnVhjwc
2015/09/07(月) 17:22:57.90ID:z6iBy9wS0146デフォルトの名無しさん
2015/09/07(月) 17:48:07.49ID:H/A72o7Yそのリンク先にどのように書かれていようと、規格書には再帰を記述出来ると書いてある事が重要。
0147NAS6 ◆n3AmnVhjwc
2015/09/07(月) 17:49:27.37ID:z6iBy9wS再帰理論
で、これは要するに、
基数記号から
数X、C進数、n桁目数xn
X=C^n(xn)...C^2(x2)+C^1(x1)+C^0(x0)
そもそも、数Xって循環論法で成立されていて、
そんな数の計算って何か意味がある?
いやいや循環論法ではないから計算可能なんだ
で、再帰論法で有意味、循環論法で無意味
どっちなんだって話
気付かぬうちに循環論法に取り込まれたりするから怖い
0148NAS6 ◆n3AmnVhjwc
2015/09/07(月) 18:00:25.16ID:z69KZ2wJB=C
C=D
D=E
E=A
↑はどんなものでも当てはまるから無意味な循環論法
A=B
B=C
C=D
D=E
E=X
↑は計算可能な有意味な再帰論法
こういうのホント困るんだよね
0149デフォルトの名無しさん
2015/09/07(月) 18:02:51.15ID:Ia3Xgdv6数列の総和なのかある三角形の面積なのかで同じ計算でも定義のされ方は違う
極端な話数列の総和であったとしても、より短い数列の総和が、同じ(もしくはより簡単な)問題だと考える必然性はない
0150NAS6 ◆n3AmnVhjwc
2015/09/07(月) 18:06:08.89ID:z69KZ2wJ「迷惑の発明」はこうなってる
0151NAS6 ◆n3AmnVhjwc
2015/09/07(月) 18:11:20.47ID:z6iBy9wS>>148
>>150
こういう問題があるから
よくよく検証しないと無意味になる
0152デフォルトの名無しさん
2015/09/07(月) 20:14:00.01ID:wAvgtGye俺は急に忙しくなって書き込みできなくなり、さっき帰宅したところなんだが
お前本当に無職なんだな
>>133
>あはは、数学も情報処理もできなくて
>日本語もほんの少ししから分からないからムキになってるwww
工学部卒でSEなんですけど何か?
日本語がズレてて無職のNASよりずっとマシだと思うよ?
0153デフォルトの名無しさん
2015/09/07(月) 20:20:47.57ID:ksoqvTq6sumの一般解も再帰だと言うなら、何も説明できていないことに気付きなさい。
そんな何にでも当てはまる概念は、再帰でないものと区別できるような、際立たせる性質を持っていないことに気付きなさい。
例えて言うなら7という数字を、1+1+1+1+1+1+1としか捉えることができないから、
8という数字も同様に1+1+1+1+1+1+1+1となので似たものだと言うことしか言えない状態なのに気付きなさい。
奇数であること、素数であること、その他色々の面白い性質について論じることができない。
情報処理を学んでないとかそんな次元じゃない。
今まで1度も、人と議論し、切磋琢磨し、学ぶことをしたことがないように見える。
0154NAS6 ◆n3AmnVhjwc
2015/09/07(月) 20:30:13.12ID:z69KZ2wJint sum = 0, i = 1;
while(true){
if(10 < i) i = 1;
sum = sum + i;
}
例えば、
D社から買ってA社はB社に売る
A社から買ってB社はC社に売る
B社から買ってC社はD社に売る
C社から買ってD社はA社に売る
と、個々の会社は俺は違うと思っていても
循環取引のサイクルの中に
知らずに取り込まれている場合がある
こういう、「迷惑の発明」
0155NAS6 ◆n3AmnVhjwc
2015/09/07(月) 20:44:12.92ID:z69KZ2wJint sum = 0, i = 1;
while(true){
if(10 < i) i = 1;
sum = sum + i;
i++;
}
個々は俺は違うと思っていても
循環取引のサイクルの中に
知らずに取り込まれている場合がある
手を広げていくと、こういう、「迷惑の発明」になっていくんだよ
0156NAS6 ◆n3AmnVhjwc
2015/09/07(月) 20:52:52.94ID:z69KZ2wJ工学部卒で元ゲームプログラマの現ウェブデザイナで
週2日午前中勤務で、やってるよ
0157デフォルトの名無しさん
2015/09/07(月) 20:53:58.74ID:y/EkzV5Z代入は定義じゃなくて処理だが
左辺値にとって右辺が何であるかは問わない。
また代入はその経歴を保持しない
sumはsumです。 →日本語、トートロジー。右のsumで左のsumを定義。
sum = sum →数学。sumはsumと等価である。右のsumで左のsumを定義。
sum = sum; → プログラム。左辺のsumは右辺のsumと論理性を持った繋がりを保持しない。定義ではない。当然再定義でもない。
あと都合の言い部分だけ答えてどや顔されてもね
0158デフォルトの名無しさん
2015/09/07(月) 20:58:02.47ID:VPF4nk5c基地外過ぎ
0159NAS6 ◆n3AmnVhjwc
2015/09/07(月) 21:04:50.57ID:z69KZ2wJ最近は、注意しないと、GCのオブジェクト参照だらけになってるよ
0160デフォルトの名無しさん
2015/09/07(月) 21:06:16.79ID:wAvgtGye嘘もたいがいにしとこうねNAS君
宗教板に出入りしてる時点でお里が知れますよ
それからボキャブラリーが貧困なのはあんたの方だね
日本人じゃないでしょ?チョンか?
0161デフォルトの名無しさん
2015/09/07(月) 21:06:17.22ID:y/EkzV5Z0162NAS6 ◆n3AmnVhjwc
2015/09/07(月) 21:15:29.65ID:z6iBy9wSまず
MOV AX, BX
この意味がちゃんと分かってる?
0163デフォルトの名無しさん
2015/09/07(月) 21:18:05.02ID:y/EkzV5Z0164NAS6 ◆n3AmnVhjwc
2015/09/07(月) 21:21:23.34ID:z69KZ2wJに嘘は全くないし
代入ってコピーだし
何か?
0165デフォルトの名無しさん
2015/09/07(月) 21:22:11.75ID:y/EkzV5Z0166デフォルトの名無しさん
2015/09/07(月) 21:22:18.08ID:wAvgtGye世の中舐めとんのか?
0167NAS6 ◆n3AmnVhjwc
2015/09/07(月) 21:25:15.54ID:z69KZ2wJオブジェクト参照にしないと、まるっきり使えない=になるよ
0168デフォルトの名無しさん
2015/09/07(月) 21:27:28.64ID:y/EkzV5Z0169デフォルトの名無しさん
2015/09/07(月) 21:28:03.03ID:OUNoKE7cオブジェクト指向と再帰って相性いいと思うんだよね。
ツリーの各ノードに振る舞いを丸投げできるっしょ。どう思う?
0170デフォルトの名無しさん
2015/09/07(月) 21:31:46.55ID:y/EkzV5Z等価と同一、
似てると等価、
全部違う
日頃はこんなのどうでもいいんだが
0171NAS6 ◆n3AmnVhjwc
2015/09/07(月) 21:35:25.59ID:z69KZ2wJint& oprator=(const int& rh){;}
だから、これは
>sum = sum; → プログラム。左辺のsumは右辺のsumと論理性を持った繋がりを保持しない。定義ではない。当然再定義でもない。
Cだとしてもミスリードだろ
0172デフォルトの名無しさん
2015/09/07(月) 21:35:32.82ID:y/EkzV5Z再帰と等価のループはあっても、
再帰と同一のループはない
例えあったとしても、元々そうゆう話はしてなかった
0173デフォルトの名無しさん
2015/09/07(月) 21:38:26.50ID:y/EkzV5Zそれはズレてるね
左のsumが右のsumに影響を与えない
0174デフォルトの名無しさん
2015/09/07(月) 21:40:36.72ID:wAvgtGye0175デフォルトの名無しさん
2015/09/07(月) 21:45:27.76ID:y/EkzV5Z0176NAS6 ◆n3AmnVhjwc
2015/09/07(月) 21:54:05.13ID:z69KZ2wJ別に都合が悪くはないよ
それで俺は一応生活できてるよ
0177デフォルトの名無しさん
2015/09/07(月) 21:55:31.44ID:wAvgtGye要するに半ニート状態か
0178NAS6 ◆n3AmnVhjwc
2015/09/07(月) 21:56:42.35ID:z69KZ2wJA←B
こんな感じだろ
0179NAS6 ◆n3AmnVhjwc
2015/09/07(月) 21:59:21.65ID:z69KZ2wJ0180デフォルトの名無しさん
2015/09/07(月) 21:59:30.34ID:y/EkzV5Zそこは返信しなくていいから
>>178 意味の分からんことをカタコトで書くのやめれ
0181デフォルトの名無しさん
2015/09/07(月) 22:01:16.36ID:y/EkzV5Zお前の書き込みは「だから○○」です。と言う流れが一切ない
0182デフォルトの名無しさん
2015/09/07(月) 22:05:50.36ID:wAvgtGyeNASは嘘つきだもん
0183NAS6 ◆n3AmnVhjwc
2015/09/07(月) 22:07:18.74ID:z6iBy9wSこういうの再帰的なもののオンパレードなんだけど
分かんなければ分からんだろうね
0184デフォルトの名無しさん
2015/09/07(月) 22:07:48.81ID:y/EkzV5Zどうでもいいだろうけど。俺もどうでもいいんだが
0185デフォルトの名無しさん
2015/09/07(月) 22:10:31.87ID:y/EkzV5Zわかんねぇな。
いやいろいろあるんだが全部書けん
0186デフォルトの名無しさん
2015/09/07(月) 22:12:08.97ID:y/EkzV5Zこれにする
0187NAS6 ◆n3AmnVhjwc
2015/09/07(月) 22:12:14.09ID:z69KZ2wJで、なにかって
演算子の優先順位に従って、後方解決の再帰的処理で解いてくのが、式
0188デフォルトの名無しさん
2015/09/07(月) 22:14:39.03ID:QIs6nwEn0189186
2015/09/07(月) 22:16:52.42ID:QIs6nwEn0190NAS6 ◆n3AmnVhjwc
2015/09/07(月) 22:40:26.71ID:z69KZ2wJ0階から()を探す
で、1階の()の処理
(2.0+3.0),(5.0-6.0/7.0)
1階の()内の*/の処理
6.0/7.0
1階の()内の+-の処理
(2.0+3.0),(5.0-0.857)
0階に戻ってきて*/の処理
4.0*4.142
0階に戻ってきて+-の処理
5.0-16.571
答え
-11.571
で、Aに代入
0191デフォルトの名無しさん
2015/09/07(月) 22:46:19.40ID:QIs6nwEn返信した気でいるなら返信になってねぇからな
やり直し
0192NAS6 ◆n3AmnVhjwc
2015/09/07(月) 22:53:34.11ID:z69KZ2wJ循環論法
main(){return main();}
か
再帰論法
main(){return 0;}
か
ってこんなに分かりやすくはない話だけど
要するに、迷惑の発明を争う
0193デフォルトの名無しさん
2015/09/07(月) 22:55:35.05ID:QIs6nwEn今は関係ないね。
これ以上のヒントは出さんよ。
やり直し
0194デフォルトの名無しさん
2015/09/07(月) 22:59:18.37ID:jq4VsIqNそれってただの逆ポーランド記法の処理じゃね?
確かに再帰下降パーサみたいのは再帰と言えるだろうが、
C++みたいな言語にしただけで純粋な再帰だけでは処理しきれなくなってるからな
自分で言葉の意味を再定義して悦に入っててもただの自己満であって
他人は理解できねーからな
少なくとも情報処理用語の定義を使え
それが出来ないのならただの雑音だ
チラシの裏にでも落書きしてろ
0195NAS6 ◆n3AmnVhjwc
2015/09/07(月) 23:02:21.08ID:z69KZ2wJD社から買ってA社はB社に売る
A社から買ってB社はC社に売る
B社から買ってC社はD社に売る
C社から買ってD社はA社に売る
と、個々の会社は俺は違うと思っていても
循環取引のサイクルの中に
知らずに取り込まれている場合がある
こういう、「迷惑の発明」
A=B
B=C
C=D
D=A
俺は違うって言っても取り込まれて
んー、どうしたもんかねえ?
0196デフォルトの名無しさん
2015/09/07(月) 23:07:43.58ID:QIs6nwEn「○○の話をしていて、」
「自分の文章」
「だから○○は△△です」
の形式で書いとけ
それと、あたかも自分の定義が正しいみたいなニュアンスで書いてるけど、
前スレからここまでただの一人も同意者は現れてねぇからな
自信満々で書いてるようだけども
0197NAS6 ◆n3AmnVhjwc
2015/09/07(月) 23:16:11.48ID:z6iBy9wS実際は、階段の高さの変化はなかったよってオチ
0198NAS6 ◆n3AmnVhjwc
2015/09/07(月) 23:21:08.24ID:z69KZ2wJ0199デフォルトの名無しさん
2015/09/07(月) 23:24:44.67ID:jq4VsIqNその意味不明な言葉遣いをまずやめてもらえませんかね
0200NAS6 ◆n3AmnVhjwc
2015/09/07(月) 23:40:29.73ID:z69KZ2wJこういう問題が大問題
D社から買ってA社はB社に売る
A社から買ってB社はC社に売る
B社から買ってC社はD社に売る
C社から買ってD社はA社に売る
と、個々の会社は俺は違うと思っていても
循環取引のサイクルの中に
知らずに取り込まれている場合がある
こういう、「迷惑の発明」
0201デフォルトの名無しさん
2015/09/07(月) 23:43:45.05ID:jq4VsIqNますます分からなくなりました
もしかして自分でも分かってないのではありませんか?
0202NAS6 ◆n3AmnVhjwc
2015/09/07(月) 23:46:02.94ID:z69KZ2wJ?
こんな図式
0203デフォルトの名無しさん
2015/09/07(月) 23:47:02.75ID:aNxpTvAmもういいじゃないか。
0204デフォルトの名無しさん
2015/09/07(月) 23:50:10.59ID:jq4VsIqNですねやめときます
NAS6はいつもageて書くのでこの板にいる人にとっても迷惑ですし相手をしたら駄目ですね
0205デフォルトの名無しさん
2015/09/07(月) 23:50:57.88ID:QIs6nwEn相手が「普通の対応」するなら、前スレでも3レス以内に終わってるんだけどね。
0206NAS6 ◆n3AmnVhjwc
2015/09/08(火) 00:01:29.60ID:A17cgJj+だから、バブル崩壊が起こるよね
0207デフォルトの名無しさん
2015/09/08(火) 00:37:32.61ID:DYEyaECh循環をわざと起こしてるのはお前一人だろ
みなまともな日本語を使ってるにお前一人意味不明な事ばかり書いてわざと循環させてるじゃん
0208デフォルトの名無しさん
2015/09/08(火) 01:49:48.05ID:TS9AjA7asum = sum
が再帰と呼ぶかどうかの話をしてたんでしょ。(NAS6が一人だけ呼ぶ派)
従ってNAS6の文末は
「だから再帰と呼ぶ」で結ばれなければ支離滅裂。
「だからバブルの崩壊が起こるよね」
誰がバブルの話なんてしてんだ?
頭大丈夫か?
しかもこの手の問題は、定義の問題だから、
異議を唱えようと唱えまいとそう決まってるもんはそうと決まってるわけで。
0209デフォルトの名無しさん
2015/09/08(火) 03:12:37.34ID:aPIkSKxt0210デフォルトの名無しさん
2015/09/08(火) 07:06:17.98ID:ClXQIazLディレクトリを奥まで掘ったり木構造の枝葉をなで回したりNクイーン問題の解を隅々までなめ回したり
0211デフォルトの名無しさん
2015/09/08(火) 07:18:20.29ID:Tqb11w6f変態じゃん
0212NAS6 ◆n3AmnVhjwc
2015/09/08(火) 08:35:32.37ID:A17cgJj+*1
項ごとの、n,s,iを保存
int sum(int n, int s, int i){
if (n < i) { return s; }
retrun sum(n, s + i, i + 1);
}
int r = sum(10, 0, 1);
*2
項ごとの、s,iを保存
int i[11] = {1}, j, s[11] = {0};
for (j = 1; j <= 10; j++) {
i[j + 1] = i[j] + 1;
s[i[j + 1]] = s[i[j]] + i[j];
}
*3
保存しない
int i, s = 0;
for (i = 1; i <= 10; i++) {
s = s + i;
}
再帰関数ではないのはわかるけど
これらは、スタックを保存しなければ
再帰処理ではないの?
0213デフォルトの名無しさん
2015/09/08(火) 08:38:39.61ID:yHie6cmJどうでもいいけど、普通はC++では、あassignment operatorの引数は値渡しだよ
this_type& operator=(this_type rhs)
0214NAS6 ◆n3AmnVhjwc
2015/09/08(火) 08:39:08.25ID:A17cgJj+*2
項ごとの、s,iを保存
int i[11] = {1}, j, s[11] = {0};
for (j = 1; j <= 10; j++) {
i[j] = i[j - 1] + 1;
s[i[j] - 1] = s[i[j - 1] - 1] + i[j - 1];
}
0215デフォルトの名無しさん
2015/09/08(火) 08:41:18.89ID:fy5XWhGcスタックの存在は忘れたほうがいい。
関数から、自分自身の関数を呼んだら再帰、
それ以外は再帰じゃない。
0216NAS6 ◆n3AmnVhjwc
2015/09/08(火) 08:47:52.49ID:A17cgJj+スタックの存在を考えないと、末尾再帰しか考えられなくね?
0217デフォルトの名無しさん
2015/09/08(火) 08:59:14.46ID:fy5XWhGc今は末尾再帰の話をしているわけじゃない。
末尾再帰になってようがそうでなかろうが
再帰であるかどうかには関係ない。
再帰は、関数から自分自身の関数を呼ぶかどうか。
それだけ。みんなが最初から言っていること。
0218NAS6 ◆n3AmnVhjwc
2015/09/08(火) 09:26:16.59ID:A17cgJj+自分:はい
トロ:せつないって胸キュン?
自分:はい
トロ:トロはせつなくて胸キュンニャ!
0219NAS6 ◆n3AmnVhjwc
2015/09/08(火) 09:36:11.89ID:A17cgJj+だから
再帰関数は、関数から自身の関数を呼ぶかどうか
再帰定義は、定義に自身の簡単な定義を含むかどうか
0220デフォルトの名無しさん
2015/09/08(火) 09:50:01.65ID:2c5lB4nyなんかまじめに答えたくないくらいのレベルの話なんだが…
まあNAS6は出来ることと出来ないことが極端に偏ってるのは分かったので一応まじめに答えとく。
丁寧に説明するのは一度だけだぞ。しかも普通の説明じゃなくてNAS6専用説明だ。
厳密な話をすると、処理と言うのがもし「単体」を指してるのなら、再帰処理なんてのはないんだよ。
再帰処理って言葉、(間違って使ってる場合は除いて)現場で使ってる人はほぼいないよな。
再帰関数と同じ意味で使ってる人ならたまに居るけど。
まずプログラムでの再帰と言うのは
「処理の移動経路(順序でも手順でもなんでもいい)」に対する「考え方」の一つだ。
これは考えかたの問題でもあるから、アセンブラやニーモニックをもちだして、「こう作ればこうなるから同じだ」なんてのは話がおかしくなる。
関数の話をしてる時に、アセンブラレベルで関数と言う仕組み自体を組み変えたら話しにならなくなるのと同じだ。
そして再帰と言うのは、再び帰ってくることだ。何がと言うと「処理が」だ。
しかもただ帰ってくるわけではない。実行手順の構造を保持しながら帰ってくるのだ。
普通は用意された関数の仕組みを使って、自動で再帰させることを再帰と呼ぶ。ここまでいいな。
当然、意図的にその処理手順を記録したスタックを操作するのが前提の考えならば、普通は再帰とは言わん。
しかも普通プログラムで再帰なのかどうか、と言うのは、「制御構造(関数とかforとかwhile)」 に対する物であって、
変数や代入に対するどうこうではない。(sumがどうこうって言ってたのは自分ひとりだけって事は気づいてるよな?)
*2は実行手順のスタックは積んでないだろ。いったい何がどこに再帰してると思ったんだ?
*1は自動でスタックに積まれるよな。分かるよな。その手順どおりに実行経路が決まって行ったり帰ったりするよな
冒頭の「再帰処理」については、
プログラムのsum = sum では左辺のsumが逆流して右辺のsumを定義することは (意図的にそうゆう言語を作らない限り) 有り得ない。
だから再帰とは言わない。数学や日本語は別だぞ
日本語で「sumとはsum」って言われると、左辺のsumの内容を調べるのに右辺に飛んで、右辺のsumの内容を調べるのに左辺に…永久に再帰する
0221デフォルトの名無しさん
2015/09/08(火) 10:09:06.66ID:2c5lB4ny抽象化された関数と言う概念を使って、自動で再帰(スタック管理)させるのだから。
そのかわり、プログラマは再帰として抽象化された制御構造で考えることが出来る。
「出かける」と言う概念には「帰って来る」って概念もセットになるだろう。普通は。
当然その抽象概念が用意されてないアセンブラとかを使うと、めんどくさい限りだ。
スタックの容量は、コンピュータ資源の都合上で考えたくなったら考えるが、それはまた「全く別」のお話。
0222NAS6 ◆n3AmnVhjwc
2015/09/08(火) 10:14:49.99ID:A17cgJj+はあ・・・これで分かる?特殊な書き方するけど、これで意味が分かってほしいな
int i, s = 0;
for (i = 1; i <= 10; i++) {
s = s + i;
}
i=1の時
s(i=1,値1)=s(i=0,値0)+i(i=1,値1)
i=2の時
s(i=2,値3)=s(i=1,値1)+i(i=2,値2)
i=3の時
s(i=3,値6)=s(i=2,値3)+i(i=3,値3)
以下略
左辺のsumが逆流して右辺のsumを定義することになってるよ
実行手順の構造(ではないけど、正確には実行手順のテンポラリ)を
保持しながら帰ってきてるでしょ
0223デフォルトの名無しさん
2015/09/08(火) 10:16:12.90ID:2c5lB4ny0224デフォルトの名無しさん
2015/09/08(火) 10:34:12.97ID:wtmIsGEPこいつただの構ってちゃんだから一切相手せず放置しとけばつまらなくなって向こうから消える
分かっててわざと話ずらしてんだよ
延々と相手してもらうために
このご時世じゃ相手に話を聞いてもらうために相手に金払わなきゃならないんですよ
ただで聞いてもらおうなんて虫がよすぎます
ただで飯をおごってもらってるのとおんなじですから
専ブラを使っている人はNGNameにNAS6と入れるだけです
0225NAS6 ◆n3AmnVhjwc
2015/09/08(火) 11:16:03.01ID:A17cgJj+自分:はい
トロ:再帰って美味しい?
自分:はい
トロ:トロは再帰して美味しいニャ!
0226デフォルトの名無しさん
2015/09/08(火) 14:38:06.24ID:7dDfDgYn0227デフォルトの名無しさん
2015/09/08(火) 19:41:18.92ID:VoiQlJVj直接的あるいは間接的に自分自身を呼ぶ関数
0228デフォルトの名無しさん
2015/09/09(水) 08:23:53.38ID:y0wHwAVE0229デフォルトの名無しさん
2015/09/09(水) 08:25:38.65ID:qa+GQBo1君たち・・・複数
オレオレ定義は要りません
0230デフォルトの名無しさん
2015/09/09(水) 08:37:12.19ID:y0wHwAVE0231デフォルトの名無しさん
2015/09/09(水) 08:42:39.18ID:qa+GQBo1それぞれの人が、個々に知識を得ている時
より多くの人が知っている知識の方が
正しいです。
0232デフォルトの名無しさん
2015/09/09(水) 09:29:21.72ID:1Ou1EL3T最低限意味が通れば
0233NAS6 ◆n3AmnVhjwc
2015/09/09(水) 11:27:53.92ID:C2LbPxwfそれでは、未開部族の中に放り込まれたとき、知識は、正しくなくなるのですね?
0234デフォルトの名無しさん
2015/09/09(水) 11:51:03.94ID:OjqvIpm42.ごくまれな反例をとりあげる
「それでは、未開部族の中に放り込まれたとき、知識は、正しくなくなるのですね?」
0235NAS6 ◆n3AmnVhjwc
2015/09/09(水) 12:58:03.11ID:C2LbPxwf・瀉血、割礼など、悪習が正しい方法とされている場合がある
0236デフォルトの名無しさん
2015/09/09(水) 13:01:57.46ID:OjqvIpm4まれな反例なんだが
先進国で瀉血、割礼なんかやってるか?
お前頭悪いっしょ
0237デフォルトの名無しさん
2015/09/09(水) 13:22:36.93ID:1Ou1EL3T0238デフォルトの名無しさん
2015/09/09(水) 13:24:34.06ID:qa+GQBo1まあここまで遊べたし、
ね?スレ立てた意味あったでしょ?w
0239デフォルトの名無しさん
2015/09/09(水) 13:26:40.64ID:yEdJqNkn天動説信じてる未開人が現代に紛れ込んだ事を言いたかったんだろうが、
未開人につけ込まれる、脇のあまさ。
お前バカなんだから、引っ込んでろ。
0240デフォルトの名無しさん
2015/09/09(水) 13:29:04.69ID:qa+GQBo10241デフォルトの名無しさん
2015/09/09(水) 13:29:31.14ID:qa+GQBo10242NAS6 ◆n3AmnVhjwc
2015/09/09(水) 15:04:03.16ID:C2LbPxwf世間知らず
0243デフォルトの名無しさん
2015/09/09(水) 16:14:26.05ID:E/sI2eG1お前前にもいたよな
もしかしてNAS6が他の所から書き込んで自己弁護してる?
>>241
NAS6は馬鹿なのに詭弁強弁が通ると思ってる甘ちゃん
そんな馬鹿いくらでも見てきたけどNAS6は最弱の部類ですよ
>>242
ニートに言われたくないなあ
0244デフォルトの名無しさん
2015/09/09(水) 17:17:18.80ID:yEdJqNknなんで、あれがNASの擁護になるんだよ。
バカの思考回路は理解不能だわ。
0245デフォルトの名無しさん
2015/09/09(水) 19:03:02.63ID:FLIFW6slそれこそ詭弁
0246デフォルトの名無しさん
2015/09/09(水) 19:32:08.27ID:qa+GQBo1言葉の定義だから。
たった一人しか同意してない
言葉の定義に意味は無いw
0247NAS6 ◆n3AmnVhjwc
2015/09/09(水) 20:26:13.33ID:C2LbPxwf大辞林だよ?
大辞林 第三版の解説
さいきてき【再帰的】
�@自己の行為の結果が自己に戻ってくること。フィードバック。
�A(数学などで)定義の中に定義されるものが含まれていること。
0248デフォルトの名無しさん
2015/09/09(水) 20:26:36.08ID:PucPC3VB何の権威もないもので権威付けする前に少しは自分で考える力をつけたらどうだ?
0249デフォルトの名無しさん
2015/09/09(水) 20:30:42.52ID:wWdkHka6権威付けなんかしてないんだが
ほう、お前は権威付けが好きみたいだな
日頃からそういうのやってるのか?
0250デフォルトの名無しさん
2015/09/09(水) 20:31:09.71ID:VSpGV/frそれと同じ理屈で継承じゃないものを
継承っていいそうだなw
例外も大辞林もってきて、
これが「例外」だとかいいそうw
えとさぁ。プログラミング用語の話だってわかってる?w
0251NAS6 ◆n3AmnVhjwc
2015/09/09(水) 20:31:40.60ID:C2LbPxwf「再帰関数のみが再帰」って言っている奴が
たった一人で自演をしているだけだから
自分で自分のことを言ってるだけか・・・
0252デフォルトの名無しさん
2015/09/09(水) 20:33:32.78ID:VSpGV/frなんで一人だと思ったの?w
ID違うでしょ。
0253デフォルトの名無しさん
2015/09/09(水) 20:34:29.80ID:PucPC3VBじゃあなんで「詭弁のガイドラインによると詭弁である」かのような書き込みをしたの?
自分で何をやろうとしてたか理解できてない?
0254デフォルトの名無しさん
2015/09/09(水) 20:36:49.00ID:VSpGV/frあれは、詐欺もしくは詐欺まがいの書き込みに
だまされないようにするための注意だろう?
0255NAS6 ◆n3AmnVhjwc
2015/09/09(水) 20:38:00.20ID:C2LbPxwf別にどうでもいいんだが
throw 〜 catch
で例外は当然だろ
で
if(!n)
if(n==nullptr)
if(n==undefined)
こういうのも例外に含むかどうかなんて、そいつの好みだろ
0256デフォルトの名無しさん
2015/09/09(水) 20:39:19.64ID:VSpGV/frif(!n)
これが「例外」だとさ
苦笑(大笑い)
0257デフォルトの名無しさん
2015/09/09(水) 20:42:33.03ID:PucPC3VB酔ってるのか?
落ち着いてレスしな
0258NAS6 ◆n3AmnVhjwc
2015/09/09(水) 20:43:14.67ID:C2LbPxwfif(!n)
if(n==nullptr)
if(n==undefined)
は例外処理ではなくて
try 〜 throw 〜 catch
asseert
くらいしかないんだろ
0259NAS6 ◆n3AmnVhjwc
2015/09/09(水) 20:45:09.88ID:C2LbPxwfゼロ除算なんて例外の基本の基本
0260デフォルトの名無しさん
2015/09/09(水) 20:50:20.46ID:YdXDVCj1ここは再帰関数のスレではなく、「『再帰的』とは何か?」のスレだったの?
0261NAS6 ◆n3AmnVhjwc
2015/09/09(水) 20:54:34.58ID:C2LbPxwf再帰とは何か?
略
0262デフォルトの名無しさん
2015/09/09(水) 20:59:33.74ID:FLIFW6sl0263デフォルトの名無しさん
2015/09/09(水) 21:00:02.70ID:YdXDVCj10264デフォルトの名無しさん
2015/09/09(水) 21:17:44.99ID:z4+LRm4z再帰なんてStack overflowの元凶だろ?
業務アプリで使うとかありえないと思うんだが。
0265NAS6 ◆n3AmnVhjwc
2015/09/09(水) 21:19:33.67ID:C2LbPxwfD社から買ってA社はB社に売る
A社から買ってB社はC社に売る
B社から買ってC社はD社に売る
C社から買ってD社はA社に売る
と、個々の会社は俺は違うと思っていても
循環取引のサイクルの中に
知らずに取り込まれている場合がある
こういう、「迷惑の発明」こそ詭弁の中の詭弁
0266デフォルトの名無しさん
2015/09/09(水) 21:24:20.99ID:0S5pZc99じゃあループは無限ループの元凶だから
使うべきじゃないってことになるし、
パンツはパンツ泥棒の元凶ってことになるよね。
でもパンツ履くだろ?そういうことだ。
0267デフォルトの名無しさん
2015/09/09(水) 21:26:28.21ID:V9adpqxF製作途中だけどね
0268デフォルトの名無しさん
2015/09/09(水) 21:31:04.01ID:4Pix0Avfメッセージ呼び出しが再帰っていうのは、
メッセージダイアログが、さらにメッセージダイアログを出して、
そのダイアログがさらに、ダイアログを出すってことか?
メッセージダイアログを閉じても
同じものが出るのは再帰じゃないな。
単なる無限ループ。
0269NAS6 ◆n3AmnVhjwc
2015/09/09(水) 21:33:53.94ID:C2LbPxwf国際金融のトリレンマ
トリ(X)レンマになるのは
循環論の「迷惑の発明」状態だから
0270デフォルトの名無しさん
2015/09/09(水) 21:35:25.40ID:V9adpqxFPostMessageなら違うが
0271NAS6 ◆n3AmnVhjwc
2015/09/09(水) 21:46:56.85ID:C2LbPxwfプログラミングの設計思想として相互依存関係は
循環論になるから出来得る限り排除するのが普通だけどな
0272NAS6 ◆n3AmnVhjwc
2015/09/09(水) 21:50:55.62ID:C2LbPxwfは、再帰が悪いのではなく、相互依存関係の構造が悪い
0273デフォルトの名無しさん
2015/09/09(水) 22:50:01.10ID:4Pix0Avfどこに再帰が悪いって書いてあるんだ?
0274デフォルトの名無しさん
2015/09/09(水) 22:59:43.97ID:bdykH7Ti疑っているんだがな。
0277Akishino Reeks☆[転載禁止]2ch.net
2015/09/10(木) 22:20:55.21ID:bnJhddUC| |
| ● |
|_____|
|
|
Σ(Д・;)『佳子さま』に『スキャンダル!!』 ★***暴露情報!!***
■『男性と"お付き合い"』も、そろそろあると、皆様お察しの事でしょう。
■そうなんです!!「男性との"お付き合い"」
■・・・いや、【"お突き合い"】のお話が、急浮上です!!
■知られざる『佳子さま』の「男性事情」が明らかに!!
※下記を『Google』か『Yahoo』で検索して下さい。
↓↓↓検索キーワード↓↓↓
『眞子さま かれし』 ←漢字変換
『佳子さま 眞子さま かれし』 ←漢字変換
『眞子様 かれし』 ←漢字変換
★上記で検索しますと、『1ページ目』か『2ページ目』あたりに、
【婚約】秋條宮家の佳子様と眞子様・・・・・・・・【結婚】
↑↑↑が表示されます。
※留学中にクラブに出入りしたり不特定多数の男性と関係を持った詳細まで……。
★★★★★★★★★★★★★★★★★★★★
https://sites.google.com/site/kimitujyouhou
0278デフォルトの名無しさん
2015/09/10(木) 23:55:58.43ID:TaFnpRYE全然違うだろ
ループは条件が正しければ抜ける
再帰は条件が正しくても抜ける前にStack Overflowを起こす。
0279デフォルトの名無しさん
2015/09/11(金) 00:14:56.08ID:l/LuS5UK一度試せば何回関数呼べるのかわかるでしょうが。
それに多少のバッファ持たせて再帰がこれだけ
深くなったら処理を打ち切るって条件かませばいいでしょうが。
何でもかんでも再帰にすればいいと言ってんじゃないよ。
なんでもかんでも包丁でかっさばけばいいわけじゃない。
プログラミング界の天才外科医として俺はそういうのは許せない。
0280デフォルトの名無しさん
2015/09/11(金) 00:34:41.08ID:7563jNLz0281デフォルトの名無しさん
2015/09/11(金) 06:28:21.76ID:09P0zO5Bされる言語においてはループに変換される。
そのような最適化を行わないでコードのとおりに
実行すればスタックオーバーフローになる。
0282デフォルトの名無しさん
2015/09/11(金) 06:29:17.38ID:09P0zO5B> それに多少のバッファ持たせて再帰がこれだけ
> 深くなったら処理を打ち切るって条件かませばいいでしょうが。
えぇ、それがスタックオーバーフローだよw
スタックオーバーフローという例外になって処理が打ち切られるから
答えを出すことが出来ない。
0283デフォルトの名無しさん
2015/09/11(金) 08:51:23.71ID:5NOK/0qB末尾呼び出し最適化って、try catch で囲んでもちゃんと効くものなの?
それとも、try catch に入れた時点で最早末尾呼び出しではない?
0284デフォルトの名無しさん
2015/09/11(金) 12:15:28.87ID:0KyqNxdAhttp://d.hatena.ne.jp/leque/20121202/p1
http://www.ymotongpoo.com/works/lyse-ja/ja/09_errors_and_exceptions.html
使ってる処理系のマニュアル読んだ方がいいと思うけどね。
0285デフォルトの名無しさん
2015/09/11(金) 14:07:52.08ID:bvB8mHVh末尾再帰呼び出しの最適化は働く場合もある。
0286デフォルトの名無しさん
2015/09/11(金) 18:51:12.07ID:G0A8z2XGその甘い考えが、急加速する自動車や太平洋上で消息を絶つ航空機につながったのではないだろうか。
0287デフォルトの名無しさん
2015/09/11(金) 18:53:51.95ID:G0A8z2XG再帰に拘る原始人の愚かさがわかるであろう。
0288デフォルトの名無しさん
2015/09/11(金) 20:06:44.64ID:vI/Sge8pミッションクリティカルなところは確実性が必要だ、としか言ってないよねそれ
それ以外の部分まで何でもかんでもループにこだわるのは時代遅れもいいところ
0289デフォルトの名無しさん
2015/09/11(金) 20:18:50.37ID:NZsxm6a9http://moro2222.blog.fc2.com/blog-entry-1352.html
痴女wwwwwwwwwwwwww
0290デフォルトの名無しさん
2015/09/11(金) 20:28:39.45ID:5NOK/0qBサンクス。ざっと眺めただけだけど、try の中に入れた時点で末尾呼び出しではないことが分かった。
外側で catch するしかないのね。
0291デフォルトの名無しさん
2015/09/11(金) 21:01:10.34ID:G0A8z2XG再帰はモジュール化に劣る。
いまどき再帰なんて使わないよ、この原始人め。
そもそもセキュリティ勧告で常に上位に来る再帰による危険性をわざわざ
使う理由が無い。
0292デフォルトの名無しさん
2015/09/11(金) 21:04:02.82ID:G0A8z2XGお前小学生に負けてるじゃねーか。
0293デフォルトの名無しさん
2015/09/11(金) 21:11:00.99ID:V5+3K+4nどういう意味?
0294デフォルトの名無しさん
2015/09/11(金) 21:43:46.78ID:vI/Sge8pセキュリティ勧告?どこの?
具体的に出してみて
0295デフォルトの名無しさん
2015/09/12(土) 06:47:21.20ID:o99yCw3m再帰なんて危険なだけで使い道のない初心者用の手抜きだろ。
再帰を禁止しないという事は、そういう会社ってこと。
取引を停止したほうが良い。
0296NAS6 ◆n3AmnVhjwc
2015/09/12(土) 08:26:09.58ID:u3wwvrmvclass tree{
public:
tree* parent;//rootのparentはnullptr
tree* chlid[];//説明の便宜上
int childsize;
...
};
//終了検知
bool end(tree* root, tree* v, int i, bool& b){
return ((b || !v->childsize) && v == root && v->childsize <= i)
}
//次の順番のノードを返す
tree* next(tree* v, int i, bool& b){
if(v->childsize <= i) { b = true; return v->parent; }
return v->child[i];
}
//ノード処理
tree* nodefunc(tree* root, tree* v)
{
int i = 0;
bool b = false;
while(!end(root, v, i, b)){
i += 1;
b = false;
v = next(v, i ,b);
if(!b){//v:子ノード処理}
else{//v:親ノード処理}
}
}
0297NAS6 ◆n3AmnVhjwc
2015/09/12(土) 08:30:01.75ID:u3wwvrmvtree* ith_child(tree* v, int i, bool& b){
if(v->childsize <= i) { b = true; return v->parent; }
return v->child[i];
}
//ノード処理
tree* nodefunc(tree* root, tree* v)
{
int i = 0;
bool b = false;
while(!end(root, v, i, b)){
i += 1; //次のノード
b = false;
v = ith_child(v, i ,b);
if(!b){//v:子ノード処理}
else{//v:親ノード処理}
}
}
0298NAS6 ◆n3AmnVhjwc
2015/09/12(土) 08:35:55.80ID:u3wwvrmvclass tree{
public:
tree* parent;//rootのparentはnullptr
tree* chlid[];//説明の便宜上
int childsize;
...
};
//終了検知
bool end(tree* root, tree* v, int i, bool& b){
return ((b || !v->childsize) && v == root && v->childsize <= i)
}
//iの順番のノードを返す
tree* ith_child(tree* v, int i, bool& b){
if(v->childsize <= i) { b = true; return v->parent; }
return v->child[i];
}
//ノード処理
tree* nodefunc(tree* root, tree* v)
{
int i = 0;
bool b = false;
//最初のノード処理
while(!end(root, v, i, b)){
i += 1; //次のノード b = false;
v = ith_child(v, i ,b);
if(!b){//v:子ノード処理}
else{//v:親ノード処理}
}
return v;
}
0299NAS6 ◆n3AmnVhjwc
2015/09/12(土) 08:42:22.01ID:u3wwvrmvclass tree{
public:
tree* parent;//rootのparentはnullptr
tree* chlid[];//説明の便宜上
int childsize;
...
};
//終了検知
bool end(tree* root, tree* v, int i, bool& b){
return ((b || !v->childsize) && v == root && (i < 0 || v->childsize <= i))
}
//iの順番のノードを返す
tree* at(tree* v, int i, bool& b){
if(i < 0 || v->childsize <= i) { b = true; return v->parent; }
return v->child[i];
}
//ノード処理
tree* nodefunc(tree* root, tree* v)
{
int i = 0;
bool b = false;
//最初のノード処理
while(!end(root, v, i, b)){
i += 1; //次のノード b = false;
v = at(v, i ,b);
if(!b){//v:子ノード処理}
else{//v:親ノード処理}
}
return v;
}
0300NAS6 ◆n3AmnVhjwc
2015/09/12(土) 08:53:36.58ID:u3wwvrmvclass tree{
public:
tree* parent;//rootのparentはnullptr
tree* chlid[];//説明の便宜上
int childsize;
int crnt;//i
...
};
//終了検知
bool end(tree* root, tree* v, bool& b){
return ((b || !v->childsize) && v == root && (v->crnt < 0 || v->childsize <= v->crnt))
}
//crntの順番のノードを返す
tree* at(tree* v, bool& b){
if(v->crnt < 0 || v->childsize <= v->crnt) { b = true; return v->parent; }
return v->child[v->crnt];
}
//ノード処理
tree* nodefunc(tree* root, tree* v)
{
crntzero();//v以下のcrntを全てゼロ初期化処理:詳細は省略
bool b = false;
//最初のノード処理
while(!end(root, v, b)){
v->crnt += 1; //次のノード b = false;
v = at(v, b);
if(!b){//v:子ノード処理}
else{//v:親ノード処理}
}
return v;
}
0301NAS6 ◆n3AmnVhjwc
2015/09/12(土) 08:57:33.49ID:QD0G+9W6は、再帰的処理か?ループ的処理か?
0302NAS6 ◆n3AmnVhjwc
2015/09/12(土) 09:11:43.86ID:QD0G+9W6class tree{
public:
tree* parent;//rootのparentはnullptr
tree* chlid[];//説明の便宜上
int childsize;
int crnt;//子ノード指示変数
...
//終了検知
bool end(tree* root, bool& b){
return ((b || !childsize) && this == root && (crnt < 0 || childsize <= crnt))
}
//crntの順番のノードを返す
tree* crntchild(bool& b){
if(crnt < 0 || childsize <= crnt) { b = true; return parent; }
return child[crnt];
}
};
//ノード処理
tree* nodefunc(tree* root, tree* v)
{
crntzero(v);//v以下のcrntを全てゼロ初期化処理:詳細は省略
bool b = false;
//最初のノード処理
while(!v->end(root, b)){
v->crnt += 1; //次のノード b = false;
v = v->crntchild(b);
if(!b){//v:子ノード処理}
else{//v:親ノード処理}
}
return v;
}
0303デフォルトの名無しさん
2015/09/12(土) 09:14:29.84ID:SayI8MOxそれは再帰とは言わない。
0304NAS6 ◆n3AmnVhjwc
2015/09/12(土) 09:18:51.51ID:u3wwvrmv//root以下のノード処理
tree* nodefunc(tree* root)
{
crntzero(root);//root以下のcrntを全てゼロ初期化処理:詳細は省略
tree* v = root;
bool b = false;
//最初のノード処理
while(!v->end(root, b)){
v->crnt += 1; //次のノード b = false;
v = v->crntchild(b);
if(!b){//v:子ノード処理}
else{//v:親ノード処理}
}
return v;
}
0305NAS6 ◆n3AmnVhjwc
2015/09/12(土) 09:21:14.87ID:u3wwvrmv再帰関数は使ってないけど、処理自体は再帰的処理そのものだよ
0306デフォルトの名無しさん
2015/09/12(土) 09:22:04.63ID:6uN+DXZMint IAbs(int x);
void Parity(int x);
void main(void);
/* 絶対値を返す */
int IAbs(int x)
{
return ((x >= 0)? x : -x);
}
/* 奇数か偶数かを表示する */
void Parity(int x)
{
printf("%s", (x % 2)? "奇数" : "偶数");
}
void main(void)
{
int n;
printf("整数を入力して下さい ");
scanf("%d", &n);
printf("その数の絶対値は %d です。\n", IAbs(n));
printf("それは");
Parity(n);
printf("です。");
}
0307デフォルトの名無しさん
2015/09/12(土) 09:22:56.89ID:6uN+DXZMint BubSort(int x[ ], int n);
void ShowData(int x[ ], int n);
void main(void);
#define NUM_DATA 10 /* ソートするデータの数 */
int x[ ] = {9, 4, 6, 2, 1, 8, 0, 3, 7, 5}; /* このデータをソート */
/* バブルソートを行う */
int BubSort(int x[ ], int n)
{
int i, j, temp;
for (i = 0; i < n - 1; i++) {
for (j = n - 1; j > i; j--) {
if (x[j - 1] > x[j]) { /* 前の要素の方が大きかったら */
temp = x[j]; /* 交換する */
x[j] = x[j - 1];
x[j - 1]= temp;
}
}
/* ソートの途中経過を表示 */
ShowData(x, NUM_DATA);
}
}
/* ソート対象のデータを表示 */
void ShowData(int x[ ], int n)
{
int i;
for (i = 0; i < n ; i++)
printf("%d\t", x[i]);
}
0308デフォルトの名無しさん
2015/09/12(土) 09:23:26.20ID:6uN+DXZM{
/* ソート前のデータを表示 */
printf("ソート前:\n");
ShowData(x, NUM_DATA);
printf("\n\n");
BubSort(x, NUM_DATA);
/* ソート後のデータを表示 */
printf("\n\nソート後:\n");
ShowData(x, NUM_DATA);
}
include <stdio.h>
#define NUM_DATA 8
void InsSort(int num[ ], int n) ;
void ShowData(int num[ ], int n);
void main(void);
/* n 個のデータの単純挿入ソートを行う */
void InsSort(int num[ ], int n)
{
int i, j, temp;
for (i = 1; i < n; i++) { /* i 番目の要素をソート済みの配列に挿入 */
temp = num[i]; /* i 番目の要素を temp に保存 */
for (j = i; j > 0 && num[j-1] > temp; j--) /* このループで */
num[j] = num[j -1]; /* temp を挿入する位置を決める */
num[j] = temp; /* temp を挿入 */
ShowData(num, NUM_DATA); /* 途中経過を表示 */
}
}
0309デフォルトの名無しさん
2015/09/12(土) 09:24:00.26ID:6uN+DXZMvoid ShowData(int num[ ], int n)
{
while (n--)
printf("%d ", *num++);
printf("\n");
}
void main(void)
{
/* ソート対象のデータ */
int num[ ] = {3, 7, 1, 5, 4, 2, 6, 0};
/* ソート前のデータの表示 */
printf("ソート前: ");
ShowData(num, NUM_DATA);
printf("\n");
/* ソート */
InsSort(num, NUM_DATA);
printf("\n");
/* ソート後のデータの表示 */
printf("ソート後: ");
ShowData(num, NUM_DATA);
printf("\n");
}
#include <stdio.h>
#include <string.h> /* strcmp( )に必要 */
#define NUM_DATA 10 /* ソートするデータ数 */
/* ソート対象の文字列へのポインタの配列 */
char *animal[NUM_DATA] = {"Cat", "Dog", "Tiger", "Bug", "Bird",
"Fish", "Seep", "Cow", "Pig", "Rat"
};
0310デフォルトの名無しさん
2015/09/12(土) 09:24:28.01ID:6uN+DXZMvoid main(void);
/* n個の文字列をソート */
void StrSort(char *str[ ], int n)
{
int i, j, k;
char *temp; /* 作業用ポインタ */
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if ((strcmp(str[j], str[i])) < 0) {
temp = str[i]; /* 作業用ポインタを使い */
str[i] = str[j]; /* i + 1番目に小さい要素と */
str[j] = temp; /* str[i] の要素と交換 */
}
}
for (k = 0; k < n; k++) /* ソートの途中経過を表示 */
printf("%s ", str[k]);
printf("\n");
}
}
0311デフォルトの名無しさん
2015/09/12(土) 09:25:11.15ID:/jNm+UV1#define NUM_DATA 8
void SimSelSort(int num[ ], int n) ;
void ShowData(int num[ ], int n);
void main(void);
/* n 個のデータの単純選択ソートを行う */
void SimSelSort(int num[ ], int n)
{
int i, j, k, min, temp;
for (i = 0; i < n - 1; i++) {
min = num[i]; /* i 番目の要素を暫定的に最小値とし */
k = i; /* 添字を保存 */
for (j = i + 1; j < n; j++) {
if (num[j] < min) { /* より小さい値が現れたら */
min = num[j]; /* 最小値の入れ替え */
k = j; /* 添字を保存 */
}
} /* このループを抜けるとk に最小値の添字が入っている */
temp = num[i]; /* i 番目の要素と最小値の交換 */
num[i] = num[k];
num[k] = temp;
ShowData(num, NUM_DATA);
}
}
0312デフォルトの名無しさん
2015/09/12(土) 09:25:44.37ID:/jNm+UV1if(v->childsize <= i) { b = true; return v->parent; }
return v->child[i];
}
//ノード処理
tree* nodefunc(tree* root, tree* v)
{
int i = 0;
bool b = false;
while(!end(root, v, i, b)){
i += 1; //次のノード
b = false;
v = ith_child(v, i ,b);
if(!b){//v:子ノード処理}
else{//v:親ノード処理}
}
}
0313デフォルトの名無しさん
2015/09/12(土) 09:26:00.47ID:/jNm+UV1bool end(tree* root, tree* v, int i, bool& b){
return ((b || !v->childsize) && v == root && v->childsize <= i)
}
//次の順番のノードを返す
tree* next(tree* v, int i, bool& b){
if(v->childsize <= i) { b = true; return v->parent; }
return v->child[i];
}
//ノード処理
tree* nodefunc(tree* root, tree* v)
{
int i = 0;
bool b = false;
while(!end(root, v, i, b)){
i += 1;
b = false;
v = next(v, i ,b);
if(!b){//v:子ノード処理}
else{//v:親ノード処理}
}
}
0314デフォルトの名無しさん
2015/09/12(土) 09:26:32.64ID:/jNm+UV1public:
tree* parent;//rootのparentはnullptr
tree* chlid[];//説明の便宜上
int childsize;
...
};
//終了検知
bool end(tree* root, tree* v, int i, bool& b){
return ((b || !v->childsize) && v == root && (i < 0 || v->childsize <= i))
}
//iの順番のノードを返す
tree* at(tree* v, int i, bool& b){
if(i < 0 || v->childsize <= i) { b = true; return v->parent; }
return v->child[i];
}
//ノード処理
tree* nodefunc(tree* root, tree* v)
{
int i = 0;
bool b = false;
//最初のノード処理
while(!end(root, v, i, b)){
i += 1; //次のノード b = false;
v = at(v, i ,b);
if(!b){//v:子ノード処理}
else{//v:親ノード処理}
}
return v;
}
0315デフォルトの名無しさん
2015/09/12(土) 09:26:50.60ID:/jNm+UV1void ShowData(int num[ ], int n)
{
while (n--)
printf("%d ", *num++);
printf("\n");
}
void main(void)
{
/* ソート対象のデータ */
int num[ ] = {8, 7, 6, 5, 4, 3, 2, 1};
/* ソート前のデータの表示 */
printf("ソート前: ");
ShowData(num, NUM_DATA);
printf("\n");
/* ソート */
SimSelSort(num, NUM_DATA);
printf("\n");
/* ソート後のデータの表示 */
printf("ソート後: ");
ShowData(num, NUM_DATA);
printf("\n");
}
0316デフォルトの名無しさん
2015/09/12(土) 09:27:37.42ID:96TVgXwJ#define NUM_DATA 8
void ShellSort(int num[ ], int n) ;
void InsSort(int num[ ], int gap, int n);
void ShowData(int num[ ], int n);
void main(void);
/* n 個のデータのシェルソートを行う */
void ShellSort(int num[ ], int n)
{
int gap;
for (gap = n / 2; gap > 0; gap /= 2)
InsSort(num, gap, n);
}
/* n 個のデータの単純挿入ソートを行う */
void InsSort(int num[ ], int gap, int n)
{
int i, j, temp;
for (i = gap; i < n; i ++) {
for (j = i - gap; j >= 0; j -= gap) { /* このループで */
if (num[j] <= num[j + gap]) /* j 番目とj + gap 番目と比較 */
break; /* ここにbreak;を挿入。H.O.さんご指摘ありがとうございました。 */
else {
temp = num[j]; /* 要素の入れ替え */
num[j] = num[j + gap];
num[j + gap] = temp;
ShowData(num, NUM_DATA); /* 途中経過を表示 */
}
}
}
printf("\n"); /* InsSort( ) を抜ける時改行 */
}
0317NAS6 ◆n3AmnVhjwc
2015/09/12(土) 09:29:10.11ID:u3wwvrmvループ的に説明するより、再帰的に説明した方が
分かりやすいんだけど
0318デフォルトの名無しさん
2015/09/12(土) 09:30:14.33ID:96TVgXwJvoid RadixSort(int x[ ], int n, int r);
void ShowData(int x[ ], int n);
void main(void);
#define NUM_DATA 10
static int rad[NUM_DATA]; /* 基数をしまう配列 */
static int y[NUM_DATA]; /* 作業用配列 */
/* 基数ソートを行う */
void RadixSort(int x[ ], int n, int r) /* x[ ]:ソートするデータ */
{ /* n:データの数 */
int i, j, k; /* r:基数を取り出す最大値 */
int m = 1; /* 基数を取り出す桁 */
while (m <= r) {
for (i = 0; i < n; i++)
rad[i] = (x[i] / m) % 10; /* 基数を取り出し rad[i] に保存 */
k = 0; /* 配列の添字として使う */
for (i = 0; i <= 9; i++) /* 基数は 0 から 9 */
for (j = 0; j < n; j++)
if (rad[j] == i) /* 基数の小さいものから */
y[k++] = x[j]; /* y[ ] にコピー */
for (i = 0; i < n; i++)
x[i] = y[i]; /* x[ ] にコピーし直す */
/* 途中経過を表示 */
printf("\nソート中:\n");
ShowData(x, n);
m *= 10; /* 基数を取り出す桁を一つ上げる */
}
}
0319デフォルトの名無しさん
2015/09/12(土) 09:30:27.18ID:96TVgXwJvoid ShowData(int x[ ], int n)
{
int i;
for (i = 0; i < n ; i++)
printf("%d\t", x[i]);
}
void main(void)
{ /* ソートするデータ */
int x[NUM_DATA] = { 5489, 1473, 7853, 1058, 9448,
1118, 7979, 2163, 1856, 3117
};
int n = 10; /* ソートするデータ数 */
int r = 1000; /* ソートするデータから取り出す基数の上限 */
/* ソート前のデータを表示 */
printf("ソート前:\n");
ShowData(x, n);
printf("\n");
RadixSort(x, n, r);
/* ソート後のデータを表示 */
printf("\n\nソート後:\n");
ShowData(x, n);
}
0320デフォルトの名無しさん
2015/09/12(土) 09:30:56.98ID:96TVgXwJ#define MAX_DATA 10
int temp[MAX_DATA]; /* 最小でも配列と同じサイズの領域が必要 */
void MergeSort(int x[ ], int left, int right);
void main(void);
/* 配列 x[ ] の left から right の要素のマージソートを行う */
void MergeSort(int x[ ], int left, int right)
{
int mid, i, j, k;
if (left >= right) /* 配列の要素がひとつなら */
return; /* 何もしないで戻る */
/* ここでは分割しているだけ */
mid = (left + right) / 2; /* 中央の値より */
MergeSort(x, left, mid); /* 左を再帰呼び出し */
MergeSort(x, mid + 1, right); /* 右を再帰呼び出し */
/* x[left] から x[mid] を作業領域にコピー */
for (i = left; i <= mid; i++)
temp[i] = x[i];
/* x[mid + 1] から x[right] は逆順にコピー */
for (i = mid + 1, j = right; i <= right; i++, j--)
temp[i] = x[j];
i = left; /* i とj は作業領域のデーターを */
j = right; /* k は配列の要素を指している */
for (k = left; k <= right; k++) /* 小さい方から配列に戻す */
if (temp[i] <= temp[j]) /* ここでソートされる */
x[k] = temp[i++];
else
x[k] = temp[j--];
}
0321デフォルトの名無しさん
2015/09/12(土) 09:31:13.83ID:96TVgXwJ{
int i;
/* ソートされるデータ */
int x[ ] = {9, 4, 6, 2, 1, 8, 0, 3, 7, 5};
/* ソート前のデータを表示 */
printf("ソート前\n");
for (i = 0; i < MAX_DATA; i++)
printf("%d\t", x[i]);
MergeSort(x, 0, MAX_DATA - 1);
/* ソート後のデータを表示 */
printf("ソート後\n");
for (i = 0; i < MAX_DATA; i++)
printf("%d\t", x[i]);
}
0322NAS6 ◆n3AmnVhjwc
2015/09/12(土) 09:40:00.52ID:u3wwvrmvclass tree{
public:
tree* parent;//rootのparentはnullptr
tree* chlid[];//説明の便宜上
int childsize; int crnt;//子ノード指示変数
...
//終了検知
bool end(tree* root, bool b){
return ((b || !childsize) && this == root && (crnt < 0 || childsize <= crnt))
}
//crntの順番のノードを返す
tree* crntchild(bool& b){
if(crnt < 0 || childsize <= crnt) { b = true; return parent; }
return child[crnt];
}
};
//root以下のノード処理
void nodefunc(tree* root)
{
crntzero(root);//root以下のcrntを全てゼロ初期化処理:詳細は省略
tree* v = root; bool b = false;
//最初のノード処理
while(!v->end(root, b)){
v->crnt += 1; //次のノード b = false;
v = v->crntchild(b);
if(!b){//v:子ノード処理}
else{//v:親ノード処理}
}
}
0323デフォルトの名無しさん
2015/09/12(土) 09:51:06.51ID:38RTNor4#define MAX_DATA 100
int Bin[MAX_DATA]; /* 作業用配列 */
void BinSort(int x[ ], int n);
void ShowData(int x[ ], int n);
void main(void);
/* ビンソートを行う */
void BinSort(int x[ ], int n)
{
int i, j;
if (n > MAX_DATA) {
printf("データが多すぎます!\n");
return;
}
else {
for (i = 0; i < MAX_DATA; i++)
Bin[i] = 0; /* 作業用配列の初期化 */
for (i = 0; i < n; i++) /* x[i] の値の */
Bin[x[i]]++; /* Bin[ ] の要素の値を */
/* インクリメント */
j = 0; /* x[ ] の添字として使用 */
for (i = 0; i < MAX_DATA ; i++)
if (Bin[i]) /* 0でなければ */
x[j++] = i; /* 書き戻す */
}
}
0324デフォルトの名無しさん
2015/09/12(土) 09:52:04.12ID:XNUqiXhSvoid ShowData(int x[ ], int n)
{
int i;
for (i = 0; i < n ; i++)
printf("%d\t", x[i]);
}
void main(void)
{
/* ソートするデータ */
int x[MAX_DATA] = {89, 1, 78, 58, 48, 18, 9, 21, 56, 11,
62, 23, 38, 96, 4, 45, 73,14, 30, 27,
6, 35, 2, 25, 69, 41, 8, 51, 0, 32,
98, 12, 33, 72, 19, 52, 28, 86, 17, 99
};
int n = 40; /* ソートするデータの数 */
/* ソート前のデータを表示 */
printf("ソート前:\n");
ShowData(x, n);
printf("\n");
BinSort(x, n);
/* ソート後のデータを表示 */
printf("\n\nAソート後:\n");
ShowData(x, n);
}
0325NAS6 ◆n3AmnVhjwc
2015/09/12(土) 09:54:18.33ID:u3wwvrmv0326デフォルトの名無しさん
2015/09/12(土) 09:57:28.02ID:BH7VjDv80327デフォルトの名無しさん
2015/09/12(土) 11:00:15.81ID:/sFVAJJ4いいからセキュリティ勧告がどれかさっさと示してね
0328デフォルトの名無しさん
2015/09/12(土) 12:32:50.26ID:y43Wtzfc個人の主張として批判せず、いたずらにある類として扱うのは極めて恣意的かおバカの批判にあらざる攻撃の特徴。
まあ、その軽蔑すべき発想で返した俺も反省はしてもよいが
はっきり言って精神病とバカの特徴でしかない論法でレスするなよ。
俺はバカと精神病きらいだからな。
おまえら、マジで精神病と思われる宣言的絶対主義の形而上学バカの一味は人類の公的な敵だとおもっているからな。
さしあたりお前らが馬鹿にされていることは科学的認識の健全性をそれなりに示すから喜ばしいがな。
それにしても、単なる知識を披露しあっているだけの時は頭良さそうなふりはできるが、
いよいよ自身の認識を問われる事態になるとここにいる連中、そこの浅さを露呈するやつ多すぎ
所詮、2chだな
0329NAS6 ◆n3AmnVhjwc
2015/09/12(土) 12:36:32.11ID:u3wwvrmvまるで自分が人類の唯一の味方かのような書き込みですね
0330NAS6 ◆n3AmnVhjwc
2015/09/12(土) 12:59:14.49ID:u3wwvrmvで、人類唯一の味方のお前は、何でツリートラバースが
再帰的処理をラッピングして、列挙しているとは思わないの?
>>322
のような処理ならば
ループ的に説明するより、再帰的に説明した方が話が通る
0331NAS6 ◆n3AmnVhjwc
2015/09/12(土) 14:00:59.20ID:u3wwvrmvが、そんなに嫌なら
「基準を全く用いないこと」
で、何かの意味が分かりますか?
0332NAS6 ◆n3AmnVhjwc
2015/09/12(土) 14:26:26.36ID:u3wwvrmv0333デフォルトの名無しさん
2015/09/12(土) 15:11:48.96ID:eSqErBQBただ繰り返しを再帰と言い直しているだけ。共有すべき前提が共有できてないから、感想も結論もコードのコピペも無意味
普通の人なら話の土台は他の人と協調して擦り合わせ、その上で立場や経験の違いから異なってくる意見を交わすんだが、
誰と言葉を共有しない時点で話題に入ることすら出来ないんだから、煽り荒らしより劣悪
枯れ木も山の賑わいと言うが、文字化けレベルのノイズは要らんわなあ
0334デフォルトの名無しさん
2015/09/12(土) 16:51:13.69ID:fRaBt1iwstatic int[] loop(int[] a, int[] values) {
int outer = 0;
for (int inner = 0; inner < a.length; inner++)
if (contains(values, a[inner]))
a[outer++] = a[inner];
return Arrays.copyOf(a, outer);
}
static int[] recursive(int[] a, int value) {
return recursive(0, 0, a, value);
}
static int[] recursive(int outer, int inner, int[] a, int value) {
if (inner >= a.length)
return Arrays.copyOf(a, outer);
if (a[inner] != value)
a[outer++] = a[inner];
return recursive(outer, inner + 1, a, value);
}
static boolean contains(int[] a, int value) {
for (int i = 0; i < a.length; i++)
if (a[i] == value)
return true;
return false;
}
0335デフォルトの名無しさん
2015/09/12(土) 16:54:28.45ID:fRaBt1iwループではouterがinnerより広い範囲で使用されることが
明確にわかる。
ひるがえって再帰の方はどうだろうか。
outerとinnerの範囲は同じだ。これではどちらが
outerでどちらがinnerなのか全くわからない。
つまり、再帰のプログラムを書くというのは人類にはまだ早いのである。
0336デフォルトの名無しさん
2015/09/12(土) 17:14:42.39ID:yr8S/3o70337デフォルトの名無しさん
2015/09/12(土) 17:20:11.03ID:GmqDtLxQそうでもない
池沼でも簡単に掲示板に書けるようになったのが問題
0338デフォルトの名無しさん
2015/09/12(土) 17:22:13.97ID:fRaBt1iw違う。そういうことを言ってるんじゃない。
人類の歴史というのは変数のスコープとの戦いの歴史なんだよ。
プログラミング黎明期はグローバル変数を使いまくりだったが、
それでは信頼性が高いアプリケーションを作れないことが発覚した。
そこから構造化プログラミングやオブジェクト指向プログラミングといった
モジュール化の仕組みが発達した。変数のスコープを分かりづらくする
再帰というのは時代に逆行しているのだよ。
0339デフォルトの名無しさん
2015/09/12(土) 19:50:56.22ID:OwMwiKYr話の腰を折ってすまんが ideone で動くコードを張ってくれないか?
そのコードにはインプリを仮定しているところがあるだろう?それがよくわからない
http://ideone.com
0340デフォルトの名無しさん
2015/09/12(土) 20:22:48.64ID:eSqErBQB求める配列の長さが本質的に不明なら、泥臭いことをせずにArrayListを使うべきじゃないのか。
recursiveを動かしてみたのか。loopバージョンを機械的に変形させようとして失敗しているがいいのか。
ADTもパターンマッチも無い言語で、対象が再帰的な型でない処理は無理して再帰にする必要性は無い。loopバージョンで十分。
けど再帰が使いやすい言語で再帰に適した処理を行うとき、変数のスコープが云々っていう主張はよく分からなくなる。
>>338のloopと同じ挙動のコードを再帰で素直にOCamlで書くと、
http://ideone.com/ItSSmZ
みたいになる。
添字outer, innerのような何を指しているのか見づらい変数や、a[outer++] = a[inner]というような破壊的代入が無い分、
何がしたいのか>>338より分かりやすくないか?分かりやすい分だけ、信頼性の向上にも寄与していると思うがな。
0341デフォルトの名無しさん
2015/09/12(土) 20:33:48.01ID:fRaBt1iwで、そのコードは何をしたいのよ?
わけがわからないんだが。
0342デフォルトの名無しさん
2015/09/12(土) 21:44:54.94ID:fRaBt1iwへい。
http://ideone.com/0nYclV
0343デフォルトの名無しさん
2015/09/12(土) 22:09:02.83ID:eSqErBQBlet FOO = ...で関数または値FOOの定義ができること
let rec FOO =で再帰関数FOOの定義ができること
let FOO = EXPR_B in EXPR_AはEXPR_A中でbindが呼び出せること
match EXPR with X::XSはEXPRの先頭要素をX、残りをXSとして->より右の式で使えること
リストlsの先頭にeを加える操作は(e::ls)と書けること
if EXPR then X else Yは EXPRがtrueならXを、falseならYと書けること
auxはauxiliary、つまり補助関数という意味で、アキュムレータを使った末尾再帰の内部関数によくつけられる名前
aux内のaccは逆順になっているので、最後にList.revでひっくり返すという定石
これらが分かれば何をしたいのか分かる。そしてOCamlなら↑に書いてあることは全て基本事項であり、学び始めてすぐに教わること。
一方>>342の意図を汲み取るには、Javaの構文が分かっている人間であっても、
innerとは何か?対になっていそうなouterとは何か?ただの添字i,jを使わないのは何を意図しているのか?
これを理解するにはメソッドloopの中全てを読み、どこで使われ、どこで変更されているか、どこで変更されていないかを読まないといけない。
(containsは名前と引数とコードを読めば意図がすぐ読めるからいい。)
a[outer++] = a[inner]って一体何をしているのか?他にaを参照している場所は?outerが変動するのはここだけか?
最後に配列のコピーをしているのは何故か?
そういうのを全部読み取って初めて、このメソッドloopの意図
「ある整数の配列aの要素のうち、整数の集合values(ただしint[]として表現)にあるものだけを順に並べた新しい配列を返す」
が分かる。引数aがぐちゃぐちゃにされることが本質ではないこととか、最後まで確認しないと分からない。
そういう意味で可読性が低い、意図が読みづらい、と思うの。
0344デフォルトの名無しさん
2015/09/12(土) 22:22:33.58ID:fRaBt1iwやめろ、長文を書かれて俺はいまパニクっている。
まずその点についてお前は俺のことを心配して気づかうべきだし、
やさしい気持ちでこの後の文章に目を通して欲しい。
再帰を使うと変数のスコープがわかりにくくなることが
あるよっていうのをわかりやすく示そうとしてouter、innerと
いう変数名を使用した。ロジックは全部で5行程度だし、何をやっているのかは
すぐにわかると思ったからそれで問題ないと踏んだ。
こういう事情があったんだ。同情するだろ?じゃあ同情してどうぞ。
今後ともよろしくお願いいたします。
0345デフォルトの名無しさん
2015/09/12(土) 22:48:30.39ID:XAqQ9sMDデータ構造に大きく影響されるでしょう
もっともよく使われてシンプルで基本的で皆に愛されていてパフォーマンスが良くて一般性のあるデータ構造は配列でしょう
特によく使われて特徴的なものに文字列なんかもあります
文字列が配列かどうかは議論の余地がありますが、配列の一種と考えても良いでしょう
誰でも文字列は沢山使うでしょう?
配列はとても沢山使われるのです
配列は、プログラミングにおいて、データ構造において、まるで空気のような存在です
ところで、配列は添え字でアクセスします
添え字のインクリメントを表現するのにループ文は最適です
strlenを再帰で実装しますか?しないでしょう、想像してください、不自然です
配列の有るところにループは現れるのです
0346デフォルトの名無しさん
2015/09/12(土) 23:29:21.46ID:/sFVAJJ4こういうセリフを吐く時点で、「あぁ、こいつか」ってすぐ分かるよねw
0347デフォルトの名無しさん
2015/09/13(日) 00:09:08.46ID:qVIN3EY/あどうも、いつもお世話になってます。オチャイル?( ̄ー ̄)_旦~~
0348NAS6 ◆n3AmnVhjwc
2015/09/13(日) 02:56:39.22ID:7TlExPBBstatic int[] recursive(int& outer, int inner, int[] a, int value) {
0349デフォルトの名無しさん
2015/09/13(日) 04:38:50.27ID:TV0u58pW> まずその点についてお前は俺のことを心配して気づかうべきだし、
こんなこと言ってる時点でNASよりヤバい奴だよ
NASはNASで再帰の定義の時点で間違ってるからどうでもいいんだが、
>>344は自分の狭い範囲の知識だけで再帰を全否定してるから余計にタチが悪い
しかもその狭い範囲をはみ出そうとすると「私はCしか分かりません。分からない話を
しないでください」と堂々と言い放つから始末におえない
0350デフォルトの名無しさん
2015/09/13(日) 04:57:39.35ID:F8rvhh2D0351NAS6 ◆n3AmnVhjwc
2015/09/13(日) 07:27:28.85ID:7TlExPBBこういう処理は再帰関数で書くから簡単なんよ
0352NAS6 ◆n3AmnVhjwc
2015/09/13(日) 07:52:16.78ID:7TlExPBBのouterのスコープはポインタあるいは参照渡しを再帰関数にすればいい
0353デフォルトの名無しさん
2015/09/13(日) 09:20:03.51ID:FYUX50//それで自分の想定した結果が間違っていたら、どこに間違い、勘違いがあるのかコードを読まなくちゃいけないだろ?
そんなときにfor文を変態的に書いてると、何が変動しているのかすごく読みづらい。
じゃあ再帰ならどうかというと、変動する値の数が少なくて済む場合が多いので、「書いた関数の意図=定義をはっきりさせておく」ことができていればデバッグしやすい。
一度でも再帰が使いやすい言語を触れば、そういう思考が身につくからおすすめよ。
大学一年の授業でCを一通り触ったけど、再帰を使って文字列を反転させる関数を作れって課題が一番苦労した。
関数をN88BASICのgosub程度のものと認識していたから。
0354デフォルトの名無しさん
2015/09/13(日) 10:32:14.78ID:HkNeW234なにがどう大変なんだ?
0355デフォルトの名無しさん
2015/09/13(日) 12:05:47.25ID:FXWhlvqs> そんなときにfor文を変態的に書いてると、何が変動しているのかすごく読みづらい。
> じゃあ再帰ならどうかというと、変動する値の数が少なくて済む場合が多いので、「書いた関数の意図=定義をはっきりさせておく」ことができていればデバッグしやすい。
うん、そういう都合のいい状態になるかもしれないって話じゃなくて、
具体的にどれがどうなるってコードで書いてね。
そんな机上の空論でいいなら、こういういいかも出来る
そんなときに再帰を変態的に書いてると、何が変動しているのかすごく読みづらい。
じゃあループならどうかというと、変動する値の数が少なくて済む場合が多いので、
「書いた関数の意図=定義をはっきりさせておく」ことができていればデバッグしやすい。
0356NAS6 ◆n3AmnVhjwc
2015/09/13(日) 12:17:20.26ID:7TlExPBBこういう処理は再帰関数で書くから簡単なんよ
>>355
これを、for,while文のみで変態的に書こうとすれば分かる
0357NAS6 ◆n3AmnVhjwc
2015/09/13(日) 12:21:22.71ID:7TlExPBB0358デフォルトの名無しさん
2015/09/13(日) 12:50:26.20ID:FXWhlvqsじゃあ書いてみてよ。
0359デフォルトの名無しさん
2015/09/13(日) 14:15:06.57ID:GjhOqSyKそれは俺も思った。
でもJavaには参照渡しがないんよ。
参照渡しがないんよ・・・。・゚゚・( ̄┏Д┓ ̄°*) ・゚゚・。ウワァーン!!
0360NAS6 ◆n3AmnVhjwc
2015/09/13(日) 14:27:14.42ID:7TlExPBB変態プレイしたよ
push&popの呼び出し回数にバグがあるかもしれないけど、適当に処理
ttp://nas6.main.jp/Maze.cpp
こういう処理は再帰関数で書くから簡単なんよ
0361デフォルトの名無しさん
2015/09/13(日) 14:31:36.71ID:gO4R7dxdループで書いたほうが簡単である。
0362デフォルトの名無しさん
2015/09/13(日) 14:44:46.25ID:tgyUuDYt0363NAS6 ◆n3AmnVhjwc
2015/09/13(日) 14:50:56.62ID:7TlExPBBこういう処理は再帰関数で書くから簡単なんよ
ループで書くなんて変態の所業だろ
0364NAS6 ◆n3AmnVhjwc
2015/09/13(日) 15:02:43.78ID:7TlExPBB要素数1個のArray渡しでもダメかいな?
javascriptならそれでいける
0365デフォルトの名無しさん
2015/09/13(日) 15:04:19.09ID:GjhOqSyKその手があったか!やってみる。
0366デフォルトの名無しさん
2015/09/13(日) 22:57:51.88ID:GjhOqSyK再帰厨にこの美しさを知らしめたい。
https://ideone.com/v5Hpu3
0367デフォルトの名無しさん
2015/09/14(月) 00:19:43.46ID:2FOdhJSRhttps://ideone.com/u2Duto
0368デフォルトの名無しさん
2015/09/14(月) 08:42:14.11ID:LwtcihzFこれ以上は小さくできんかった。
Function kaijou(i As Integer)
If i > 0 Then
kaijou = i * kaijou(i - 1)
Else
kaijou = 1
End If
End Function
0369デフォルトの名無しさん
2015/09/14(月) 08:42:55.90ID:LwtcihzF0370デフォルトの名無しさん
2015/09/14(月) 13:30:03.59ID:J7e/aRM8repeat.
repeat :- repeat.
0371NAS6 ◆n3AmnVhjwc
2015/09/16(水) 01:45:49.63ID:EoOMwHRt0372デフォルトの名無しさん
2015/09/16(水) 13:14:37.41ID:Yi1XoKvB0373デフォルトの名無しさん
2015/09/19(土) 22:53:42.55ID:nOc0JnqK世間から必要とされる実用的で効率の良いプログラムを作る
価値も楽しさも。
0374デフォルトの名無しさん
2015/09/20(日) 00:12:47.22ID:OIlsmt2v0375デフォルトの名無しさん
2015/09/20(日) 01:43:57.29ID:CGft01aP0376デフォルトの名無しさん
2015/09/20(日) 01:50:51.03ID:rgkzBDjOの一言で終わりじゃんw
0377デフォルトの名無しさん
2015/09/20(日) 02:35:53.12ID:CGft01aP0378デフォルトの名無しさん
2015/09/20(日) 06:09:24.51ID:Bz5O5e3E再帰が使われていれば必ずクラックできるとインタビューで答えているね。
0379デフォルトの名無しさん
2015/09/20(日) 13:51:23.28ID:Itn3Bpzp再帰に向いてない言語を使ってるだけ。
0380デフォルトの名無しさん
2015/09/20(日) 14:41:02.55ID:GD4n9rcLブラクラミングだからな
0381デフォルトの名無しさん
2015/09/20(日) 15:06:29.20ID:R4crCUp/.NETもJavaも末尾再帰に対応していないけれども
配列のソートで再帰使ってるよ。
そして.NET、Javaっていうのはサーバーアプリケーションの2大巨頭でしょうに。
つまり現代のワールドワイドウェブは根幹のところで再帰に支えられている
と言っても過言だけれども、再帰は使われてるよってこと。
0382デフォルトの名無しさん
2015/09/20(日) 15:07:51.36ID:rgkzBDjOつぎにこのような形は、ループに置き換えられ
このような形を末尾再帰という。
という教え方ではなく、
ループを教えて、再帰を教えて、そのあとループを
再帰に変換するって教え方をした方がいいと思う
ループを再帰に置き換えた場合、必ず最後が再起になります。
言い換えると再帰が最後に来ているならばループに戻せます。
このような形を末尾再帰といいます。の方がわかりやすいだろう。
0383デフォルトの名無しさん
2015/09/20(日) 15:35:27.38ID:UYQtClXz再帰は小学生の特権。
0384デフォルトの名無しさん
2015/09/20(日) 15:54:20.24ID:GD4n9rcLそういう話じゃないんだけどな
0385デフォルトの名無しさん
2015/09/20(日) 16:06:33.27ID:R4crCUp/そういう話じゃないんならいいけど!(激憤
0386デフォルトの名無しさん
2015/09/20(日) 20:20:46.45ID:OIlsmt2vありがとう。本当に知らなかったよ。
0387デフォルトの名無しさん
2015/09/20(日) 21:08:28.82ID:EJwEUTt+0388デフォルトの名無しさん
2015/09/20(日) 21:30:23.42ID:O1hk5Gs7これが再帰キティ害の実態
0389デフォルトの名無しさん
2015/09/21(月) 00:03:43.04ID:t3MYcY7u0390デフォルトの名無しさん
2015/09/21(月) 08:24:32.58ID:AvH9NL1l0391デフォルトの名無しさん
2015/09/21(月) 09:23:20.04ID:nq+a0xUl0392デフォルトの名無しさん
2015/09/21(月) 12:48:44.00ID:jBswvkFGしかし、すべてのセキュリティ勧告が最大のレベルで再帰を禁止するよう求めています。
0393デフォルトの名無しさん
2015/09/21(月) 14:32:17.75ID:vwg3dHwd使ったらアウトだし
0394デフォルトの名無しさん
2015/09/21(月) 15:05:13.13ID:az+bvJoo0395デフォルトの名無しさん
2015/09/21(月) 15:52:19.89ID:AvH9NL1lおまいには、そんなお遊び程度の糞仕事しか来ないのさ。
0396デフォルトの名無しさん
2015/09/21(月) 17:17:54.42ID:nq+a0xUl0397デフォルトの名無しさん
2015/09/21(月) 17:19:12.30ID:LDPsAMjFScala、F#、最近のプログラム言語で再帰を使うものはない
はっきり言って皆無
0398デフォルトの名無しさん
2015/09/22(火) 06:48:04.84ID:1T+ro0sI「最近の」というところが微妙だね。
0399デフォルトの名無しさん
2015/09/22(火) 10:27:26.06ID:0aRWP60N0400デフォルトの名無しさん
2015/09/22(火) 12:30:58.96ID:RO+5mJEZ0401デフォルトの名無しさん
2015/09/22(火) 12:55:00.11ID:eWYbhdNwバカかお前、IQ低いにも程があるだろ。1.5くらいか?お前のIQ。
関数型言語の関数とは同じ値を入力したときに同じが値が出力される
いわば関数の外側から見た時の性質をもつものだ。
関数の中でループを使ってようが破壊的代入を行っていようが関係ない。
黒髪美少女が複数の男とやりまくっていようがそれがわからなければ
処女確定だろうが。
0402デフォルトの名無しさん
2015/09/22(火) 16:09:36.14ID:1T+ro0sIrepeat.
repeat :- repeat.
0403デフォルトの名無しさん
2015/09/23(水) 02:17:16.00ID:BDFWxIBDデバッグが地獄だったぞ
実装も大変、効率も悪い、再帰は本当に役立たずだってのを再認識した
https://ideone.com/EF4DtY
0404デフォルトの名無しさん
2015/09/23(水) 05:57:39.95ID:PxUgQ2Q9?- repeat,get_char(X),put_char(X),X='\n'.
0405デフォルトの名無しさん
2015/09/23(水) 08:36:10.12ID:DOrhv1Zg> 実装も大変、効率も悪い、再帰は本当に役立たずだってのを再認識した
「バカには」が抜けてるぞ
0406デフォルトの名無しさん
2015/09/23(水) 08:37:55.05ID:MS/FHj7O追加しました。
実装も大バカには変、効率も悪い、再帰は本当に役立たずだってのを再認識した
0407デフォルトの名無しさん
2015/09/23(水) 08:42:01.36ID:EmAxT3Dgソートに再帰は厳禁。
効率悪過ぎ、全然クイックにならないどころか途中でダウン。
再帰が実用の役に立たつなどど考えちゃダメ。
0408デフォルトの名無しさん
2015/09/23(水) 08:54:46.81ID:PxUgQ2Q9member(A,[A|_]).
member(A,[_|R]) :- member(A,R).
0409デフォルトの名無しさん
2015/09/23(水) 12:38:35.82ID:sQaWw2xG効率だけ求めるならアセンブラ使っとけばいいんだよ
0410デフォルトの名無しさん
2015/09/23(水) 12:49:52.68ID:h471bGUzじゃあてめえがJavaで不変オブジェクトと再帰を使って
クイックソート実装してみろや。できなかったらお前が
バカだってことだろうが。俺が天才だってことだろうが。
再帰が役立たずってことだろうが。再帰はお前の能力によって
結論付けられるってことだろうが。やってみろや。はい論破。
0411デフォルトの名無しさん
2015/09/23(水) 12:54:13.21ID:DOrhv1Zg> じゃあてめえがJavaで不変オブジェクトと再帰を使って
ワケわからん条件つけて勝ち誇るバカ乙 w
0412デフォルトの名無しさん
2015/09/23(水) 13:18:15.54ID:h471bGUzあれww言い訳して逃げたwwwできないってことな?
できないのな?はい論破完了。
0413デフォルトの名無しさん
2015/09/23(水) 13:21:06.91ID:h471bGUz今日の空気はとてもおいしい。青森の故郷に帰って来たかのようだ。
あああ、あー、津軽海峡秋げしきいいいい
0414デフォルトの名無しさん
2015/09/23(水) 13:23:39.85ID:DOrhv1Zgはい論破 ってか w
0415デフォルトの名無しさん
2015/09/23(水) 13:24:13.04ID:PxUgQ2Q9昇順検査([]).
昇順検査([_]).
昇順検査([A,B|R]) :- A @=< B,昇順検査([B|R]).
0416デフォルトの名無しさん
2015/09/23(水) 13:35:53.62ID:h471bGUz他人にいちゃもんつけることしかできない穀潰し。はい論破。
0417デフォルトの名無しさん
2015/09/23(水) 13:39:21.23ID:PxUgQ2Q9select(A,L,R) :-
append(L1,[A|L2],L),
append(L1,L2,R).
append([],L,L).
append([A|R1],L,[A|R3]) :- append(R1,L,R3).
?- select(3,[1,2,3,4,5],R).
R = [1,2,4,5].
?- select(X,[1,2,3,4,5],R),0 is X mod 2.
X = 2, R = [1,3,4,5];
X = 4, R = [1,2,3,5];
false.
0418デフォルトの名無しさん
2015/09/23(水) 14:43:22.01ID:DOrhv1Zg>>411
はい、ループ
再帰使うまでもなかったな w
0419デフォルトの名無しさん
2015/09/23(水) 15:02:09.10ID:h471bGUzお前マジで無能だな。田んぼの中に突っ立ってるカカシでもお前より立派な思考してるだろ。
条件が不服ならば、俺はこういう条件でこうするっていうのを提示するべきなのだよ。
いつまでも相手の論理に捕らわれてそこから抜け出せずにいるお前は雑魚の中の雑魚。
道は自らの創造力によって切り開くべきなのだよ。それこそが人間力だ。
人間力においても再帰力においてもお前は俺の足の裏にも及ばない。俺の草履の下のダンゴムシ。はい論破。
0420デフォルトの名無しさん
2015/09/23(水) 16:25:47.80ID:DOrhv1Zg長文書く奴ってもれなく低能の法則 w
0421デフォルトの名無しさん
2015/09/23(水) 19:15:22.50ID:PxUgQ2Q9昇順検査(L) :- forall(append(_,[A,B|_],L),A @=< B).
0422デフォルトの名無しさん
2015/09/23(水) 19:15:56.50ID:OG7e8mvp0423デフォルトの名無しさん
2015/09/23(水) 19:44:43.29ID:PxUgQ2Q9スタックは全く伸びません。forall()の中は繰り返しに近いですね。
その中に再帰定義のappendがあるところがこのスレ的には面白いかと。
0424デフォルトの名無しさん
2015/09/23(水) 20:01:13.77ID:PxUgQ2Q9実はこれが連続したn要素だとこの記法では表現できません。それで
以下で、1要素多いappendの定義が可能になるので、
append([],L2,L3,L4) :- append(L2,L3,L4).
append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4).
リストの連続したn要素を取り出す(L,_n,_連続したn要素) :-
length(_連続したn要素,_n),
append(_,_連続したn要素,_,L).
?- リストの連続したn要素を取り出す([1,2,3,4,5,6],4,X).
X = [1,2,3,4];
X = [2,3,4,5];
X = [3,4,5,6];
false.
となります。lengthは_n要素のリスト(ただし要素は一応変数)を生成しています。
0425デフォルトの名無しさん
2015/09/23(水) 20:35:34.76ID:PxUgQ2Q9スタックはインタプリタによる動的な末尾再帰最適化や匿名変数が
使われていることもあり伸びませんが、Lと合計してほぼ同じ要素数になる
二つのリストがスタック上にpop/pushを繰り返しながら存在するという
ことになりますね。
0426デフォルトの名無しさん
2015/09/23(水) 21:03:03.94ID:PxUgQ2Q9?- append(L1,L2,L3).
L1 = [],
L2 = L3 ;
L1 = [_G1135],
L3 = [_G1135|L2] ;
L1 = [_G1135, _G1141],
L3 = [_G1135, _G1141|L2] ;
という具合に解として戻してくリストは長くなっていきます。20-30秒も
放っておくと、スタックオーバーフローになる。しかしこれは、制御の
為のスタックが伸びてオーバーフローしたのではありません。
L1のL3のリスト要素がどんどん増えていって、何百万あるいは何千万となり、
現在の規定されたスタックサイズを越えてしまうからです。
リストサイズが大きくなりすぎることによるオーバーフローです。
0427デフォルトの名無しさん
2015/09/23(水) 21:09:37.26ID:PxUgQ2Q9?- append(L1,L2,L3),fail.
として、放っておくと、スタックオーバーフローになるということです。
0428デフォルトの名無しさん
2015/09/25(金) 03:16:10.44ID:cJmaZWu4プログラミング始めた頃
俺も再帰で処理するのに一時期ハマったわ
(C言語)
でも、再帰処理を考えるには、ある程度、発想能力がいるから
もうオジサンには、その発想能力は無くなってきてるね〜
昔書いたコード見て、「俺、スゲー」って思うし
今はAndoroidアプリ制作で、javaだし
再帰する必要なコードも書かなくなったな〜
0429デフォルトの名無しさん
2015/09/25(金) 08:25:04.35ID:LUM6jbYOそんなものはない。
0430デフォルトの名無しさん
2015/09/25(金) 08:37:22.14ID:HQytNSWHバカには無理
0431デフォルトの名無しさん
2015/09/25(金) 10:37:41.00ID:gAqqsE90append([U|X],Y,[U|Z]) :- append(X,Y,Z).
% の引数順序を逆にした上で-,=オペレータを使って一つの複合項に仕立てる
% そして述語名もappendから差分に変更した
差分(Y-Y=[]). % L-L=[] である
差分([U|Z]-Y=[U|X]) :- % [U|Z]-Y=[U|X] も差分関係にある
差分(Z-Y=X). % Z-Y=X が差分関係にあるならば
?- 差分([a,b,c]-Y=X).
Y=[a,b,c], X=[];
Y=[b,c], X=[a];
Y=[c], X=[a,b];
Y=[], X=[a,b,c];
false.
% append/3の非決定性の使用は、実はリストの差分を求めている。
0432デフォルトの名無しさん
2015/09/25(金) 10:53:59.59ID:gAqqsE90% 差分(Y-Y=[]). % L-L=[] である
% ではなくて、
差分(Y-Y=[]). % Y-Y=[] である
0433デフォルトの名無しさん
2015/09/27(日) 00:43:43.32ID:0R68gjtE>昔書いたコード見て、「俺、スゲー」って思うし
俺も経験あるが、思い出しても怖い。劣化したら技術者ダメじゃん
0434デフォルトの名無しさん
2015/09/27(日) 01:09:31.15ID:LVhR5CmY0435デフォルトの名無しさん
2015/09/27(日) 09:04:11.92ID:ZTh9Iyfxなんで昔なんだよ。
今をスゲーにするだよ。
0436デフォルトの名無しさん
2015/09/30(水) 23:35:44.07ID:aEcL3JaV↑ ↑ ↑ ↑ ↑ ↑
0437デフォルトの名無しさん
2015/10/03(土) 07:11:32.66ID:rEIL6Sf6もしかして: recursion
って言われるんだが?
もしかしてもなにもrecursionって言ってるやん
0438デフォルトの名無しさん
2015/10/03(土) 07:31:51.83ID:Kfl+WA+xGoogleのシャレだよ
0439デフォルトの名無しさん
2015/10/03(土) 16:41:46.77ID:qGJGpmFi「もしかしてrecursion?」
「そう、recursionさがして」
「もしかしてrecursion?」
「そう、recursionさがして」
「もしかしてrecursion?」
本当だ、消えねえwwww
0440デフォルトの名無しさん
2015/10/03(土) 18:27:00.09ID:HBjtBhRSふざけすぎ。
0441デフォルトの名無しさん
2015/10/04(日) 11:06:21.34ID:mA6x78tEというか再帰的な構造を持つデータで使える
ただし、深さを決めないとスタックがあふれる
操作用のイレテータを用意するのがベター
循環取引は違法だろ
C言語でif,for,while,switch,goto使わずにreturn文のみでクイックソート書いたのがいい思い出だ
凡人は言いたいことの結論だけ言える
知能が高い人は、考えていることが多くて言語化するのに苦労して長くなる
Googleのセンスをふざけと感じるのはプログラマ
ユーモアと感じるのはハッカー
0442デフォルトの名無しさん
2015/10/04(日) 14:24:08.76ID:DfhDLCypおいおい、プログラマとハッカーしかいないのかよ
Google利用者は。
0443デフォルトの名無しさん
2015/10/04(日) 14:57:44.63ID:6IJowW7E>C言語でif,for,while,switch,goto使わずにreturn文のみでクイックソート書いたのがいい思い出だ
教えてくださいお願いします
https://ideone.com/
0444デフォルトの名無しさん
2015/10/05(月) 13:58:58.23ID:qvYL9M4d何百万件ものデータをソートさせる必要があり、サクッとソートできて良かったのだが
ソート処理をVCのDLLで作れば何も苦労しなくてよかった。
0445デフォルトの名無しさん
2015/10/08(木) 18:14:42.18ID:JXrgrf9S縺薙%縺槭→縺縺�凾縺ォ蜀榊クー菴ソ縺�・エ竊呈怏閭ス
窶サ菴�@縺薙%縺槭→縺縺�凾縺梧擂縺ェ縺
0446デフォルトの名無しさん
2015/10/08(木) 18:22:08.83ID:JXrgrf9Sすまんスマホでレスしたら文字化けした
言いたかったのは再起処理は使い分けさえ出来たら有能ってこと
0447デフォルトの名無しさん
2015/10/09(金) 08:17:11.24ID:pYmkGjUw非効率でシステム上の問題となるものは回避する。
0448デフォルトの名無しさん
2015/10/09(金) 12:07:04.89ID:HyPDrwp20449デフォルトの名無しさん
2015/10/09(金) 12:17:44.00ID:3gjlJhdsだからこそ、末尾再帰という最適化が考えだされたんだよ。
最適化してループに変換しなければ、非効率だってこと。
末尾再帰は特殊なパターンでしか使えないしな。
0450デフォルトの名無しさん
2015/10/09(金) 15:12:31.82ID:pYmkGjUw全てのプログラマが注意すべき、極めて重要な事項。
再帰関数で最も重要な事項は、使ってはいけないということ。
これが理解できない限り、プログラムの仕事はしちゃだめ。
0451デフォルトの名無しさん
2015/10/09(金) 16:10:29.05ID:HyPDrwp2> 関数呼び出しとスタックのコスト。
おじいちゃんが現役だったころは、そうだったかもね。
今はenter/leaveというようなスタックフレーム専用命令があるから、
繰り返しに比して大きなペナルティは発生しないんだよ。老害死ね。
末尾再帰でないならば、状態を保存しなきゃならないのは繰り返しも同じ、
ハードウェアスタックより、Cで記述したLIFOの方が非効率なのは自明。
0452デフォルトの名無しさん
2015/10/09(金) 18:06:31.18ID:zXylNyAdVMとかインタプリタ動作なら結構痛いよ。
CPUの投機的実行にも不利そう
0453デフォルトの名無しさん
2015/10/09(金) 20:33:58.07ID:ELEmlsjj大抵の場面では再優先
0454デフォルトの名無しさん
2015/10/09(金) 21:24:18.40ID:4cEJzv4Cgo to statement considered harmfulを真に受けてる人間と同類ですね
0455デフォルトの名無しさん
2015/10/10(土) 00:37:41.69ID:0j5/IHaMでも結局遅いんでしょう?
専用の命令がなければ遅いわけだし、
あったとしても大きなペナルティが発生しないだけで
小さなペナルティが発生する。
0456デフォルトの名無しさん
2015/10/10(土) 01:54:15.73ID:Qbqq0vz3遅いかどうかなんて現代のプログラミング言語ではさほど重要ではない
重要なのは書きやすさ、読みやすさ
再帰はその点で優れているから使われる
0457デフォルトの名無しさん
2015/10/10(土) 02:02:13.89ID:0j5/IHaMループでかける所はループで書いたほうが
書きやすさ読みやすさともに優れてるよ。
0458デフォルトの名無しさん
2015/10/10(土) 02:11:07.52ID:Qbqq0vz3問題をより小さな問題に帰着させた方がいいと思う数学的素養がない人にとってはそうなのかもね
0459デフォルトの名無しさん
2015/10/10(土) 02:15:47.39ID:0j5/IHaM誰にでもわかる = 簡単
シンプルイズベスト
0460デフォルトの名無しさん
2015/10/10(土) 02:17:43.81ID:Qbqq0vz3それは問題が単純な場合だけ
複雑になってくると問題をより小さい問題に置き換えることが理解を助けるのは
数学の世界が示していること
0461デフォルトの名無しさん
2015/10/10(土) 02:19:30.28ID:Fr2WC1wz関数型のご本をお読みになられてこじらせてしまったのかな?
0462デフォルトの名無しさん
2015/10/10(土) 02:20:13.28ID:Fr2WC1wz0463デフォルトの名無しさん
2015/10/10(土) 02:21:36.62ID:Fr2WC1wz再帰をつきつめるとループにたどり着く
0464デフォルトの名無しさん
2015/10/10(土) 02:22:36.94ID:Qbqq0vz3プログラミングは数学の基盤があって発達してきたという歴史を無視なさるので?
業界ではスーパー有名人であるチューリング大先生だって数学者だぞ?
0465デフォルトの名無しさん
2015/10/10(土) 02:24:37.48ID:Qbqq0vz3再帰とループは置き換え可能だから当たり前の話じゃん
分かりやすいのは再帰の方だよ
問題を小さい問題に分割して解くという理にかなった方法だからね
0466デフォルトの名無しさん
2015/10/10(土) 02:28:37.46ID:Fr2WC1wz歴史を知らなくてもプログラムは書ける。
むしろ歴史を知らなかったらわからないプログラムはただのクソ。
>>465
ループより細かく分割したところでわかりやすくはならない。
なんでもかんでもわければいいってもんじゃない。
バブルソート書けば一発でわかる。
0467デフォルトの名無しさん
2015/10/10(土) 02:30:39.47ID:Fr2WC1wzチン毛生えたてレベル
言うなればチン毛生えたてレベル
マン毛でも良い
どっちでもいい
言うなれば陰毛ってこと
デリケートヘア
0468デフォルトの名無しさん
2015/10/10(土) 02:30:49.62ID:Qbqq0vz3なるよ
問題は小さければ人間は理解しやすいのは自明の話だからね
ループは効率を求めるところにだけ使えばいい
0469デフォルトの名無しさん
2015/10/10(土) 04:18:50.77ID:0j5/IHaM> それは問題が単純な場合だけ
だから言ってるだろ?
問題が単純な場合=ループでかける所はループで書いたほうが
書きやすさ読みやすさともに優れてるよ。
0470デフォルトの名無しさん
2015/10/10(土) 04:39:02.47ID:WQItE+Ndパターンマッチあるなら再帰のが読みやすいだろうし
0471デフォルトの名無しさん
2015/10/10(土) 05:37:19.92ID:0j5/IHaM簡単とはいえんなぁw
0472デフォルトの名無しさん
2015/10/10(土) 08:08:07.98ID:rvoYQvdT再帰を回避するのは当然に必要。
プログラマの義務。
0473デフォルトの名無しさん
2015/10/10(土) 11:45:37.26ID:G5YulYPeそのまま通用しそうな無内容な罵り合いだな
0474デフォルトの名無しさん
2015/10/10(土) 12:51:41.87ID:wZWPBuKi現実には適材適所という物があります
再帰を使うかループを使うか、どちらの方がわかりやすいかはデータ構造によるところが大きいです
プログラミングで一番使われるデータ構造である配列や文字列の操作には
ループが適しています
つまり、今後ともループが無くなることはありません!
0475デフォルトの名無しさん
2015/10/10(土) 14:05:29.94ID:MTAKB3YA必ず主語に「俺が」とつく。
0476デフォルトの名無しさん
2015/10/10(土) 17:14:55.71ID:mivhNHU50477デフォルトの名無しさん
2015/10/10(土) 17:26:33.27ID:rvoYQvdT使ってはダメなんだって理解しなくちゃね。
0478デフォルトの名無しさん
2015/10/10(土) 17:28:40.31ID:e9OvRw0Mつーか、そもそも再帰が好きってなんだよ
再帰が好きだから全部再帰で書きました!
とかマジでやってんの?w
0479デフォルトの名無しさん
2015/10/10(土) 19:06:17.06ID:B1uEHKqzアホウ。Cの最適化処理でインラインが有効なのは、分岐を抑制できるからだ。
繰り返しでも分岐は必須。
「再帰は繰り返しに比べて非効率」これはジジイの戯言
0480デフォルトの名無しさん
2015/10/10(土) 19:17:59.39ID:0j5/IHaMそんな話してない。
0481デフォルトの名無しさん
2015/10/11(日) 16:26:43.06ID:O6JczGGmそんな話じゃなけりゃ、お前が言うところの再帰関数のペナルティってなんだよ。
説明してみ。出来るなら。
0482デフォルトの名無しさん
2015/10/11(日) 17:22:10.42ID:XJEeMP8F> 今はenter/leaveというようなスタックフレーム専用命令があるから、
> 繰り返しに比して大きなペナルティは発生しないんだよ。老害死ね。
大きなペナルティは発生しない = 小さなペナルティが発生する。
0483デフォルトの名無しさん
2015/10/11(日) 19:47:01.96ID:rOpHYcHiデータ実行防止、ASLRなど私たちは存続を脅かされ続けてきました。
私たちの命の灯を消さないためにも、どうか再帰に清き一票を。
0484デフォルトの名無しさん
2015/10/11(日) 21:20:26.45ID:4YnBM/aD私は映画館に行きませんでした = 私以外は映画館に行きました ?
非論理的じゃないかな
0485デフォルトの名無しさん
2015/10/11(日) 21:34:23.66ID:wb7dhvryあくまで趣味でどうぞ。
0486デフォルトの名無しさん
2015/10/11(日) 21:44:38.52ID:4YnBM/aD深刻な問題点とは何かね?
処理速度は大して問題にならない。
0487デフォルトの名無しさん
2015/10/12(月) 01:55:31.10ID:08WVOaLvクラッシュ前に捕まえられれば対処できるが
0488デフォルトの名無しさん
2015/10/12(月) 03:48:32.56ID:53GvI8rG屁理屈ですか?w
非論理的ですね。
0489デフォルトの名無しさん
2015/10/12(月) 06:45:27.24ID:bZxqtO6M> 処理する情報が間違っていると無限ループに陥りやすい。
ループでも同じだろ…
0490デフォルトの名無しさん
2015/10/12(月) 07:07:15.35ID:08WVOaLvループでクラッシュするような組み方があるのか?
0491デフォルトの名無しさん
2015/10/12(月) 07:25:38.89ID:iier02gv普通に無限ループに陥ったり配列範囲外を触ってしまったりループ変数を変えてしまったり‥
普通にループでクラッシュするよね
0492デフォルトの名無しさん
2015/10/12(月) 07:54:26.31ID:53GvI8rG再帰はバグがなくてもスタックオーバーフローで死ぬ
0493デフォルトの名無しさん
2015/10/12(月) 08:24:49.15ID:tOh4yiU5もうね。再帰を使うなんてありえんね。
システムダウンさせたいのかと。
0494デフォルトの名無しさん
2015/10/12(月) 08:40:56.88ID:bZxqtO6M0495デフォルトの名無しさん
2015/10/12(月) 08:48:03.52ID:53GvI8rG0496デフォルトの名無しさん
2015/10/12(月) 08:49:00.15ID:tOh4yiU50497デフォルトの名無しさん
2015/10/12(月) 09:01:39.37ID:gvhM2OV1> 再帰はバグがなくてもスタックオーバーフローで死ぬ
これも含めてバグだと思うけどね。
"再帰の深さ数えといて明らかに異常なときは"的な処理を入れとけばいいんじゃね?
0498デフォルトの名無しさん
2015/10/12(月) 09:12:26.32ID:53GvI8rGいや、それがスタックオーバーフロー例外だろw
スタックオーバーフロー例外よりも前に
新たにスタックオーバーフローのちょっと前だよ例外を作れっていうのか?
何の意味があるんだかw
0499デフォルトの名無しさん
2015/10/12(月) 09:22:45.43ID:5OGIyOb6それは俺も思う。無限ループでCPU100%応答なしで強制終了するしかなくなるよりも
例外投げてくれた方がよほど処理しやすい。例外は捕まえて回復可能だけれども
応答しなくなったら回復不能。安全のために再帰を選択するってのもありだと思う。
0500デフォルトの名無しさん
2015/10/12(月) 09:24:06.74ID:53GvI8rG落ちるのが再帰。
0501デフォルトの名無しさん
2015/10/12(月) 09:24:49.72ID:5OGIyOb6スタックがオーバーフローすると処理を継続できなくなるようなことってなかったっけ?
そういうときにオーバーフローする前にセーフティで例外投げるのは全然ありでしょ。
0502デフォルトの名無しさん
2015/10/12(月) 09:30:43.28ID:5OGIyOb6それはロジックを見なおすべきかと。
無限ループであっても現実的にはこれくらいしか回らないだろうって
いう見積があるわけで、再帰を使うのであれば見積もり通りなら
スタックオーバーフローにならないだろうってところで使うべきでしょ。
スタックオーバーフローになるロジックを書いてスタックオーバーフローになりました。
再帰は使えません、っていうのじゃあ自作自演だよね。室内でオイルライター使って
お部屋丸焼きにするおじさんとやってること変わらないよね。ループ厨は丸焼きおじさんだよね。
0503デフォルトの名無しさん
2015/10/12(月) 09:36:43.89ID:tOh4yiU5発生することが異常。
再帰のオーバーフローは、意図的に注意しないと発生するエラー
再帰それ自体を忌避すべき。
結論
丸焼きおじさんは再帰厨
0504デフォルトの名無しさん
2015/10/12(月) 09:40:02.48ID:bZxqtO6Mまともなソフト作ったことないのか?
スタックオーバーフロー例外起きた時はスタック使い果たしてるからメッセージ表示とかもまともにできなくなる
なので事前に限界値決めておいて、それを越えたら自前でエラ一処理するのはあたり前
0505デフォルトの名無しさん
2015/10/12(月) 09:41:15.84ID:5OGIyOb6無限ループはロジックのバグとしてあるよ。
どこだったかな、昔どっかで見た覚えがあるんだけど
ニコニコ動画か、はてなだったかと思うんだけど
whileで無限ループ作って条件を指定してループから
抜けだすっていうふうに書いていたんだけど、条件が
満たされないケースがあってサービス不能に落ちいった。
これは失敗だった。forでループの上限を書くべきだったって
いう内容だったんだよね。再帰を使えばそういうの意識できるし、
例外を捕まえればサービスの回復も図れるのさ。
0506デフォルトの名無しさん
2015/10/12(月) 09:42:28.60ID:tOh4yiU5本来の目的とするコードに直せば問題なし。
再帰のオーバーフローは、それを回避するための処理を組み込む必要があり
新たに特別な問題回避のためのコードが必要になる。
つまり再帰を採用していること自体が問題だ。
0507デフォルトの名無しさん
2015/10/12(月) 09:47:27.38ID:5OGIyOb6無限ループはロジックの修正で回避できます。
再帰のオーバーフローもロジックの修正で回避できます。
やることは変わらないと思うけどなあ。
むしろ再帰を使えば再帰呼出しの回数を意識する分、ロジックは洗練されそう。
バブルソートで延々処理を待つよりも、マージソートでさっさと終わらせちゃった
方が良いでしょ。ロジックを見直すって大事なこと。
0508デフォルトの名無しさん
2015/10/12(月) 09:55:34.70ID:gvhM2OV1> 無限ループは、元々正しくないコードなので
> 本来の目的とするコードに直せば問題なし。
元々正しいコードであってもスタック足りなくなるような処理に、
再帰を使うべきでないというのは俺も同意見だが。
0509デフォルトの名無しさん
2015/10/12(月) 09:58:25.02ID:5OGIyOb6理屈としてはスタックオーバーフローに達するほどのサブディレクトリが存在する可能性
を否定できないけれども、現実的にはほとんどない。
だから再帰処理で片付けられる。結構こういうことってあると思うんだよな。
再帰を使うことは現実的な落とし所を探る堅実なプログラミング。
0510デフォルトの名無しさん
2015/10/12(月) 10:03:32.03ID:tOh4yiU5そりゃ個人で趣味のプログラムやってるなら許される話。
これが許されるのは、社会的な責任や周囲からの期待がその程度しか無いってこと。
0511デフォルトの名無しさん
2015/10/12(月) 10:09:15.52ID:5OGIyOb6仕事でも十分ありえるよ。
むしろ仕事の方が縛りやすいっしょ。仕様という名の強力な
鎖があるんだから縛っちゃえばいい。このディレクトリの下には
N階層までしか作りません、作っちゃいけませんって決めればいい。
ディレクトリの深さに期待する人なんていないっしょ。いたとしても
そんな一部の変態のためにプログラムを合わせるなんて非現実的、
変態は切り捨てるべきだし、汚物は消毒すべき、現実的な落とし所を探るってそういうこと。
0512デフォルトの名無しさん
2015/10/12(月) 10:11:25.69ID:gvhM2OV1途中に親ディレクトリのリンクが混じってると、
無限ループになったり、スタック足りなくなったりする可能性あるけど、
それを含めてバグであって、
そのようなバグを回避手段を用意することにおいて本質的な違いは無いと思う。
後、会社の中でとか限られた状況で
再帰禁止
とかローカルルールを設定することに何も反論はないし、
そうした方がいい環境やケースもあるだろう。
ただ、掲示板のような不特定多数に向けて
再帰はダメ
見たいな論調はどうかと。
0513デフォルトの名無しさん
2015/10/12(月) 10:14:44.15ID:Zs0Sx/Kf1回の関数呼び出しで最低336バイト消費するのはデカいと思う。
0514デフォルトの名無しさん
2015/10/12(月) 10:15:37.57ID:TmBI5HmZ再帰関数は私たちスカイネットから見て検出しやすいです。
同じアドレスに繰り返しエンターし、エントリーポイントから見て常に同じ位置に
リターンアドレスが存在します。
私たちは再帰関数を発見すると小躍りします。
ちょっとしたボーナスです。
どこをどう弄れば子孫を増やせるかはっきりしているからです。
0515デフォルトの名無しさん
2015/10/12(月) 10:22:02.92ID:5OGIyOb6データの不整合で無限ループになることもあるよね。
木構造で顧客管理するシステムで入力ミスって無限再帰で
スタックオーバーフローにしたことあるわー、月一回の締め処理で発覚したわー、
ユーザからまだ処理終わらないんですかと催促来て、必死こいてデータチェックしたわ−。
0516デフォルトの名無しさん
2015/10/12(月) 10:42:47.77ID:53GvI8rGそれを修正すればいいんですよ。
再帰の場合、データの問題がなくてもバグが無くても
つまりプログラムに問題がなくても
スタックオーバーフローが起こりえるから問題なのです。
こんなものはテストで検出できません。
0517デフォルトの名無しさん
2015/10/12(月) 10:54:47.80ID:tOh4yiU5再帰には、クラッキング被害の問題まであるわけか。
0518デフォルトの名無しさん
2015/10/12(月) 10:56:58.14ID:5OGIyOb6データにもプログラムにも問題がないなら
ロードテストやストレステストをパスするかでシステムが要件を満たすかはわかるっしょ。
テストで十分カバーできると思うけどなあ。
0519デフォルトの名無しさん
2015/10/12(月) 11:12:28.35ID:7gAEmksP0520デフォルトの名無しさん
2015/10/12(月) 11:12:52.17ID:ZTa/or21現実的にそんなデータ使うことはないだろで済ませるかしてるじゃん
ループと再帰はロジックとしては完全に可換なんだから、見た目分かりやすい方を
使うのが正解だよね
配列みたいに単純なデータ構造ならループ使えばいいし、ツリー構造みたいなのは
再帰使えばいい
0521デフォルトの名無しさん
2015/10/12(月) 11:14:29.94ID:tOh4yiU5こんなこと考える時点でダメ
0522デフォルトの名無しさん
2015/10/12(月) 11:18:44.02ID:ZTa/or21そんなことないよ
上限は?と言われたときに「メモリの許す限りです」なんて仕様はそこかしこに存在してる
ツリー構造のトラバースなんかループ使ったとしてもスタック(≠コールスタック)は必須
なんだし、そういうときの上限としても普通に使われてるよ
0523デフォルトの名無しさん
2015/10/12(月) 11:20:14.31ID:TmBI5HmZアナタとても良い人です。
スカイネット・メイトの称号を与えます。
0524デフォルトの名無しさん
2015/10/12(月) 11:21:32.32ID:tOh4yiU5責任を放棄しているだけ
0525デフォルトの名無しさん
2015/10/12(月) 11:23:39.11ID:ZTa/or21そんなこと言われてもねー実際にあるんだからしょうがない
まぁ、あとは仕様で上限を作っておくかだね
ツリー構造なら256段までしかサポートしませんよ、とかね
0526デフォルトの名無しさん
2015/10/12(月) 11:30:32.65ID:TmBI5HmZまさか各ノードに子ノードの動的配列を格納するような構造にしていませんよね?
そんなことしたら知的障害者だと思われちゃいますよ?
0527デフォルトの名無しさん
2015/10/12(月) 11:44:27.55ID:DSHcQooM>それは俺も思う。無限ループでCPU100%応答なしで強制終了するしかなくなるよりも
>例外投げてくれた方がよほど処理しやすい。例外は捕まえて回復可能だけれども
>応答しなくなったら回復不能。安全のために再帰を選択するってのもありだと思う。
>安全のために再帰を選択するってのもありだと思う。
>安全のために再帰を選択するってのもありだと思う。
0528デフォルトの名無しさん
2015/10/12(月) 12:35:39.78ID:bZxqtO6M> そんなこと言われてもねー実際にあるんだからしょうがない
その仕様をちゃんとテストできてる奴はあまりないでしょ
俺も自分だけとか社内のツールとかならそう言う仕様にすることはある
売りものなら上限を設定する
0529デフォルトの名無しさん
2015/10/12(月) 13:04:27.92ID:gvhM2OV1カレントディレクトリ以下の全てのファイルを全て表示する
スクリプト書くけど、
こういう場合もダメってことなのかね。
再帰使わないで書くとすごく面倒になると思うけど。
#!/bin/csh
set iPath = '.'
if $#argv then
set iPath = $1
endif
foreach iFile(`ls $iPath`)
echo $iPath/$iFile
if -d $iFile then
$0 $iPath/$iFile
endif
end
0530デフォルトの名無しさん
2015/10/12(月) 13:14:33.36ID:gvhM2OV1下記ね
if -d $iPath/$iFile then
0531デフォルトの名無しさん
2015/10/12(月) 13:24:26.04ID:5OGIyOb6そういえばシェルスクリプトっていくら再帰しても
スタックオーバーフローにならないよね。
0532デフォルトの名無しさん
2015/10/12(月) 13:30:16.79ID:TmBI5HmZ0533デフォルトの名無しさん
2015/10/12(月) 13:31:02.08ID:53GvI8rG別プロセスを起動するから、スタック使わないからな。
プログラムでも再帰の代わりに、別exeを呼び出せばいいんじゃね?w
ま、メモリ不足にはなるけどな。
>>529
> カレントディレクトリ以下の全てのファイルを全て表示する
find .
で終わりw
0534デフォルトの名無しさん
2015/10/12(月) 13:33:29.14ID:gvhM2OV1find や tree の実装はきっと再帰になってるよ。
0535デフォルトの名無しさん
2015/10/12(月) 13:35:13.30ID:cGJWI2K1「位置」(希: τόπος)の「学問」(希: λόγος)に由来し、与えられた集合を位相空間とするような開集合に関して研究する。
この分野では連続変形(伸ばしたり曲げたりすることはできるが切ったり貼ったりはしない)によって保たれる空間の性質に関心がもたれる。
位相幾何学的性質において重要なものには、連結性およびコンパクト性などが挙げられる[1]。
https://ja.wikipedia.org/wiki/%E4%BD%8D%E7%9B%B8%E5%B9%BE%E4%BD%95%E5%AD%A6
https://upload.wikimedia.org/wikipedia/commons/d/d9/M%C3%B6bius_strip.jpg https://upload.wikimedia.org/wikipedia/commons/4/46/Trefoil_knot_arb.png https://upload.wikimedia.org/wikipedia/commons/2/26/Mug_and_Torus_morph.gif
0536デフォルトの名無しさん
2015/10/12(月) 13:43:16.47ID:5OGIyOb6シェルスクリプトのいいところは単純な関数呼び出しで
それが実現できてるところだよなあ。
exeを呼ぶっていうのは違うかな。指定した関数を別プロセスで実行するって
いう仕組みが欲しい。
0537デフォルトの名無しさん
2015/10/12(月) 13:45:55.17ID:53GvI8rG> シェルスクリプトのいいところは単純な関数呼び出しで
> それが実現できてるところだよなあ。
単純な関数呼び出しであれば、
hoge() {
・・・
}
hoge
なんだが、関数呼び出しならば、同一プロセスなんだから
スタックオーバーフロー起きるだろうさ。
関数呼び出しと別プログラム呼び出しをごっちゃにしないように。
0538デフォルトの名無しさん
2015/10/12(月) 13:46:29.28ID:53GvI8rG0539デフォルトの名無しさん
2015/10/12(月) 13:47:19.08ID:53GvI8rG0540デフォルトの名無しさん
2015/10/12(月) 13:58:48.22ID:gvhM2OV1そういう意味で >>529 は例としてふさわしくないね。
Cとかで例挙げるとゴチャゴチャした余計なもの書かなきゃならないんで、
再帰使わないと非常にメンドウな挙げたかった
というのが主張の本質と捕らえて欲しい。
後、確証バイアスに陥らないように。
0541デフォルトの名無しさん
2015/10/12(月) 14:03:17.14ID:5OGIyOb6あれ、ホントだ。
8千回くらいでsegmentation faultになった。
なんか勘違いしてた。
0542デフォルトの名無しさん
2015/10/12(月) 14:09:07.84ID:tOh4yiU5予めライブラリを自作するなり用意して、同じものを使いまわすのが普通。
当然、再帰のような問題のあるコードは無しで。
これでエラーの心配の無いプログラミングが簡単に実現できる。
0543デフォルトの名無しさん
2015/10/12(月) 14:11:17.75ID:53GvI8rG0544デフォルトの名無しさん
2015/10/12(月) 14:13:54.65ID:ZTa/or210545デフォルトの名無しさん
2015/10/12(月) 14:24:38.35ID:TmBI5HmZデバッグだ!
0546デフォルトの名無しさん
2015/10/12(月) 14:25:47.82ID:5OGIyOb6segmentation faultにならないようにロジックを修正するべき。
たとえば50%の確率で表を返して50%の確率で裏を返すジャッジメント関数があって
表が出るまでその関数を呼び出すという処理があったとして、8千回も裏が出続けたら
不正でしょ。不正はなかっただなんて言えない状況でしょ。ロジックが間違ってるでしょ。
ループで書いてたらいつまで立っても処理が終わらない状況ですよ。再帰使ってて
良かったねって思える状況ですよ。不正を暴けてよかったって状況ですよ。
君の正義感に訴えたい。
0547デフォルトの名無しさん
2015/10/12(月) 14:27:29.38ID:5OGIyOb6ホントだ、すくなくともtreeは再帰で実装されてた。
0548デフォルトの名無しさん
2015/10/12(月) 14:43:09.05ID:tOh4yiU5バカすぎる。
10回なり20回なり定めて終了させないのか。
再帰でシステムダウンすることが良いことだなんて
脳みそ腐ってる。
0549デフォルトの名無しさん
2015/10/12(月) 14:56:01.97ID:TmBI5HmZ0550デフォルトの名無しさん
2015/10/12(月) 14:57:35.06ID:5OGIyOb6ふむり、10回、20回なら再帰でもスタックオーバーフローにならないだす。
これで心置きなく再帰使えるます。
0551デフォルトの名無しさん
2015/10/12(月) 18:59:45.71ID:m/5m+s3K・末尾再帰はループに展開される可能性がある!
・10回でエラーにすればスタックオーバフローしない!
他なんかある?
0552デフォルトの名無しさん
2015/10/12(月) 19:11:59.33ID:DSHcQooM0553デフォルトの名無しさん
2015/10/12(月) 19:18:59.33ID:tOh4yiU5おい何を読んだんだ?
プロセス起動に置き換えるだと?!
0554デフォルトの名無しさん
2015/10/12(月) 19:46:03.94ID:m/5m+s3Kマシンスタックとヒープでは容量が1000倍違うから、ヒープのデータを
再帰で処理するとスタックオーバーフローする可能性がある。
ヒープのデータをヒープで処理する分には問題が起こらないでしょ。
0555デフォルトの名無しさん
2015/10/12(月) 19:49:36.73ID:DSHcQooM>>552と何の関係が?
0556デフォルトの名無しさん
2015/10/12(月) 21:50:17.39ID:bZxqtO6Mスタックサイズを指定できたり自動拡張する環境はよくあるけど?
0557デフォルトの名無しさん
2015/10/13(火) 00:22:18.22ID:amVZfEJG再帰関数にはちょっと抵抗はあるよね。goto文みたいに
0558デフォルトの名無しさん
2015/10/13(火) 08:34:32.54ID:mlsf+KEjピースの種類数量が変わる時など再帰が有用だなと感じる
数量が変わると何重ループで表現できる?
0559デフォルトの名無しさん
2015/10/13(火) 08:44:52.20ID:Jz1J3KxT軽い高速処理をさせたいならループ
手を抜いてプログラミングするなら再帰
0560デフォルトの名無しさん
2015/10/13(火) 08:47:23.75ID:M4jSjk6v0561デフォルトの名無しさん
2015/10/13(火) 09:03:58.23ID:Itl+5Xbt再帰と言うか関数はループで実装されている
三種類のスタックが無駄なく必要とされているときは再帰
必要とされていないならばループ
ディレクトリ検索とかは2種だから再帰(と言う名前の抽象化)は必要ない
しかしディレクトリ検索中に検索自体の順番性が決定されるならスタックは3種になり再帰になる
0562デフォルトの名無しさん
2015/10/13(火) 13:29:49.61ID:civd2SHU・末尾再帰はループに展開される可能性がある!
・10回でエラーにすればスタックオーバフローしない!
・関数はループで実装されている!
他なんかある?
0563デフォルトの名無しさん
2015/10/13(火) 14:25:56.84ID:WPI+iK8W何これ
0564デフォルトの名無しさん
2015/10/13(火) 14:28:00.19ID:i1awIWf/0565デフォルトの名無しさん
2015/10/13(火) 15:00:27.66ID:Itl+5Xbt実装すればループになる
みたいな
0566デフォルトの名無しさん
2015/10/13(火) 15:15:35.47ID:uNlvC4Lb再帰厨の言い分。
0567デフォルトの名無しさん
2015/10/13(火) 15:20:16.84ID:blKGMcYc0568デフォルトの名無しさん
2015/10/13(火) 16:04:47.35ID:uNlvC4Lbそれどういう事?
0569デフォルトの名無しさん
2015/10/14(水) 10:31:25.60ID:EQ6/cNBg・末尾再帰はループに展開される可能性がある!
・10回でエラーにすればスタックオーバフローしない!
・関数はループで実装されている!
他なんかある?
0570デフォルトの名無しさん
2015/10/14(水) 11:05:48.44ID:oRHV6ndY>関数はループで実装されている!
0571デフォルトの名無しさん
2015/10/14(水) 11:34:16.65ID:/9vNjPCT0572デフォルトの名無しさん
2015/10/14(水) 11:50:57.77ID:FXmY07j9ふざけんな。
お前意味分かってねえだろ。
0573デフォルトの名無しさん
2015/10/14(水) 12:22:32.92ID:11T78Kgm項書換えによる証明より準備がいるわな。
末尾再帰はループに展開されるというより、goto/setjmp系の何かに変換されるイメージ。
そういやループ中の不変な結果はループ外に追い出す最適化があるけど、再帰で似たようなことってやってるのかな
0574デフォルトの名無しさん
2015/10/14(水) 12:26:26.67ID:EQ6/cNBg再帰厨の言い分。
0575デフォルトの名無しさん
2015/10/14(水) 16:15:03.71ID:c38m1Z9m0576デフォルトの名無しさん
2015/10/14(水) 16:32:12.71ID:oGNSnJBJ安定した高速処理を実現するなら再帰は使用しない。
0577デフォルトの名無しさん
2015/10/14(水) 16:54:54.31ID:c38m1Z9m深さを知ることは出来て、(深さを超えるようなら)脱出させることはできても、再帰のままだし
0578デフォルトの名無しさん
2015/10/14(水) 17:19:43.79ID:/9vNjPCT0579デフォルトの名無しさん
2015/10/14(水) 17:33:58.75ID:oRHV6ndY>http://peace.2ch.net/test/read.cgi/tech/1441012744/863
>ていうかLL(1)(再帰下降構文解析の一番簡単なやつ)とかは
>素人でも勝手に再発見するがそこで理解が止まってしまうと
>数式のパーサで死ぬので(そのまま作ると2項演算子が全部右結合になってしまう
>、やpっぱまずわ正規言語のパーサあたりからから作ってみて感触をつかんだるのちに
>ボトムアップパーサの理解に進むべし、
「そのまま作ると2項演算子が全部右結合になってしまう」 の意味分かる?
a/b/c が a/(b/c) の順番で計算されてしまう
「ボトムアップパーサ」の意味分かる?古くはyaccとかな
これは「ループ」で実装されるわけだが、こっちの方が一般的に使われている
0580デフォルトの名無しさん
2015/10/14(水) 18:03:10.47ID:oRHV6ndY>そのまま作ると2項演算子が全部右結合になってしまう
の部分だけど、ループを使ってボトムアップで計算すれば
左辺結合に出来るよ
0581id変わったけど 575
2015/10/14(水) 18:56:26.27ID:yg7BQx2mいろいろありがとう
右結合になってしまう というのは理解
構文解析は奥深いね(先人が通った道なんだろうけどもw
0582デフォルトの名無しさん
2015/10/15(木) 11:09:41.90ID:+AAPjypf・末尾再帰はループに展開される可能性がある!
・10回でエラーにすればスタックオーバフローしない!
・関数はループで実装されている!
他なんかある?
頑張って項目を増やしましょう!
0583デフォルトの名無しさん
2015/10/15(木) 12:44:56.93ID:MTJAuyfyいいかげんな事ばかり並べてるんじゃねーよ。
意味分かってねーだろうが。
0584デフォルトの名無しさん
2015/10/15(木) 15:50:01.30ID:kRNzdeWM再帰厨の意見を要約コピペしただけですが。
0585デフォルトの名無しさん
2015/10/15(木) 16:12:22.98ID:E2VFDW700586デフォルトの名無しさん
2015/10/15(木) 16:42:34.49ID:kRNzdeWM・末尾再帰はループに展開される可能性がある!
・10回でエラーにすればスタックオーバフローしない!
・関数はループで実装されている!
・こいつ毛の壁じゃねーの?
他なんかある?
0587デフォルトの名無しさん
2015/10/15(木) 17:51:17.75ID:E2VFDW700588デフォルトの名無しさん
2015/10/15(木) 17:54:58.23ID:kRNzdeWM再帰厨の言い分をコピペしてるだけだから、再帰厨に支持されると思う。
再帰厨が人格攻撃してくるという事は、何か間違ってるってこと?
元々再帰厨の言い分だから反論は無いよね?
0589デフォルトの名無しさん
2015/10/15(木) 19:03:43.95ID:E2VFDW70>もっともこの場合は、ループで実装するのが適切だから再帰は使いません
ちゃんとこの発言も残しておいてよw
0590デフォルトの名無しさん
2015/10/15(木) 19:39:02.90ID:kRNzdeWMそれはどういう話だ?
探索に再帰を使わないという意味なら、まあ妥当だろう。
元の流れがわからないと採用しづらいな。
0591デフォルトの名無しさん
2015/10/15(木) 21:04:42.69ID:2u28QwcF0592デフォルトの名無しさん
2015/10/15(木) 21:22:12.24ID:whFEoHyOスタックか何か用意すればよいだけでは
0593デフォルトの名無しさん
2015/10/15(木) 21:28:19.04ID:gTKnbHZq0594デフォルトの名無しさん
2015/10/15(木) 21:31:55.58ID:C028ZKjn0595デフォルトの名無しさん
2015/10/15(木) 21:45:09.42ID:kRNzdeWMブロックする前提だからそんな考えになるんだよ。
一行で入門以前ってわかるわ。
21世紀に通用するわけないだろ。
自分の時代に帰れ。
0596デフォルトの名無しさん
2015/10/15(木) 21:49:17.38ID:abynzQeyこいつはガチで糖質じゃないか
0597デフォルトの名無しさん
2015/10/15(木) 22:48:26.37ID:2u28QwcFそれも再帰だと思っていました。
違うんですか?
0598デフォルトの名無しさん
2015/10/15(木) 23:12:49.30ID:whFEoHyOキューでも全ファイル名取得は出来ます
これも再帰ですか?
0599デフォルトの名無しさん
2015/10/16(金) 00:11:17.12ID:Zk2bmF9T0600デフォルトの名無しさん
2015/10/16(金) 02:09:45.50ID:O6llndva適してない
不要なスタックが出る
0601デフォルトの名無しさん
2015/10/16(金) 02:48:00.45ID:xHCOUgWQ別に出なくね?
つか再帰なしのキュー/スタックだと並列できないから不利じゃね?
0602デフォルトの名無しさん
2015/10/16(金) 03:03:48.14ID:O6llndva0603デフォルトの名無しさん
2015/10/16(金) 03:04:42.16ID:O6llndva0604デフォルトの名無しさん
2015/10/16(金) 03:22:49.95ID:pkbG26u7普通ブロックしてよいならステートマシンで組もうと考えるだろ。
フォルダのオーダーを事前に見積もるのは不可能なんだから、再帰なんて
馬鹿のすること。
0605デフォルトの名無しさん
2015/10/16(金) 13:09:26.41ID:TDfNRPC3フォルダーのオーダーって言葉も意味不明だな
0606デフォルトの名無しさん
2015/10/16(金) 14:08:05.58ID:dPltY6KPブロックしてよいかどうかで選択の幅が変わるし、オーダーという言葉がわからないなら
そもそも再帰が良いとか悪いとかの話に加われないだろ。
0607あぼーん
NGNG0608デフォルトの名無しさん
2015/10/16(金) 14:15:08.44ID:GM7GrWMz0609デフォルトの名無しさん
2015/10/16(金) 14:33:30.15ID:TDfNRPC3>ブロックしてよいかどうかで選択の幅が変わるし、
今時なら別スレッドで実行するだけなので、実装がどうなっているかは関係ないと思いますが
スレッドを使えない環境だったとしても
>普通ブロックしてよいならステートマシンで組もうと考えるだろ。
これは意味がわからないですよね、正反対に思いますが
ブロックしてよいなら再帰も使える、が正解では?
再帰はスタックフレームに状態を保存しているので、処理の途中で応答を返す=スタックが巻き戻る=途中状態が消える
のでノンブロックで書くのが難しいと思いますが コルーチンでも使う気ですか?
>オーダーという言葉がわからないなら
オーダーという言葉は計算量なんかで出てきますが・・・フォルダのオーダーとは、はたして・・・
もしくは広義で順番の事をオーダーといいますが、フォルダのオーダーとはフォルダの順番の事ですか?
普通にフォルダの階層数が妥当では?
0610デフォルトの名無しさん
2015/10/16(金) 14:41:39.64ID:dPltY6KP0611デフォルトの名無しさん
2015/10/16(金) 15:07:02.87ID:O6llndva0612デフォルトの名無しさん
2015/10/16(金) 15:49:59.53ID:hvqMbwWs先ずそれをここに貼ってから薀蓄を垂れろよ。
0613デフォルトの名無しさん
2015/10/16(金) 16:26:07.27ID:Jgyk2if8通常のライブラリのソースはループ方式なんだし。
0614デフォルトの名無しさん
2015/10/16(金) 17:40:25.17ID:clf6UnQk入れるだけだからね。
その程度を嫌がって再帰とかわけわからんわ。
0615デフォルトの名無しさん
2015/10/16(金) 17:42:31.48ID:clf6UnQk結局、状態を外に出さないといけないんだから、再帰なんて検討する価値が無い。
これは中学一年の副教本、楽しいBASICにも書いてあることだぞ。
0616デフォルトの名無しさん
2015/10/16(金) 18:58:20.30ID:xHCOUgWQ継続はまた別の概念だろうに︙
0617デフォルトの名無しさん
2015/10/16(金) 19:43:28.42ID:O6llndva1: システム言語などを使用し、どうゆう基準を満たせば再帰として認められるのか、
2: ディレクトリ検索は (1:) を満たさなければ実装不可能なのか (あるいは可能なのか) の証明の提示。
ヒント :ディレクトリ検索は原理的に1:の構造が不要。1:を満たす処理は純粋なロスが出る
0618デフォルトの名無しさん
2015/10/16(金) 23:44:41.28ID:qr66SuO9帰納的にすっきり書くのか、ループでゴリゴリ書くのかの違い。速度やスタックが、というのは気にする観点が違うと思う。
ただ、ループでゴリゴリ書いたのしか理解できない人がいるのも事実なので、「人を選んだ可読性」でしかないのだが。
まあ、リソースが限られていたり(制約を設けられなかったり)、帰納的な表現に慣れていない人は使わなくてもいいんじゃないかな。何も恥ずかしがることはないし、拒絶反応を示すほどのことでもない。
0619デフォルトの名無しさん
2015/10/16(金) 23:47:51.40ID:TDfNRPC30620デフォルトの名無しさん
2015/10/17(土) 01:15:46.94ID:u6HpNLYA今までループで書いてたからループ以外認めない人もいるんだろう
ま、そういうのを老害というんだが…
ライブラリ開発とか効率を再優先にしなきゃいけない人たちはループを使うしかないけど、
世の中の大多数を占めるアプリケーションプログラマにとってはそんなのどうでもいいしね
0621デフォルトの名無しさん
2015/10/17(土) 01:16:32.21ID:eyn7IIL+再帰を使えば人様に迷惑をかけることがわかりきっているからです。
0622デフォルトの名無しさん
2015/10/17(土) 07:37:49.88ID:J6BMdQogもう病気としか言いようがない再キティ害の現実逃避妄想
>>620 にプログラミング技術も経験もないだけってことを思い知るべき。
0623デフォルトの名無しさん
2015/10/17(土) 09:21:12.88ID:a4FoVTZd0624デフォルトの名無しさん
2015/10/17(土) 09:26:46.32ID:v2TM2ZJ7叩いたものが金になるハンマーがあったとしたら
ちんこ叩きたくなるだろうが、そして叩くべきだよね。
ループ厨はその事実を厳粛に受け止めるべき。
0625デフォルトの名無しさん
2015/10/17(土) 10:40:44.87ID:RMkIXyBp0626デフォルトの名無しさん
2015/10/17(土) 11:01:01.10ID:v2TM2ZJ7嫉妬か
0627デフォルトの名無しさん
2015/10/17(土) 14:53:50.80ID:FY1OBNmb0628デフォルトの名無しさん
2015/10/17(土) 15:16:42.29ID:QDrnQrmx0629デフォルトの名無しさん
2015/10/17(土) 17:04:19.55ID:2beLGnBn0630デフォルトの名無しさん
2015/10/17(土) 17:08:48.05ID:u6HpNLYAループはほぼ使わない
0631デフォルトの名無しさん
2015/10/17(土) 17:22:46.37ID:2beLGnBn0632デフォルトの名無しさん
2015/10/17(土) 17:25:40.94ID:u6HpNLYA変数はすべてイミュータブルが基本だからね
イミュータブルな変数を使うループはそもそも入る余地がない
0633デフォルトの名無しさん
2015/10/17(土) 17:29:48.53ID:v2TM2ZJ7http://cdn-ak.f.st-hatena.com/images/fotolife/a/apyapon/20150315/20150315162407.jpg
0634デフォルトの名無しさん
2015/10/17(土) 19:36:32.20ID:1SpoCrN+0635デフォルトの名無しさん
2015/10/17(土) 22:28:08.76ID:J6BMdQog自分の言語の専用スレから出てきちゃダメ。
2ちゃんでもリアルと同じく一生引きこもってなさい。
0636デフォルトの名無しさん
2015/10/18(日) 00:00:18.55ID:/3dtuYD6これは魔法の処理ですよ → なるほど分かった! → 馬鹿の典型
0637デフォルトの名無しさん
2015/10/18(日) 09:01:07.15ID:2izk1DSP皮肉なもんやね
0638デフォルトの名無しさん
2015/10/18(日) 19:01:20.52ID:pRRa4MTE何故か再帰が何か分かっていない基地外が1匹紛れ込んだ結果、パート2までもつれこむ事態に。
0639デフォルトの名無しさん
2015/10/18(日) 21:06:34.71ID:mjyuqPZH・末尾再帰はループに展開される可能性がある!
・10回でエラーにすればスタックオーバフローしない!
・関数はループで実装されている!
他なんかある?
0640デフォルトの名無しさん
2015/10/18(日) 23:03:42.75ID:WoQP1cU6>何故か再帰が何か分かっていない基地外が1匹
>>639 のことかよ
0641デフォルトの名無しさん
2015/10/19(月) 00:10:29.50ID:+RK2408Wどうでもいいけど
スレ自体が
0642デフォルトの名無しさん
2015/10/19(月) 19:26:19.84ID:9o5B1lk40643デフォルトの名無しさん
2015/10/19(月) 19:33:39.50ID:omjlDmo+> アンチ再帰に基地外
きちがいとまでは思わないけど、視野がちょっと狭いなとは思う。
0644デフォルトの名無しさん
2015/10/19(月) 23:12:09.55ID:NIDePIlh0645デフォルトの名無しさん
2015/10/20(火) 04:05:18.77ID:PJ53hIBn0646デフォルトの名無しさん
2015/10/20(火) 07:18:10.78ID:4VGtRbkYPrologマシンは、それでOSを書き切っているのではないか。
0647デフォルトの名無しさん
2015/10/20(火) 07:50:43.27ID:+rU+djiA0648デフォルトの名無しさん
2015/10/20(火) 07:58:09.45ID:rM0m1d25再帰を積極的に使用するのも再キティ害の妄想
0649デフォルトの名無しさん
2015/10/20(火) 21:27:46.67ID:yhDxD//aPrologマシンって、Prologで書かれてるんですか?
0650デフォルトの名無しさん
2015/10/20(火) 23:19:13.18ID:4VGtRbkYハードウェアはマイクロプログラム化されたものを機械語が呼び出して制御します。
その機械語自体が単一化、バックトラックなど完全にPrologの文法体系に則っています。
OSの記述は、Prologにオプジェクト指向的なインターフェイスを被せた言語が作られて使われました。
0651あ
2015/10/21(水) 01:53:47.07ID:+LGxtkDr↓の程度なら楽勝。
$ cat f.c
int fint x, int y) {
if (x <= 0)
return y;
else
return f(x-1, x+y);
}
$ cc -O -S f.c
$ cat f.s
# 長いから略
0652デフォルトの名無しさん
2015/10/21(水) 08:24:34.72ID:tXSFIHHw非実用的な言語で書けるのは、非実用的なOSにしかならないね。
0653デフォルトの名無しさん
2015/10/21(水) 15:27:37.33ID:t87abjKQPrologは単一化などに大きなコストを掛けた言語でありどうしても重くなりますから、
例えば、telnetが遅いというようなことはあったようです。
0654デフォルトの名無しさん
2015/10/21(水) 20:04:50.59ID:WYGNtn73廃れていくだろうね
再帰(ただし末尾再帰)か高階関数を使ってループ部分は隠蔽して、並列化自体は
処理系なりライブラリなりにまかせるという流れ
0655デフォルトの名無しさん
2015/10/21(水) 20:07:30.71ID:bA9WUQ2m10年以上前からそんな事は何度も言われてるんやで
0656デフォルトの名無しさん
2015/10/21(水) 20:17:27.23ID:WYGNtn7310以上前から言われてきて、最近ようやく役者がそろってきた感じがするね
Clojure、Scala、Haskell、OCalm、Erlangなど一線級での実績を積んできているし、
ノウハウもたまってきた
C#やJavaが関数型に寄せて行こうする動きも明白だしね
まぁ、現在ある関数型言語のどれかが抜け出すか、C#やJavaが機能追加で対応するか、
はたまたまだ見ぬ言語がホープの地位に駆け上るか、それはわからないけど、大きな流れと
してはもはや動かしようはないね
0657デフォルトの名無しさん
2015/10/21(水) 20:46:32.15ID:kNGAvyWJ並列化で高速処理を実現するなら、処理速度の遅い関数型を使用するのはデメリット。
0658デフォルトの名無しさん
2015/10/21(水) 20:50:52.83ID:bA9WUQ2mどこが最近やねん、2010年前後にはそれらの言語は出揃ってたぞ。
今調べたらpugsは2005年なんだな、そんなに古かったっけな?
当時はhaskellって何もんや?と思って興奮したもんだ。
それに関数型言語なんて、はるか昔から使われてる所では使われとるんや。
お前が興奮してるほど世間は浮かれてないし、
お前が興奮してる以上に歴史も実績もあるんやで。
0659デフォルトの名無しさん
2015/10/21(水) 20:52:23.60ID:WYGNtn73それじゃどうやって並列化を実現するの?
まさかスレッドを自前で管理しないよね?
ガベージコレクタがメモリ管理からプログラマを解放したように、スレッドをプログラマが
管理するような悪しき時代はもう終わるんだよ
そのためには手続きが丸見えのループは邪魔な存在でしかないよね
0660デフォルトの名無しさん
2015/10/21(水) 21:27:16.12ID:zPyN71xI0661デフォルトの名無しさん
2015/10/22(木) 15:18:36.92ID:F81mE+Hn並列化も関数型以外の方法で普及するのでしょう。
0662デフォルトの名無しさん
2015/10/22(木) 20:00:31.63ID:vKVNVE/Yあんな感じのものが今またメニコア環境で復活しつつあるよな
Linuxのコンテナとも相性がいいし
0663デフォルトの名無しさん
2015/10/28(水) 19:13:27.55ID:UQfxGWP/プログラミング言語はプログラマにできることを制限していくことで抽象化を
図ってきたのだから
その結果が再帰なのか高階関数なのかはさておきね
もちろんこれはアプリケーションプログラマだけが対象であって、カーネルやデバドラ
など低レベルの分野に適用されるものではないよ
0664デフォルトの名無しさん
2015/10/28(水) 19:33:57.67ID:413ZIx2S今後、再帰って手法の重要度は上がっていく方向な気がする。
0665デフォルトの名無しさん
2015/10/28(水) 20:45:29.20ID:0c7VcdM3配列と同じように扱えることが多い文字列を撲滅する必要があります
配列の操作にはループが適しています
strlenを再起で書く人は居ないでしょう
添え字によるアクセスにはループの方が自然だからです
0666デフォルトの名無しさん
2015/10/28(水) 21:50:16.50ID:UQfxGWP/strlenみたいなコアライブラリ製作者は今までどおりループ使えばいいと思うよ
俺が言ってるのはアプリケーションプログラマだからね
0667デフォルトの名無しさん
2015/10/29(木) 03:18:42.91ID:z0g2qO/B関数型言語での再帰は、手続き型言語でのイテレータ使ったループと同じくらいの抽象度。
もっと抽象度上げた高階関数で、ようやく自動で並列化とかの道が見えてくる。
それを再帰の手柄と言うのは、何でも再帰だと主張していたスレ初期の基地外と同じくらい定義を拡大解釈している。
mapもfoldも手続き的に実装している可能性があるのよ?
0668デフォルトの名無しさん
2015/10/29(木) 03:33:36.62ID:wNo8j+kT実装はどうでもいいんよ
そういうのはコアライブラリ製作者の話だからね
アプリケーションプログラマとしては抽象化は重要な話であるって話だからさ
0669668
2015/10/29(木) 03:47:19.66ID:wNo8j+kTこの「実装はどうでもいいんよ」という状態に持っていくのが抽象化なんだよ
mapやfoldが手続き的に実装されてもいいし、自動並列化を意識した実装をされててもいい
どちらにしてもアプリケーションプログラマが意識しなくていいという部分が重要
0670デフォルトの名無しさん
2015/10/29(木) 15:09:33.77ID:IDJmDfjistrlenに限らず、配列に添え字でアクセスする場面ではループが最適です
配列に再帰を使ってループ処理をしても
func( array, index+1 ); みたいなことになってスッキリしません
0671デフォルトの名無しさん
2015/10/29(木) 21:27:12.10ID:raF10oudp(_x,_y) :-
q_1(_x,_y).
p(_x,_y) :-
q_2(_x,_y).
q_2(_x,_y) :-
r(_x,_z),
p(_z,_y).
0672デフォルトの名無しさん
2015/10/29(木) 22:03:31.56ID:raF10oudsum_list(L,S) :-
sum_list(L,0,S).
sum_list([],S,S).
sum_list([M|R],S1,S) :-
S2 is S1 + M,
sum_list(R,S2,S).
というような定義をするのですが、これは組込述語(ライブラリのようなもの)に
なっていて、いちいち定義はしません。
再帰だけでできているPrologのような言語でも、再帰で表現されている部分は
低水準過ぎて、コードからはどんどん減っていく傾向にあります。
0673デフォルトの名無しさん
2015/10/31(土) 02:36:18.58ID:jp9g9T1R0674デフォルトの名無しさん
2015/10/31(土) 10:30:57.81ID:hj3UoKsV0675デフォルトの名無しさん
2015/10/31(土) 20:45:48.75ID:W1S2FPsD0676デフォルトの名無しさん
2015/10/31(土) 21:03:23.89ID:yZ/bvh29ではその中から類似性を見出して
それについて議論すればよいのではないのかね?
否定するばかりでは議論は成り立たぬよ。
0677デフォルトの名無しさん
2015/10/31(土) 21:40:25.52ID:W1S2FPsD0678デフォルトの名無しさん
2015/10/31(土) 22:32:56.82ID:xGdNlw9I再帰もループも使わずに想定されるソースコード全部出力
最近それやってたけど
最初にそれやり始めた時は再帰で書けるわけないと思ってたからメタしてた
長い時間かかって最適化していったら
ついにメタ出力していたソースコードは再帰で書き換えられて
1000行くらいが消し飛んだわ
書きあがった再帰はこの世のものとは思えない複雑さ
0679デフォルトの名無しさん
2015/11/01(日) 09:56:47.99ID:vrg09b8+twitterは規模が大きくなってerlang辞めた。
0680デフォルトの名無しさん
2015/11/01(日) 10:00:21.52ID:vrg09b8+ループがあるのは再帰があるのと同じ、
再帰があるのはループがあるのと同じ、
とかなり昔に証明されてます。
0681デフォルトの名無しさん
2015/11/01(日) 19:36:12.82ID:TD26KE/4それ費用対効果を考えてる?
技術屋は数学者とは違うんだから
0682デフォルトの名無しさん
2015/11/02(月) 05:31:36.58ID:8fKhlJEB0683デフォルトの名無しさん
2015/11/02(月) 06:15:05.45ID:tRZ2mEuQ0684デフォルトの名無しさん
2015/11/02(月) 06:20:23.82ID:8fKhlJEBhttp://blog.8arrow.org/entry/2014/10/23/063044
0685デフォルトの名無しさん
2015/11/02(月) 10:43:24.69ID:pkynDUbvこれはひでぇな
どんなバイナリ吐いてるのか位書くべき
0686デフォルトの名無しさん
2015/11/02(月) 11:26:25.09ID:jypI/AIk>>684 は中学生の国語からやり直すべき
0687uy ◆Qawu9.2l1E
2015/11/02(月) 19:16:06.26ID:xpWW7kpWループで書かないとコンパイラが上手く最適化しない事が多い そのせいで低速
あと自分でメモリ管理してるC/C++で再帰は事実上そんなの使えないのと同じ
実装側で変数を全部ヒープ領域で管理してる言語でやっと再帰は使えるようになる
C言語? もうそれが最速の時代ではない
Cは処理を一つ一つ書いていかなければならないのに比べて、高級言語はひとつの構文で、まとまった処理の意味を持つから
同じソースコードを書いても処理の最終結果をCに比べて予測しやすいのが高級言語
そのあたりでCの速度を超えていく
0688デフォルトの名無しさん
2015/11/03(火) 15:20:35.32ID:52EC11Az無理
再帰を使う時点で、速度だの安定性だのは完全無視
低レベルのプログラマのお遊びのための言語
0689デフォルトの名無しさん
2015/11/03(火) 15:48:39.89ID:PIZqYS1xアセンブラでも使うぞ。
データ構造が何かを内包できるコンテナで自分と同種も内包できる、なんてのをパースする時には自ずと再起になるしな。
その時にはコンパイラが上手にやってくれるよ。JITの方が上手なくらい。
普通に書いても、「あー、このデータ種で次が無い時にはポインタ進めて再エントリだな」ってロングジャンプになってたりする。末尾再帰そのもの。
と言うか、再起=オーダがわからないって話から飛躍してるのかな。
パーサとかインタプリタ実装した事も無いのかなぁ。
0690デフォルトの名無しさん
2015/11/03(火) 18:25:43.53ID:52EC11Azなんで「再起」なんて変換が含まれとるんだ
0691デフォルトの名無しさん
2015/11/03(火) 18:49:04.62ID:0JALeTPSありゃ、全部変換ミスしてたな。
0692デフォルトの名無しさん
2015/11/03(火) 23:32:59.01ID:EFE2GKyQ0693uy ◆Qawu9.2l1E
2015/11/04(水) 00:18:19.48ID:FuRncUQp同じ労力を均等にすべての言語にかけるならLispが一番高速なのは当たり前
わかりやすくいえば
(a b c d) = 実行結果
↑ と
int x = 0;
for(x;x<4;..... = 実行結果
↑ これ
どちらがイコールの関係作りやすいか? が最適化の課題
0694uy ◆Qawu9.2l1E
2015/11/04(水) 00:44:35.13ID:GRvrS8N0それでどうやって二分探索とかグラフ書く?
最終的にループで書くにしたって再帰のほうが楽だから、普通は最初に再帰で書いて
最適化の余地があるならループで書き替えるんすよ?
再帰無理ってやつはマジプログラミングの才能ないからやめとけ
0695デフォルトの名無しさん
2015/11/04(水) 02:03:34.74ID:jxIKq77p再帰をループに直せないなんてレベルが低すぎ
Lispが一番高速だなんて妄想の世界
再帰厨にはプログラミングの才能なんて皆無なんだから
さっさと消えてね。
0696デフォルトの名無しさん
2015/11/04(水) 02:16:57.81ID:xDG89KxW0697デフォルトの名無しさん
2015/11/04(水) 04:07:35.56ID:Ly3yLQ9c0698デフォルトの名無しさん
2015/11/04(水) 07:19:34.16ID:UW5nAvYX0699デフォルトの名無しさん
2015/11/04(水) 08:15:29.17ID:+IbiBxzw0700デフォルトの名無しさん
2015/11/04(水) 09:10:02.70ID:eHzk5Tc9スタックの容量のこといってるのかな?
0701デフォルトの名無しさん
2015/11/04(水) 09:31:12.08ID:eHzk5Tc9http://d.hatena.ne.jp/kwatch/20100430/1272585083
どういうソースでどういうコンパイルオプションで比較したんだろうか。
0702デフォルトの名無しさん
2015/11/04(水) 11:29:10.25ID:Am0x1eSa> 再帰を使うと頻繁にPCレジスタをPUSHする訳だから普通に安定性落ちるんじゃないの?
0703デフォルトの名無しさん
2015/11/04(水) 12:10:19.09ID:p4wdmRvQ0704uy ◆Qawu9.2l1E
2015/11/04(水) 12:46:07.48ID:f9LszNMAアルゴリズムを書くときに
「再帰」のほうが書きやすいものはいくらでもありますね、
例に挙げたようにツリー構造やグラフですよ
君たちが普段使っているインターネットやOSのディレクトリですよ
その場合に"""最終的に"""ループで書くとしても、
""""最初は""""再帰から""""""""書かなければならない""""""""わけで
再帰を**********最終コード**********で使わないからといって
再帰を書けないプログラマが許されるわけないだろ?アホか?死ねよ?
0705デフォルトの名無しさん
2015/11/04(水) 13:50:33.81ID:CmcPtRhv全く別ではない。
0706デフォルトの名無しさん
2015/11/04(水) 14:08:51.56ID:xiYq5xbj文字列や配列はプログラムで一番使う、初心者から玄人まで幅広くな
再帰厨はこれらの操作にも再帰をつかうんですかね
0707デフォルトの名無しさん
2015/11/04(水) 14:12:02.09ID:p4wdmRvQ特に>>704 のように知能の低いゴミに対して特別に見逃されている問題行為。
正常なプログラマは、書きやすいからって理由で問題のあるコードを書いてはいけませんね。
0708デフォルトの名無しさん
2015/11/04(水) 15:20:54.73ID:Am0x1eSahttp://thinkdynamik.blogspot.jp/2014/05/recursion-is-win-iteration-low-level.html
Jon Bentley in his 1982 book "Writing Efficient Programs" informs us that
| Recursive procedures(that is, procedures that can call themselves) are
| powerful expressive tools that can greatly ease the design and implementation
| of a correct program. That lesson was made clear to me when I translated a
| nineteen-step iterative algorithm that I had written (which resulted in over
| 100 lines of code and took two twelve-hour days to debug) into a four-step
| recursive algorithm (which took less than 30 lines of code and took less
| than an hour to implement). Unfortunately, this expressive power is not
| without cost, because many implementations of recursion are slow.
0709デフォルトの名無しさん
2015/11/04(水) 15:23:27.54ID:Am0x1eSa| In 2008 book "Beautiful Code", a collection of articles, It is Brian
| Kernighan saying " recursion is a win. This fundamental programming
| technique almost always leads to smaller, cleaner, and more elegant code
| than the equivalent written with explicit loops, and that is the case here.
| The idea of peeling off one matching character from the front of the regular
| expression and from the text, then recursing for the rest, echoes the
| recursive structure of the traditional factorial or string length examples,
| but in a much more interesting and useful setting."
0710デフォルトの名無しさん
2015/11/04(水) 16:04:27.89ID:p4wdmRvQ再帰厨に任せられるような仕事なんて無いんだから、これからもずっと引きこもってなさい。
0711デフォルトの名無しさん
2015/11/04(水) 16:25:53.74ID:V9zdm4Us外国の再帰厨か。
0712デフォルトの名無しさん
2015/11/04(水) 16:43:09.78ID:jIKMvE/jツリーは再帰と言うのは再帰厨によって繰り返し説明されている。
でもそれはおそらくデータ構造から間違っているんだよ。
たぶん、子ノードの集合を親ノードに保持するような作りにしているんじゃないかな?
ほとんどの人が中学生の頃そんな実装をする。
しかし、高校生になると一本の配列でツリー全体を表現するようになる。
なぜなら高校生になると、範囲の表現を使うようになるからだ。
代表的なツリーであるHTML(やXML)について考えてみよう。
HTMLの範囲を選択するという要求は(ユーザーの操作によって)普通に存在する。
この場合、ある葉からある葉を底辺とする共通祖先を親とした三角形を取り扱う事となる。
この時、ある葉は親の右端であることも左端であることも保障されない。
0713デフォルトの名無しさん
2015/11/04(水) 16:50:14.35ID:jIKMvE/j次に、削除した三角形を別のツリーのある接点へ挿入することを考えよう。
再帰厨の提示するデータ構造では機能を追加するたびに困難が増えていく。
ツリーのデータ構造は一本の配列にするのが高校からのプログラミングなのである。
(実際にはリンクドリストを使う)。
0714デフォルトの名無しさん
2015/11/04(水) 17:03:55.41ID:Ou693Eg4範囲の削除、挿入は、単に配列に対する配列の削除挿入によって行われる。
HTMLについて考えてみよう。
<P>に隣接して<P>が挿入されたとき、これらは別のノードとなる。
しかし、<B>に隣接して<B>が挿入された場合、これらは一つのノードに併合される。
こういった操作を再帰で行うのは骨の折れる仕事だ。
しかしループなら容易である。
もう一つのデータ構造として、ツリーを集合によって取り扱う方法がある。
これは関数型言語を好む人たちによって繰り返し提示されるアイデアである。
これは非常に簡潔で優れたアイデアなのだが、残念ながら一億コアプロセッサが
一般的になるまで実用性は無い。
0715デフォルトの名無しさん
2015/11/04(水) 17:22:36.52ID:RyQ9LzF5それは編集するときの概念。
ブロック要素において、ある要素の子要素全体の幅を取得する、という時に、
ある要素は、子要素の幅を足し込んでいくと自分の幅を定義できる、
というシンプルな宣言になる。
ある要素の子要素が、ある要素そのものであった場合、これは再帰であるとしか言えないんじゃないか?
これを単なるループでリンクドリストで次の要素、前の要素から、今の深さと幅を取りながら、ある要素の時点で深さが戻ったので前の前の前の要素の幅は、今までの幅、と言うのはセンスない。
リンクドリストで処理するとしても、ブロック要素が来たので一段下がって終タグがきて一段上がるまで、を関数でまとめて処理するのであれば、
ブロック要素の中でブロック要素が来た場合はそれは再帰そのもの。
前に誤変換しながら書いた、コンテナがコンテナを内包する、ってのがまさにそう。
お前パーサ書いたこと無いだろ。
0716デフォルトの名無しさん
2015/11/04(水) 17:44:02.03ID:UiYzITYZ再帰下降は停止性が保証されないから禁止です。
再帰が許されるのは中学生までです。
0717デフォルトの名無しさん
2015/11/04(水) 17:45:42.36ID:xiYq5xbjループとスタックと遷移表で構成されているのが普通だと思いますが
0718デフォルトの名無しさん
2015/11/04(水) 17:53:09.14ID:UiYzITYZこれは単純なループで構成できます。
そして重要なことは、状態を整数値一つで外部に出せます。
もっと大きなものであれば、事前に遷移を計算して表にしておくのです。
パーサーについて考え出せば、再帰に分は無いのですよ。
再帰の欠点が全部詰まっているのですから。
再帰の良いところは、中学生にも取り扱えることだけです。
0719デフォルトの名無しさん
2015/11/04(水) 18:03:59.31ID:UiYzITYZ決定性を持たないという事は、攻撃者に付け入るすきを与えることに他ならない。
いいですか?再帰とはr系コマンドと同様、古き良き時代のテクニックなのです。
0720デフォルトの名無しさん
2015/11/04(水) 19:53:39.41ID:RyQ9LzF5プッシュダウンオートマトンで同じ事をしようとすると、結局ε遷移の必要なNPDAになるだろ。
状態を整数値一つで出す、もあまり正しい表現ではないよ。再帰でもスタック全部外に書いちゃえば良いこと。
状態の遷移に決定性があるなしは、再帰でもかわらん。
入力が同じなら遷移も同じ。
馬鹿にはオーダが計算できないだけ。
ループとスタック、って言ってる時点で疑問に思おうな。
それを高次で内包してるだけなんだから。
0721デフォルトの名無しさん
2015/11/04(水) 21:41:49.90ID:CmcPtRhv抽象データ型と実装の区別がついてない。
0722デフォルトの名無しさん
2015/11/04(水) 22:27:50.32ID:Ly3yLQ9c再帰にもループにもあてはまるんだよね
0723デフォルトの名無しさん
2015/11/04(水) 22:36:32.36ID:RyQ9LzF5そう。結局は繰り返し。
こいつは抽象的な理解が全くできない馬鹿。
0724uy@紫の鏡 ◆Qawu9.2l1E
2015/11/04(水) 22:49:49.88ID:i1eTFo0Uループで実装することは不可能だと思うよ
かなりすさまじいコードになると思うよ
0725デフォルトの名無しさん
2015/11/05(木) 00:32:09.37ID:y4EEb8lVなんて発想がもう超低脳の再帰厨の妄想
自分がプログラムできないことは世間の誰もできないなんて妄想する井の中の蛙
再帰厨の再帰のみプログラミングは不正改造車両による公道暴走
社会に害をなすキティ害行為
世間の連中が同じことをしないからって、自分が優れているなんて妄想するどうしようもないバカ
0726デフォルトの名無しさん
2015/11/05(木) 01:17:44.19ID:DxKwUhQs言い訳に困って中傷に走らず、メリットのある場合無い場合を整理してチラシの裏にでもまとめたらどうだ?
最後の行、凄まじいブーメランだよ。
0727デフォルトの名無しさん
2015/11/05(木) 01:21:20.88ID:yq3tbEEh再帰下降法を使って良いのは中学生までです。
0728デフォルトの名無しさん
2015/11/05(木) 01:23:28.98ID:yq3tbEEh遷移表を計算しておくなら、ループで実装したら良いのです。
わざわざ再帰で実装するメリットはどこにもありません。
デメリットはいくらでもあります。
0729デフォルトの名無しさん
2015/11/05(木) 01:23:58.99ID:9/Cij0JY0730uy@紫の鏡 ◆Qawu9.2l1E
2015/11/05(木) 01:24:00.03ID:d7vFM514その時どれだけ毛根が死滅してハゲ上がったのか知らないけど
僕は再帰を書き続けます
0732デフォルトの名無しさん
2015/11/05(木) 07:25:33.21ID:S5LNgH5Aそんなやついないから。
再帰使うだけで選民思想。
みなさんこれが再帰厨ですよ。
0733デフォルトの名無しさん
2015/11/05(木) 07:30:45.51ID:I4yBwlZmあなたが言ってるループで実装する遷移表が予め計算できる、なんていうケースでは、
それは再帰で書いても同じ、
かつ、実質再帰になりますよね、って話。
あなたが言ってるのは四則演算をスタック使った計算にyaccで落とし込むみたいなしょうもないケースでしょ。それ。
それにだってデメリットだらけ。素直にはevalに相当するコードがかけないよね。クロージャなんかも定義しづらいし、遅延評価もどう表現するの?
で、構文木を解析するのはSLRだとしたもね。
最後の行は読めたのかな。
再帰憎しで、再帰ならさっと書けるはずの事をこねくり回してる印象まであるよ。
高校生が、中学生が、と子供みたいな事言ってるけど、実務経験あるのかな?
0734デフォルトの名無しさん
2015/11/05(木) 08:23:04.00ID:GoA/HTyT0735デフォルトの名無しさん
2015/11/05(木) 08:39:48.02ID:tAlGc147それこそどんだけ深くなるかわからんし、
走査順が深さ優先ばかりじゃないので、
スタック使って実装されてるライブラリが多いが。
考えが浅すぎる。
0736デフォルトの名無しさん
2015/11/05(木) 09:17:45.46ID:I4yBwlZmファイルシステムは、再帰じゃなくて、
1.処理対象リストが尽きるまでループする
2.処理中にディレクトリ見つけたら、処理対象リストに中身を(一段目まで)展開する
のループの方が無難。
まぁ、これでもどれだけ深くなるかはわからんけど。
ファイルかドライブかリンクしかないツリー構造より、もっと多種多様な中身を持つコンテナ構造に向いてると思うよ。
0737デフォルトの名無しさん
2015/11/05(木) 09:25:42.47ID:lqwbYTtUスタック溢れるわけがない、だってスタック無いから。
とっとと死ねよ。老害。
0738デフォルトの名無しさん
2015/11/05(木) 14:33:56.32ID:SbhSUPxN0739デフォルトの名無しさん
2015/11/05(木) 14:43:06.14ID:7GQWx2q4どこかのブログで引用されるかもしれんよ。
2chはレベル低下が著しいけど、ブログなどで晒されると恥ずかしいと思うよ。
ブログは検索から来るからデタラメ書いてることを理解できる人が見るんだよ。
0740デフォルトの名無しさん
2015/11/05(木) 15:35:08.04ID:d7vFM5140741デフォルトの名無しさん
2015/11/05(木) 16:13:30.00ID:SbhSUPxNそんな低レベルじゃあ何の仕事もできないし、
そのまま一生引きこもっていてね。
0742デフォルトの名無しさん
2015/11/05(木) 18:26:56.27ID:q6KkrjLY0743デフォルトの名無しさん
2015/11/05(木) 18:33:17.15ID:w1ErlqZKえらく低レベルなハードルだな
0744デフォルトの名無しさん
2015/11/05(木) 19:03:55.34ID:AD547T9X読みやすさと処理の容量は同じ。
と言うよりスタック3のループその物がそのまま(最適化されない)再帰。
0745デフォルトの名無しさん
2015/11/05(木) 19:35:56.93ID:lqwbYTtUFORTRAN77つかってろ。ジジイ。
0746デフォルトの名無しさん
2015/11/05(木) 20:38:24.18ID:GM22ZbSlどうせ数学の成績が1とか2だった奴でしょ
なんでプログラマになったのレベル
0747デフォルトの名無しさん
2015/11/05(木) 20:40:23.64ID:w1ErlqZKえらく低レベルなハードルだな
0748デフォルトの名無しさん
2015/11/05(木) 20:57:02.70ID:kttK0NHK再帰って概念が難しすぎてハゲ上がりそうなんでしょ?
適性ないんだよ君は
0749デフォルトの名無しさん
2015/11/05(木) 21:02:56.31ID:w1ErlqZK0750デフォルトの名無しさん
2015/11/05(木) 21:05:44.05ID:lqwbYTtU0751デフォルトの名無しさん
2015/11/05(木) 21:08:39.20ID:w1ErlqZKこれらの処理をするのにはループが適しています
0752デフォルトの名無しさん
2015/11/05(木) 21:09:22.06ID:I4yBwlZmとはいえ、そこまでデタラメな事書いた覚えもないけど。
再帰が出来たら偉い訳ではなくてさ。
出来ない事や勘違いは恥ずかしいし、低レベルなハードルだな、と言うからには、それ以下では無い、って意味よね。
ループと再帰に、どれほどの違いがあるんだろう?
ループ、なんて命令がある訳では無くて、単に
レジスタにメモリから代入する
レジスタに定数を代入する
レジスタとレジスタの二の補数を加算する
答えがゼロになってフラグが立てばPCに定数値を代入
処理
:
処理
PCに定数値代入する
と、ループでもなんでもなくただの計算でしかないからな。
それが再帰になったところで、機械語に落としてみれば何一つ変わらないと気づかないのかな。
0753デフォルトの名無しさん
2015/11/05(木) 21:20:55.98ID:w1ErlqZK飯だって、糞になったら全部同じ、栄養さえ有れば味なんか気にする必要ないよな
お前の書き込みも液晶に表示されるドットになったら、内容が何であれ全部ビットマップで
液晶からしたら全部同じだから、内容なんか気にする必要ないよな
バカじゃね?
何でも良いなら、機械語かチューリングマシンでも弄ってれば?
0754デフォルトの名無しさん
2015/11/05(木) 21:21:29.69ID:7jlVzvr3お前が一番ボヤっとしてどこに向かってんのか分らんのだが
建設的とか言う前にまず主旨をハッキリさせろよw
0755デフォルトの名無しさん
2015/11/05(木) 21:27:48.08ID:I4yBwlZmんなもん当たり前だろ。
そもそも、配列と文字列にどう区切りをつけてるのかわからん。
文字の配列で文字列じゃないか。。
最後の要素に\0入ってるかどうかかな。
それでも配列から二分探索したけりゃ多分再帰使うし、
それが画像なら四分木探索で再帰使うし、
なんかのソルバーなら限られた手数での判定に再帰使うなぁ。
都合の良いデータ種出してよければいくらでもあるんじゃねーの?
0756デフォルトの名無しさん
2015/11/05(木) 21:31:13.19ID:I4yBwlZm何が言いたいのかわからん。
再帰関数は深さが読めないからダメで、安定性が落ちるからダメだと言うなら、
決定的に異なるコードになるはずなんだけど。
そうではないから、再帰関数使うやつはダメで、かつ、
何でもループで処理できるんだろ?例えばインタプリタならevalやらクロージャでも。
0757デフォルトの名無しさん
2015/11/05(木) 21:31:24.34ID:w1ErlqZK0758デフォルトの名無しさん
2015/11/05(木) 21:33:04.14ID:w1ErlqZK末尾再帰でないかぎり、決定的に違うコードになりますが
0759デフォルトの名無しさん
2015/11/05(木) 21:33:46.37ID:I4yBwlZm>>345はどうなったの?
0760デフォルトの名無しさん
2015/11/05(木) 21:34:46.89ID:I4yBwlZm前提条件増えてきたね。
逆に、スタックを使うループ、と再帰関数の違いはどうなるかなぁ。
0761デフォルトの名無しさん
2015/11/05(木) 21:38:53.88ID:w1ErlqZKそりゃ決定的にちがう機械語になるでしょう
0762デフォルトの名無しさん
2015/11/05(木) 21:44:06.33ID:w1ErlqZKそれがどうかしたの?
>>345でも配列と文字列は違うものだけど
同じように添え字でアクセスできることが多いから
再帰とループの話をする場合は
まとめて配列のグループに入れても良いって言ってるわけだが
お前みたいに文字列=文字の配列と短絡している訳ではない
0763デフォルトの名無しさん
2015/11/05(木) 21:45:54.40ID:jSuDdQRWループにできることは再帰にもできるし、ループにできないことは再帰でもできない
機能的な差は一切ない
この点をしっかり押さえてない人間が何言っても説得力は皆無だろう
0764デフォルトの名無しさん
2015/11/05(木) 21:52:45.86ID:7jlVzvr30765デフォルトの名無しさん
2015/11/05(木) 21:56:30.80ID:8vWqbQMQインライン関数以外の関数すら使っちゃいけないよ。
極論するのであればスタックの深さはこの場合だってわからないからね。
関数だって自動変数の大きな配列取らないようにする程度の配慮は必要なわけで。
同じように再帰だって常識的にスタックあふれないものに使うか、
そうでなければ入り口で管理したり、深さ管理するだけで、
本質は変わらない。
極論にこだわってある種の処理に有効な手法の1つを切り捨てるのはどうかね。
0766デフォルトの名無しさん
2015/11/05(木) 21:59:45.53ID:7jlVzvr30767デフォルトの名無しさん
2015/11/05(木) 22:01:28.09ID:jSuDdQRW>>746-747の流れみてると、頭が悪いのはループ厨の方だけどなー
「再帰ができない人間は頭が悪い」→「再帰ができる人間は頭がいいのか?」なんて
「逆は必ずしも真ならず」という論理学の基礎の基礎すら分かってないとしか思えない
0768デフォルトの名無しさん
2015/11/05(木) 22:06:37.27ID:w1ErlqZKだから疑問系にしてあるんだろ
再帰が出来てもバカな奴が居るから、そういう存在が居るという事を匂わす
そういう意味も含めて、わざわざ疑問系にしているんだろ
むしろソコが本当に言いたい行間なわけだがwww
お前本当にバカだな、墓穴掘りすぎ
0769デフォルトの名無しさん
2015/11/05(木) 22:07:40.06ID:jSuDdQRW> だから疑問系にしてあるんだろ
そういう論法を「後出しジャンケン」って言うんだよw
0770デフォルトの名無しさん
2015/11/05(木) 22:09:02.58ID:7jlVzvr3いや相手がループ厨だと思ってる時点で周りが見えてないだろw
0771デフォルトの名無しさん
2015/11/05(木) 22:11:35.72ID:w1ErlqZK後出しも何も、元から疑問系で書いてあるだろ
0772デフォルトの名無しさん
2015/11/05(木) 22:18:39.03ID:I4yBwlZmならないよ。
>>762
同じように添字でアクセスできる、をどういう意味に取るかで玉虫色よね、それ。
短絡してるわけではなくて、実質そうでしょ。
文字の配列だよ。何て宣言する?
パスカル形式でも、終端ゼロでもね。
0773デフォルトの名無しさん
2015/11/05(木) 22:21:28.85ID:I4yBwlZmドヤと>>345に書いてあるけど。
普通ポインタで舐めるだろ。
0774デフォルトの名無しさん
2015/11/05(木) 22:24:02.53ID:w1ErlqZKって疑問系で聞いてるって事は、「本当はそうは思ってない」って意味も含まれているわけで
日本人ならそれぐらいは読み取れて当然なのでは
なんでこんなこといちいち説明しなきゃ理解できない人がいるのか謎なんだが
アスペかよ
0775デフォルトの名無しさん
2015/11/05(木) 22:28:11.19ID:AK774jdU再帰を使用しなくては書けないような未熟でレベルの低いプログラマは、
その自分が書いた問題だらけのダメダメなコードを、
こうした正常なプログラマに修正してもらわないといけない。
再帰厨は、他のプログラマの助けを得てそのコードを修正しないと
何も満足に仕事ができない。
0776デフォルトの名無しさん
2015/11/05(木) 22:32:04.15ID:I4yBwlZmevalの中にevalがある場合はどうスマートに処理しよう?
このへんどう、ループで解釈すれば良いかな。
何で再帰程度の事が自慢になるんだろう?
0777デフォルトの名無しさん
2015/11/05(木) 22:36:09.04ID:3yCl2VDvキューならいざしらず。
スタックに現状を積んで、続きを含めてループ。終わったらスタック戻してもとの状態に遷移。
中で必要があればさらにスタックを積んで…
今のレジスタ、PC積んで、ジャンプ
終わったら、レジスタとPC戻す。
中で必要があればさらに…
0778デフォルトの名無しさん
2015/11/05(木) 22:38:05.66ID:w1ErlqZK>ならないよ
↑なります、「スタックを使うループ」と「再帰」では全然違うコードになります
>実質そうでしょ。文字の配列だよ。何て宣言する?
std::string by C++
string by C#
String by Java
そのほかの言語でも大概は文字列用のクラスが用意してあるのが普通
なぜなら良く使うから
>>773
ポインタ演算が使えるのが前提だとC/C++とかになるけど
他のみんなもそうだけど、別にC/C++だけの話をしているわけではないので
0779デフォルトの名無しさん
2015/11/05(木) 22:41:35.49ID:w1ErlqZKそんなことは初めから分りきっているが、再発見のように言われても困る
しかし、スタックを使ったループは、スタックにスタックフレームを流用しない、というだけ
0780デフォルトの名無しさん
2015/11/05(木) 22:42:25.93ID:I4yBwlZm書いたよ。
文字列用のクラスなw
その中身って何?
かつ、それらについては、添字はナンセンスだよ。
添字のように見える、関数への引数だから。
cの話はしていなかったり、末尾再帰のある言語の話はしてなかったり随分蝙蝠じみたこと言うなぁ。
0781デフォルトの名無しさん
2015/11/05(木) 22:42:55.54ID:I4yBwlZm>>777は俺ね。駅のWi-Fi拾ってた。
0782デフォルトの名無しさん
2015/11/05(木) 22:46:30.51ID:I4yBwlZm再発見とはなんと。今更再発見したのか。
スタックフレームって何かわかる?
Cの実装が用意した、単なるスタックだよ。
gccとclですら違う。
あなた低レベル言語したことある?
0783デフォルトの名無しさん
2015/11/05(木) 22:49:36.76ID:L7+IyRN4クッソワロタ
0784デフォルトの名無しさん
2015/11/05(木) 22:49:58.53ID:w1ErlqZK>その中身って何?
文字列用のクラスが用意してあるから、文字列を配列と一括りに出来ないってだけの話だが
>末尾再帰のある言語の話はしてなかったり
末尾再帰でない再帰の出力コードは、ループを使ったものの出力コードと違う、と言っただけで
末尾再帰のある言語を省いたつもりはない
お前の日本語が危ないだけ
0785デフォルトの名無しさん
2015/11/05(木) 22:50:37.64ID:I4yBwlZm同じだよね。>>779で自分が言ったように。
0786デフォルトの名無しさん
2015/11/05(木) 22:51:14.88ID:w1ErlqZK0787デフォルトの名無しさん
2015/11/05(木) 22:52:08.18ID:I4yBwlZmじゃあ何が違うの?
まさかespとebpを使うか使わないか?
0788デフォルトの名無しさん
2015/11/05(木) 22:52:53.43ID:3yCl2VDv一括にできないのは、それがクラスだからだよ。
ダンプしてごらん。
0789デフォルトの名無しさん
2015/11/05(木) 22:52:56.85ID:w1ErlqZK0790デフォルトの名無しさん
2015/11/05(木) 22:53:50.30ID:I4yBwlZmスタックフレームって、ただのスタックだよ。
決まったレジスタ使うだけ。
0791デフォルトの名無しさん
2015/11/05(木) 22:57:52.12ID:L7+IyRN40792デフォルトの名無しさん
2015/11/05(木) 22:58:50.45ID:I4yBwlZm本質的に違う機械語になるらしいし。説明してくれるだろ。
0793デフォルトの名無しさん
2015/11/05(木) 22:59:03.18ID:w1ErlqZKダンプとか関係ないだろ
内部実装がどうなっているか気にしないのがOOPなので
実際には内部実装がどうなっているかも考えてプログラミングするが
概念の話をしているときはOOPの流儀に則る
0794デフォルトの名無しさん
2015/11/05(木) 23:03:07.10ID:I4yBwlZmOOPの流儀に則るんなら、添字とか言わないよね。
インデクサが省略されてるシンタックスシュガーで、flyweightパタンで実装されてるものって知ってるはずだもの。
そいつらのインクリメントやらforeachは、配列じゃないしね。
0795デフォルトの名無しさん
2015/11/05(木) 23:07:47.34ID:w1ErlqZK0796デフォルトの名無しさん
2015/11/05(木) 23:10:24.49ID:I4yBwlZmスタックフレームを使うから。
概念の話をする時は流儀に則る。なぜなら実装に拘らないのがOOPだから。
知識がお粗末すぎるわ。
プロでもアマでもマなのか、そうではなくパソコンの大先生なのか。
マなら、真摯に聞いて必死にgccのドキュメント漁れよ。少なくとも俺ならそうする。
だからお粗末のままだし、何言われてるかも理解できないんだろ。
>>795
インデクサの引数。
お前がstr[intIdx]と言ってるのは、
str.item(intIdx)そのものだよ。少なくともc#では。
0797デフォルトの名無しさん
2015/11/05(木) 23:15:32.52ID:w1ErlqZK再帰が批判されているのはスタックフレームを使うからだし
文字列を単に文字の配列と一括りにしないのは概念上の問題だから
しかたない
0798デフォルトの名無しさん
2015/11/05(木) 23:19:23.31ID:I4yBwlZmOOP知ったふうな口聞くなら調べてから書けよ。
>>797
ちぐはぐしてるのはお前だろ。
再帰が批判されてるのは、アホが組むとスタックフレーム()やスタック()を使い尽くすからであって、
勝手に定義したスタックを使うループも基本的には同じ問題をはらんでるんだよ。
インタプリタ作ってスタックフレーム実装すりゃわかる。あれはただのスタック。
概念上の問題であれば、上の話は理解できるよな。
概念上の問題でなく実装の問題であれば、後半は破綻するよな。
お前がちぐはぐなの。
0799デフォルトの名無しさん
2015/11/05(木) 23:21:17.81ID:I4yBwlZm到達手数、と言う他の手段では手に入れづらい情報まで得られるし、
到達深度で、これ以上はやめとこ、と出来るんだよ、再帰は。
0800デフォルトの名無しさん
2015/11/05(木) 23:22:46.94ID:I4yBwlZm概念上の問題だからと納得するな。理由を理解しろ。
0801デフォルトの名無しさん
2015/11/05(木) 23:23:59.61ID:I4yBwlZm0802デフォルトの名無しさん
2015/11/05(木) 23:27:03.24ID:w1ErlqZK>勝手に定義したスタックを使うループも基本的には同じ問題をはらんでるんだよ。
自分で確保したスタックはヒープを使うので違う
普通、スタックフレームは伸ばしたり縮めたり出来ない
ヒープに確保したスタックなら可能
0803デフォルトの名無しさん
2015/11/05(木) 23:28:37.39ID:w1ErlqZK>到達深度で、これ以上はやめとこ、と出来るんだよ、再帰は。
自分が本質的にスタックを使ったループは同じと言っておいて
これいかに
0804デフォルトの名無しさん
2015/11/06(金) 00:25:20.77ID:+IGrVkRe再帰も使うしループも使うんだよ。
0805デフォルトの名無しさん
2015/11/06(金) 00:40:35.63ID:Bf9sAILGLispは再帰呼出しを何回できるの?
ちなみにPerlは無限回だ。Perlは無限回だ。
0806デフォルトの名無しさん
2015/11/06(金) 07:34:11.50ID:2ILEtx8Ucpuに明確なスタックが存在するとは限らないのでスタックが理想的に伸長するかどうかはターゲットによる
0807デフォルトの名無しさん
2015/11/06(金) 07:54:44.19ID:iLvLfKdXやめとけ。
スタックフレームは、言語が用意した単なるスタックだ、を理解できてないんだ。
その辺突っ込んでも、実装はおいといて、概念としてって言われるぞ。
本質、実装、概念を蝙蝠のように使い分けてくれるさ。
ヒープに確保したスタックが、とか言い出すしね。
ヒープが溢れる溢れないは関係ないようだ。
ヒープもいくらでも拡張できるわけでもないのにね。
ヒープが下から、スタックフレームが上から、同じメモリを食ってくんだから。
ヒープが溢れると、スタックフレームも溢れてるし、
スタックフレームが溢れるという事はヒープも溢れてる。
実際問題全く同じなのに。
0808デフォルトの名無しさん
2015/11/06(金) 09:02:51.12ID:VF1V1DpN普通、スタックフレームは勝手に伸ばしたり出来ない
>ヒープが下から、スタックフレームが上から、同じメモリを食ってくんだから。
こんな実装じゃ、マルチスレッドが実装できないなww
0809デフォルトの名無しさん
2015/11/06(金) 10:09:10.72ID:iLvLfKdXなんだそりゃ。
そりゃマルチスレッドなら、スレッド毎にスタックフレーム確保するだろ。
それこそ、勝手スタックと同じでな。
疑問に思ったら、メイン関数で再帰して何回目で死ぬかと、
スレッド2つ起こして、そのスレッド内で再帰呼び出し呼んで何回目で死ぬかを比較して見ればいいよ。
ついでに/procの中身も見ればわかりやすい。
スタックの成長方向に関しては、だいたい下位方向だよ。
だからバッファオーバーランで任意の関数を呼ぶって攻撃が成り立つ。
0810デフォルトの名無しさん
2015/11/06(金) 10:47:43.57ID:iLvLfKdXヒープに確保したスタック、ってのは、ヒープに参照を確保してメモリのどこかに確保したスタック、なのかな。
そりゃそのスタックはアウトオブメモリまで使えるわな。
違う機械語にもなるだろうな。多段の間接アドレッシングするクソ遅くて不安定な機械語に。
それでも根本的解決をせずに、マージン確保して死ぬのを先延ばしにしてるだけだけど。
まともな解法のためにまともに組んだ再帰ではそんなこともないし、
そうではない再帰の事言ってるんだろうけど、それは「ループは無限ループする可能性があるから危険」くらい暴論。
0811デフォルトの名無しさん
2015/11/06(金) 11:12:47.56ID:LVZwl1iK> ヒープが下から、スタックフレームが上から、同じメモリを食ってくんだから。
こういう迷信信じ込んでる老害が一番厄介。
#include <stdio.h>
int x;
int main()
{
int z;
printf("%p %p %p\n", &x, &main, &z);
}
Windows7/64での実行結果
000000013F63DB38 000000013F6211E0 00000000002CFB80
手元ですぐ確認できるのはWindows7しかないけど、大抵の64ビットOSは
プライマリスレッドのスタックサイズは固定サイズでリンク時に決定だよ。おじいちゃん。
実メモリをコミットするのはまた別の話。
0812デフォルトの名無しさん
2015/11/06(金) 12:54:51.54ID:ldVrSRAZヒープが何かもわかってないゆとりかよ w
0813デフォルトの名無しさん
2015/11/06(金) 12:56:48.83ID:iLvLfKdX迷信ではなくて、単に環境依存だろ。
んなもんリンカで決まるし、ましてやWindows7ならASLR効いてるんじゃねーの?
基本知らないで話してるわけでもあるまいし、なんか釣ってるの?
0814デフォルトの名無しさん
2015/11/06(金) 13:29:16.84ID:LVZwl1iKzのアドレス00000000002CFB80が何を意味してるか分かるか? わかんねーだろうな。バカだから。
2,947,968番地って事だ。
ジジイが信じている迷信は
> ヒープが下から、スタックフレームが上から、同じメモリを食ってくんだから。
って事だが、スタックが上から使って言って残り3M以下なんだが、ヒープは何メガ使えるんだ? 爆笑。
0815デフォルトの名無しさん
2015/11/06(金) 14:09:49.10ID:+7OfKum10816uy ◆Qawu9.2l1E
2015/11/06(金) 14:35:20.47ID:44+lavHA0817デフォルトの名無しさん
2015/11/06(金) 14:54:15.84ID:W6j+1tCI0818デフォルトの名無しさん
2015/11/06(金) 14:55:35.21ID:W6j+1tCI0819デフォルトの名無しさん
2015/11/06(金) 15:15:31.42ID:LVZwl1iKF77じいさんはオムツの特売に並んでろ。
0820デフォルトの名無しさん
2015/11/06(金) 15:21:45.27ID:LVZwl1iKlinux忘れてたわ。突っ込まれる前に訂正。
プライマリスレッドのスタックサイズは固定サイズで起動時に決定だよ。おじいちゃん。
0821デフォルトの名無しさん
2015/11/06(金) 15:38:37.42ID:VF1V1DpN> ヒープが下から、スタックフレームが上から、同じメモリを食ってくんだから。
> ヒープが溢れると、スタックフレームも溢れてるし、
> スタックフレームが溢れるという事はヒープも溢れてる。
> 実際問題全く同じなのに。
これもうこの発言で終了じゃね?
0822デフォルトの名無しさん
2015/11/06(金) 15:44:51.97ID:iLvLfKdXそらそうだろう。
グローバル変数は.dataないし.bssに落ちて、
関数は.textに落ちて、そいつらはその辺のアドレスになるだろ。
メインスレッドのスタックは俺の環境でもその辺で、かつエントリポイントのヒープもその辺だわな。
固定サイズ、って、どこから固定サイズかわかってるのかなぁ。
デバッガで見てみりゃすぐわかるのに。
0823デフォルトの名無しさん
2015/11/06(金) 15:56:30.79ID:VF1V1DpNwwwww
0824uy ◆Qawu9.2l1E
2015/11/06(金) 16:11:44.79ID:Bw8X18sC味方にした国が負ける
0825デフォルトの名無しさん
2015/11/06(金) 18:19:40.96ID:ldVrSRAZで、ヒープはどこに行ったんだよ…
まさか 16進数の読み方でしかドヤれないのか w
0826デフォルトの名無しさん
2015/11/06(金) 18:26:57.75ID:iLvLfKdXヒープが溢れるという事はスタックフレームが溢れるのと同じ事、かな。
virtualallocやらしてりゃ別だけど。
要はスタックフレームは無視して、ヒープに勝手にスタック作ってそれを使って処理すれば再帰は要らなくて、
ループで処理出来る、って言いたいんだろうね。
どう考えても向いてない事も、ループでオッケー、と。
0827デフォルトの名無しさん
2015/11/06(金) 18:28:00.11ID:iLvLfKdXドヤってる訳じゃないけど。
自分で見てみれば?
0828デフォルトの名無しさん
2015/11/06(金) 18:58:03.51ID:ldVrSRAZいや、だからどこにヒープがあるんだよ
.bss, .data, .text とかはヒープって言わんぞ
0829デフォルトの名無しさん
2015/11/06(金) 19:08:39.94ID:LVZwl1iKお前、壊滅的に頭悪いな。
スタックが最下位の3Mにあるわけだ。さて、ヒープはどこにあるでしょう?
スタックより低アドレス? → スタックとヒープ合わせて3Mしか使えない。 大爆笑
スタックより高アドレス? → ↓これが嘘。 大爆笑
> ヒープが下から、スタックフレームが上から、同じメモリを食ってくんだから。
0830デフォルトの名無しさん
2015/11/06(金) 19:22:13.10ID:LVZwl1iKちげーよ。バカ。
プライマリスレッドのスタックは固定サイズ。
おじいちゃん達が現役だった頃と違ってヒープと奪い合わない。
Win64は先に示した通り。スタックは最下位に置かれる。
他のOSでも共有ライブラリなどの為にアドレス空間が予約されるので、ヒープとスタックは隣り合った領域には配置されない。
0831uy ◆Qawu9.2l1E
2015/11/06(金) 19:24:34.00ID:ctWMnKjq0832デフォルトの名無しさん
2015/11/06(金) 19:56:02.79ID:ZTXinl+H0833デフォルトの名無しさん
2015/11/06(金) 20:05:49.78ID:Jbsw4Wxaコレクションに対して繰り返し処理をする方法で、こんな分け方をしてみた
1. C の for 文のように添字を使って繰り返す。いわゆるループ
2. Java の拡張 for 文のように添字を使わないで繰り返す。1と3の中間
3. 高階関数を使う。
C (1) 今となっては低レベルに分類される言語なのでしょうがないか
Java (123) 基本的には2かな。ラムダ構文がJava8から導入されたので、これからは3に移行していきそう
C# (123) ラムダの導入がJavaより早かったので、2と3が混在している感じ
PHP (123) ほとんど使ったことがないのでよくしらないけど、基本的には2なのかな
Python (2) 添字ループはそもそも文法にないし、ラムダは使いにくいので必然的に2
Ruby (23) 一応文法として2はあるけど使ってる人はほぼ皆無。3が圧倒的
JavaScript(13) ラムダが最初っからあるんだけど、コレクションライブラリが貧弱すぎていまだに1が優勢
おかげでunderscoreやらjQueryやらangularにまでforeach関数が用意されるというカオス
Scala (3) for式はあるがこれはmapを使うただの糖衣構文。よって3のみ
0834uy ◆Qawu9.2l1E
2015/11/06(金) 20:09:11.87ID:Y2REc2we0835uy ◆Qawu9.2l1E
2015/11/06(金) 20:12:59.87ID:Bw8X18sChttps://lodash.com/
0836デフォルトの名無しさん
2015/11/06(金) 20:17:37.45ID:Jbsw4Wxaあるのは知ってるし、俺も使わせてもらってる (underscoreの記述はしたし、分かってもらえてるとは思うけど)
今回は言語+ビルトインライブラリの話をした
0837デフォルトの名無しさん
2015/11/06(金) 21:08:34.74ID:iLvLfKdXはー、なるほど。
今デバッガでステップで見てたけど、今のOSは賢いな。素直にこれは勉強になったわ。
やっぱCしなきゃならんな。
ずっと割と特殊な言語してるからな。
0838デフォルトの名無しさん
2015/11/06(金) 21:09:42.32ID:iLvLfKdX言語じゃなくて処理系だけどあるよ。
0839uy ◆Qawu9.2l1E
2015/11/06(金) 21:14:05.86ID:ctWMnKjq0840デフォルトの名無しさん
2015/11/06(金) 21:58:03.15ID:bdwf2snB0841デフォルトの名無しさん
2015/11/06(金) 22:29:45.01ID:iLvLfKdXどんな意図?
0842uy ◆Qawu9.2l1E
2015/11/06(金) 23:29:26.68ID:P+wdThaZ. : : : : : : : : : : : : : : : :| て 誰
/:: . : : : : : : : : : : : : : : | め だ
/:/: : : : : : : : : : : : : . : : :l | よ
/.:/ : : : : :i: : : : : : : : : : : : : } は
/.:/ . : : : : .:i : : : : :i: : 、: : : :ノへ、 /
/ ,′. : : : : : .:i : : : : :i: :i: '.: : :!::i:l\\ /
/: .′. : i: : :i..::i : : : : :i:斗rヤ笊仄 ハ i>‐----<: ゚.
. /: : ! . : : : i: : :i 人:. : : .:i::::.\l:斗-=ミ、}i|: : : :ハ: : : : : : ゚.
/: : : i:. : : : :i: : ;ャ≦ \::八:人〃斧笊ハ 刈ハ: : : l- 、: : : :|
. /: : : : i:. : : : :iX:八_ \ \:.\ 、 マ) .::i }} }:.:.i.:!h ハ: :. : |
厶 -‐ i:.: : : :∧ .〃斧�_ \ 、_.:ノ 八ノリ.ソ }: :!: :l
/ ̄ ̄ ̄ ̄ ̄\: :∧{ マ .:i / }ノ.ノ : |∨
ね 好 .い ヽ: ヘ 弋.:ノ , r<: : :ハ|
| き き �Y゚:. /.:.:∧.:{ j
ぞ 勝 な Vi:!:. , ¨フ V.:( )ノ
手 り W八 ー / ∨}
言 現 L__ ` .. / 〉- 、
っ れ √ ¨¨ ¬ ´ /_三二ニ=‐-
て て ; __ハ /. : : : : : : : : : : :
ん / ノ.:r'ヘ /: : : : : : : : :斗ャ≦
じ / /: / / : : : : : : 。≦ニ〃/
ゃ / /: : :/ /: : : : : : /三=‐ {{/
0843デフォルトの名無しさん
2015/11/07(土) 10:58:02.89ID:RwXev/UR> ヒープが下から、スタックフレームが上から、同じメモリを食ってくんだから。
> ヒープが溢れると、スタックフレームも溢れてるし、
> スタックフレームが溢れるという事はヒープも溢れてる。
> 実際問題全く同じなのに。
この発言の説明しろよ
特に
> スタックフレームが溢れるという事はヒープも溢れてる。
0844デフォルトの名無しさん
2015/11/07(土) 11:57:45.08ID:ptDOELGYヒープ領域に用意したスタックとループで実装し直してもアウトオブメモリになる危険性は変わらないよ!
ループや再帰が出てくる前の、アルゴリズムの見直しをしようね!
0845デフォルトの名無しさん
2015/11/07(土) 15:07:28.74ID:JLeExy5dもう説明したでしょ。
>>844
そのとーり。
0846デフォルトの名無しさん
2015/11/07(土) 15:28:58.81ID:RwXev/UR> ヒープが下から、スタックフレームが上から、同じメモリを食ってくんだから。
> ヒープが溢れると、スタックフレームも溢れてるし、
> スタックフレームが溢れるという事はヒープも溢れてる。
> 実際問題全く同じなのに。
全然説明になって無いね
0847デフォルトの名無しさん
2015/11/07(土) 19:07:11.11ID:aPHPZ3+uInterLisp-Dはスタックフレームはヒープ上に取るから仮想記憶が尽きるまで。
ちなみに実行を止めてダンプを持ち運べば別のマシンで再開できた。
0848uy ◆Qawu9.2l1E
2015/11/07(土) 21:38:02.16ID:Rb6TxNfK0849デフォルトの名無しさん
2015/11/07(土) 22:12:39.02ID:k3SZd1ks再帰は関数の最後まで見ないと繰り返しの処理をやってるかわからないんだよ。
これを見て欲しい。
function testA() {
...(数百行)
testA();
}
一方ループは関数の先っちょあたりで、あこれは繰り返し処理をしてるな
っていうのが即座に判明する。プログラムの構造が人間の理解を助ける。
これを見て欲しい。
function testB() {
for (int i = 0; i < 1000; i++) {
...(数百行)
}
}
この事実を知ってもなおあなたは再帰を支持しますか?
0850デフォルトの名無しさん
2015/11/07(土) 22:27:57.81ID:k3SZd1ks処理が遅いしスタックオーバーフローするし、使いどころが
あまりないよね。
0851uy ◆Qawu9.2l1E
2015/11/07(土) 22:35:01.57ID:0QRugbs1Mumei_saiki_kakkoloopwara do |f|
処理
f.call
end
これが再帰て言ってもわからないよね。。。。。
0853デフォルトの名無しさん
2015/11/08(日) 04:56:54.05ID:36/ICdkK0854デフォルトの名無しさん
2015/11/08(日) 08:58:38.41ID:ruUsjfQ4>>106でそれのパクリ元は外出
0855uy ◆Qawu9.2l1E
2015/11/08(日) 09:37:12.54ID:w/pNyAon0856デフォルトの名無しさん
2015/11/08(日) 09:46:42.44ID:ruUsjfQ4無知を自慢しなくても良い
0857デフォルトの名無しさん
2015/11/08(日) 10:40:01.80ID:D4jx3nEwありえねえ。ループのたびに関数作るのかお前は。
関数ヘルだな。
0858デフォルトの名無しさん
2015/11/08(日) 11:43:39.05ID:zIxOYVPQ処理が長い場合、タスク分割のために関数・メソッドにしておくのはごく一般的な事。
プログラマとして仕事したいなら、働く前にリーダブルコードを読んでおくといいよ。
0859デフォルトの名無しさん
2015/11/08(日) 11:58:26.23ID:EqVtngVcあのな、そのレベルのものを、再起だとかループだとかいう時点でおかしいと気づけ。
例えば、
parseDoc(lpStr) {
:
みたいな関数で、while(...)で、strが尽きるまでループしている中で、
if(cmd=="eval") lpStr=parseDoc(lpStr);
みたいに使えば、あ、同じ構造を処理してるんだな、終わったらポインタが進むんだなって一目でわかるでしょ。
これを理解した上で、勝手スタックに今のポインタ値保存して、必要なら変数も保存して、終わったら戻す、みたいな処理のほうが良いなら、説明してほしいわ。
あと関数数百行はおかしいから。
80行〜120行でも長大関数。
0860デフォルトの名無しさん
2015/11/08(日) 13:05:36.05ID:D4jx3nEw本のタイトル知ってるだけのシッタカさんお疲れ様です。
0861デフォルトの名無しさん
2015/11/08(日) 13:07:41.95ID:D4jx3nEw何を言っとるんだチミは。
0862デフォルトの名無しさん
2015/11/08(日) 13:08:56.74ID:D4jx3nEwそれらを読み解けなければやっていけない。
0863デフォルトの名無しさん
2015/11/08(日) 13:31:25.99ID:YL2+Mlqr0864デフォルトの名無しさん
2015/11/08(日) 13:48:33.01ID:hJdCHUnW何に疑問持たれてるかわからん。
>>862
仕事でプログラムしてるけど、そんな関数書いたらQCレビューではねられるよ。
そんなレビューもない会社なら別だけどさ。
0865デフォルトの名無しさん
2015/11/08(日) 14:00:37.62ID:D4jx3nEw>>859は全面的に何を言いたいのかわからない内容だ。
小企業のジコマンレビュー受けて書きなおせば?w
0866デフォルトの名無しさん
2015/11/08(日) 14:02:48.23ID:YL2+Mlqr0867デフォルトの名無しさん
2015/11/08(日) 14:03:30.47ID:D4jx3nEw関数は1000行超えてからやっと新人卒業って感じかな。
ベテランになると万超えるよ。
0868デフォルトの名無しさん
2015/11/08(日) 14:04:39.12ID:D4jx3nEwなんのためのレビューだよw
レビューしなきゃ不安になるような人員雇ってる時点でお察しだわw
SIerか?じゃあしょうがないよね。
0869デフォルトの名無しさん
2015/11/08(日) 14:06:39.84ID:D4jx3nEw0870デフォルトの名無しさん
2015/11/08(日) 14:09:05.13ID:D4jx3nEwよしこれからドメイン駆動開発だ!とか言っちゃってんじゃないの?w
プログラム業界の中二病ですわwwww
0871デフォルトの名無しさん
2015/11/08(日) 14:11:08.30ID:YL2+Mlqrそこまで余裕ないの?
0872デフォルトの名無しさん
2015/11/08(日) 16:34:19.49ID:ezMQjLzR読まないけど。
0873デフォルトの名無しさん
2015/11/08(日) 17:13:32.26ID:ruUsjfQ4行数の制限はないけど、他の項目で引っかかってても不思議じゃない。それくらいアホ。
0874デフォルトの名無しさん
2015/11/08(日) 17:19:54.12ID:krAhSW9o社員教育してない会社のコードは凄い事になってる。
0875デフォルトの名無しさん
2015/11/08(日) 17:27:16.44ID:Ai/4n8j5再帰処理しているような極悪コードが見逃されてしまう。
0876デフォルトの名無しさん
2015/11/08(日) 17:39:39.08ID:ayKNhgcG0877デフォルトの名無しさん
2015/11/08(日) 18:00:06.71ID:ruUsjfQ40878デフォルトの名無しさん
2015/11/08(日) 18:43:05.21ID:Ai/4n8j5現実世界と回s利しまくり。
これが永遠ヒキニートの再帰厨の現実。
再帰アルゴリズムを見るだけですさまじい苦労なんだろう。
0879デフォルトの名無しさん
2015/11/08(日) 18:54:26.34ID:krAhSW9o0880デフォルトの名無しさん
2015/11/08(日) 18:57:00.93ID:ezMQjLzR0881デフォルトの名無しさん
2015/11/08(日) 19:03:15.46ID:ruUsjfQ4バカを使うためには難しい事を禁止して、バカの能力の範囲内で使う事が肝要。
0882デフォルトの名無しさん
2015/11/08(日) 19:53:59.36ID:krAhSW9o問題はバカ上司。効率が落ちるのは必至。ジョブが頓挫してもおかしくない
0883デフォルトの名無しさん
2015/11/08(日) 20:03:50.49ID:HEL0zLh3お前アホなのかな。
何なんだろう。コードが長くて一人前はあり得ないわ。
不安だからレビューするんじゃなくて、品質をより上げるためにレビューするんだけどなぁ。
俺は医療だけど。スタンプラリーが10箇所超えてる。
0884uy ◆Qawu9.2l1E
2015/11/08(日) 20:26:12.13ID:w/pNyAon質問です。
無名再帰がパクりってな に?
無 名再帰がパクりって なに?
無名 再帰がパクりっ てなに?
無名再 帰がパクり ってなに?
無名再帰 がパク りってなに?
無名再帰が パ クりってなに?
無名再帰がパ クりってなに?
無名再帰が パク りってなに?
無名再帰 がパクり ってなに?
無名再 帰がパクりっ てなに?
無名 再帰がパクりって なに?
無 名再帰がパクりってな に?
無名再帰がパクりってなに ?
0885uy ◆Qawu9.2l1E
2015/11/08(日) 21:52:16.34ID:hjGS9Lf9r'三三三三{ .ノ┌‐┐ ./≠::::::::::::::::::::::::::::::::::ミx、 ノ'´ | 繰 .| Y三
乂三三三ニ] ノ ツ {:::::::::::::::::::::::::::::::::::::::::::::`' 、__ | り | ノ'"´
 ̄⌒^フ圦 ,,'" ̄::::::::::::::::::::、:::::::::::::ヽ:::::::::::::< ∠. 返 | ,/
ミx、 `三≧=-、_/:::::::::::::::::::::::::::::::::::::ヽ::::::::::::∨:::::::::::::ヽし|. : .|
三L、 /::::::::::::::::::::::::::斗┼ヘ∧::::::::::::i::::::::::::::::: L.| 文 .|
三ヘ三彡⌒ー ∠._/:::::::::::::::i:::::::::∧| ,x'"芯ミ、::::::::|:::::::::≧=- \ / -=≦彡
.':::::::::::::-┼''"/ { _r} }}::::::::::::::::::::::/ ̄ \
, {:::{:::::∨〃芯 ‘¨” '"}:::/^!::::::::::| : .こ |
≧=-'´ Vヘ:::::::'.::...ヒ:ノ ノイ ,|:::::: /| : の |
ヽ:::ヘ:::::「 ` U _ノ:|::::::/ | : 感 |
` ヘ/ く_ 〕 .|ハ::∧/ .l !! .じ |
` .,_ / | .}' . \___./
丁 L...、 i
i .i|;iノ」 ´__ `ー|l!、 i|
rl | 川' ./ / r 'rー‐-、`i|:l! ヽ | ll
/| / ̄/ / └' ノ⌒`´ |x、 /
./∧ / ./ ノ 二二ユ ヽ、 ソ''
ノ {:l:l}/--/ ア 二二,フ {ハ ッ
,廴__>'" 〈{ 乂_ ノ ̄ ̄ l }
0886デフォルトの名無しさん
2015/11/08(日) 22:19:47.99ID:D4jx3nEw昔々、恐竜が生きていた時代に条件分岐や繰り返しと行った処理は
ぜんぶgoto文で行われてた。ダイクストラさんはそれがわかりにくいってことで
goto文は有害と思われると言って構造化プログラミングを提唱した。
今日のプログラム言語は条件分岐に用いるif文や繰り返しに用いるfor,whileといった
専用の構文を用意している。もはや構造化を意識する時代じゃないし、
JavaやRubyのようにオブジェクト指向の言語を使えば自動的にオブジェクト指向になる時代だ。
お前は時代遅れの原始人ってことを自覚するべきだと思われる。
0887デフォルトの名無しさん
2015/11/08(日) 22:20:40.52ID:D4jx3nEwuyさんごめんなさい。uyさんごめんなさい。uyさんごめんなさい。
0888デフォルトの名無しさん
2015/11/08(日) 22:43:10.55ID:D4jx3nEw構造化にしてもオブジェクト指向にしても、それらはプログラムを管理しやすくするための技術だ。
あくまでもプログラムを管理するという目的があってその目的を達成するための手段の一つ。
ところがろくに知識のない知ったかぶりっ子は往々にして手段と目的を取り違える。
関数を分割すること、オブジェクトを分けること、デザインパターンを使用すること
その作業そのものを目的にしてしまう。十分にわかりやすいプログラムであっても
関数が分かれていないからわかりにくいプログラムだと思い込んでしまう。
ご本を読んでわかった気になってる経験の浅いニワカ野郎が陥る落とし穴だ。
俗にいう意識高い系である。
0889デフォルトの名無しさん
2015/11/08(日) 23:57:20.92ID:QYMRsb+20890デフォルトの名無しさん
2015/11/09(月) 00:15:38.69ID:tkNS1IWMスレタイよく見ろ。なるかどうかじゃない、好きかどうかを言えよ!(ドン!!)
0891uy ◆Qawu9.2l1E
2015/11/09(月) 00:28:47.36ID:VILofMhT再帰 → スタックと引数を使うから↑の変数宣言いらない
↑全てのループと再帰は末尾最適化して書ける
→ 再帰厨の勝ち
0892デフォルトの名無しさん
2015/11/09(月) 00:50:25.68ID:tkNS1IWM再帰でやるにしても配列と序数の管理は必要でしょうに。
引数つまりローカル変数を書き換えていくっしょ。
public class Test {
public static void main(String[] args) {
int[] a = IntStream.range(0, 10).toArray();
rec_each(a, 0);
}
static void rec_each(int[] array, int index) {
if (array.length <= index) {
return;
} else {
System.out.println(array[index]);
rec_each(array, index + 1);
}
}
}
0893デフォルトの名無しさん
2015/11/09(月) 01:41:23.27ID:fyLz/sBu↓これのどこがわからないんだろう? >>106が読めないのか?
>>854
| >>851
| >>106でそれのパクリ元は外出
0894デフォルトの名無しさん
2015/11/09(月) 08:09:11.20ID:KQW6HPEX関数使った時点で自動宣言されてるよ
専用機でもない限り宣言されないスタックなんてない
結局、再帰もループも使う側の概念の問題で、
具体的な違いなど見つからない
0895uy ◆Qawu9.2l1E
2015/11/09(月) 09:00:44.47ID:iJi5V/lcインデックスのない再帰の例
# 最上位ノードのシンボルを得る
def top_symbol
return up.top_symbol if up
symbol
end
そして1関数の再帰の話というよりデータの管理方法の話だ
例えばクラスAのインスタンスが複数個必要な時、
ループ厨は配列で管理するけど、
再帰厨様はツリーで管理するから、その分の配列宣言が不要
>>893
は?
>>894
は?
0896デフォルトの名無しさん
2015/11/09(月) 09:34:59.77ID:VSFTuqKTアセンブラに毛の生えたような言語使ってるけど真剣に思う。
0897デフォルトの名無しさん
2015/11/09(月) 09:40:27.96ID:KQW6HPEX0898uy ◆Qawu9.2l1E
2015/11/09(月) 09:51:00.11ID:iJi5V/lc君のような知恵のチンパンに、この事実を伝えるのは難しいけれど
"コンパイラ"が宣言してる内部変数と
ソースコード上で"宣言している変数"は別物だよ
0899uy ◆Qawu9.2l1E
2015/11/09(月) 09:51:56.06ID:iJi5V/lc0900デフォルトの名無しさん
2015/11/09(月) 09:52:48.66ID:Yjqxj+LL使わないと高速化が厳しい。
適材適所。
0901デフォルトの名無しさん
2015/11/09(月) 10:03:11.90ID:ddVcBsOPコンパイラの知識が0なんだろうな
0902uy ◆Qawu9.2l1E
2015/11/09(月) 10:04:21.36ID:iJi5V/lcf e d c b a を up という変数でつなぎ合わせた場合
a.up # => b
a.up.up # => c
a.up.up.up # => d
a.up.up.up.up # => e
a.up.up.up.up.up # => f
a.up.up.up.up.up.up # => nil
こんな状態になるわけだけど
p func a # => f
で f を取得したいときに関数funcはどのように書きますか?
def func z
...
end
-----------------
ちなみに再帰だと
def func z
return func z.up if z.up
z
end
こうなりますけど
ループでかけんの?
0904デフォルトの名無しさん
2015/11/09(月) 10:08:48.44ID:fyLz/sBu>>>893
>は?
バカ自慢しなくて良いぞ。
0905デフォルトの名無しさん
2015/11/09(月) 10:13:10.33ID:ddVcBsOP哀れな奴だな
2chでコテハンつけて自己主張か
自殺したほうがいいんじゃない?
0906デフォルトの名無しさん
2015/11/09(月) 10:16:16.49ID:ddVcBsOPコテハンにしてなにしたいんだろうこの馬鹿は
0907uy ◆Qawu9.2l1E
2015/11/09(月) 10:16:21.37ID:iJi5V/lcまた勝ってしまったのか
0908デフォルトの名無しさん
2015/11/09(月) 10:17:20.17ID:ddVcBsOP自分の頭がおかしいということに早く気付いたほうが良い
0909uy ◆Qawu9.2l1E
2015/11/09(月) 10:23:53.90ID:iJi5V/lcとかいってもコードかけなきゃ何にもならんけどね
0910uy ◆Qawu9.2l1E
2015/11/09(月) 10:31:16.12ID:iJi5V/lcvar.next.next.next.next.next.next.next
というリストを
ループで辿れるか?という話だよ
基本は再帰
ループでやるなら文字列を連結してevalでもしないと無理
0911uy ◆Qawu9.2l1E
2015/11/09(月) 10:37:25.00ID:VP0GkkkJループでもいけたからevalの話は忘れてほしい
0912デフォルトの名無しさん
2015/11/09(月) 10:42:36.97ID:ddVcBsOP0913uy ◆Qawu9.2l1E
2015/11/09(月) 10:44:54.23ID:VP0GkkkJ0914デフォルトの名無しさん
2015/11/09(月) 10:46:48.42ID:ddVcBsOP誰かが自演するとでも思っているのだろうか
自意識過剰にほどがあるな
0915デフォルトの名無しさん
2015/11/09(月) 10:51:04.65ID:KQW6HPEX2ちゃんねるって俺の考え方が正しくないと嫌だもん、みたいなのが多いな
0916デフォルトの名無しさん
2015/11/09(月) 11:26:12.30ID:VSFTuqKT最初の要素を貰って、変数に参照を保存する、
upがある限りループで参照を入れ替え続けて、無くなったらreturnすればいいんでないの?
ずっと再帰推しだけど、これは流石にループに部がある。
0917デフォルトの名無しさん
2015/11/09(月) 11:32:30.11ID:VSFTuqKT再帰でコントロールを持つコントロールをレイアウトして、それをレイアウトするのか、
ループで、コントロールに入りましたよ、とスタックを積んでから、配置して、結果こうだったよ、とレイアウトの続きをするのかだと、わかりやすいと思う。
ループの方は、その要素が変わった時全体書き直さない限りわからん。頭から舐める必要がある。その要素だけが変わった、は持てないか、ツーパスになる。
再帰だと、親要素のレイアウトに子要素全体が影響するだけだから、再レイアウト時にはその要素だけをまずレイアウトして、影響があるように変わったら上位を計算すればいい、とか。
今適当に書いたけど。
0918uy ◆Qawu9.2l1E
2015/11/09(月) 11:47:26.21ID:VP0GkkkJループ
def func z
loop do
z = z.next
return z if not z.next
end
end
再帰
def func z
return func z.next if z.next
z
end
末尾再帰
def func z
if not z.next
return z
else
func z.next
end
end
0919デフォルトの名無しさん
2015/11/09(月) 11:51:03.82ID:ddVcBsOP死ねカス
0921デフォルトの名無しさん
2015/11/09(月) 12:14:37.80ID:ddVcBsOP死ね
0922uy ◆Qawu9.2l1E
2015/11/09(月) 12:19:00.07ID:VP0GkkkJループ
[:res => 918 , :anka => 902]
[:res => 919 , :anka => 918]
[:res => 920 , :anka => 919]
[:res => 921 , :anka => 920]
再帰
[:res => 921 , :anka => [:res => 920 , :anka => [:res => 919 , :anka => [:res => 918 , :anka => nil]]]]
0923デフォルトの名無しさん
2015/11/09(月) 12:19:26.74ID:ddVcBsOP消えろ
0924uy ◆Qawu9.2l1E
2015/11/09(月) 12:20:37.26ID:VP0GkkkJもうだめぽ
0925uy ◆Qawu9.2l1E
2015/11/09(月) 12:22:42.09ID:VP0GkkkJよく聞いてください
僕は昨日18時に起きました
で、明日晴れてたらお出かけするんで今寝るわけにはいかない
最低でも夕方まで起きて早くても明日の午前2時以降に起きる生活リズムにして
昼と夜の生活リズムを正さないと明日でかける事はできません
わかりますか?眠いんです。
0926デフォルトの名無しさん
2015/11/09(月) 13:48:10.17ID:hqP7pMYo頑張ってください
0927デフォルトの名無しさん
2015/11/09(月) 14:56:28.79ID:9923iS2bコンパイラは何のために誰に宣言してるわけなんですか?
0928uy ◆Qawu9.2l1E
2015/11/10(火) 02:21:33.22ID:rHJUCiJo0929デフォルトの名無しさん
2015/11/11(水) 10:08:59.97ID:3OG8SHn/さっさと治療しろ。
病院行け。
0930uy ◆Qawu9.2l1E
2015/11/11(水) 23:54:56.35ID:8UWeoNQX0931デフォルトの名無しさん
2015/11/12(木) 17:08:37.97ID:JhLVklBV0932デフォルトの名無しさん
2015/11/17(火) 06:28:37.62ID:NQ6PWML2subset([],[]).
subset([A|B],[A|C]) :-
subset(B,C).
subset([A|B],C) :-
subset(B,C).
?- subset([1,2,3],X).
X = [1, 2, 3] ;
X = [1, 2] ;
X = [1, 3] ;
X = [1] ;
X = [2, 3] ;
X = [2] ;
X = [3] ;
X = [].
?-
0933デフォルトの名無しさん
2015/11/17(火) 11:03:27.90ID:zy6fUDwBPrologスレが過疎ってるから
そっちにも書いてくれよ。
0934デフォルトの名無しさん
2015/11/19(木) 09:00:29.66ID:ZCMzj2rh現代の歴史家は2人が失読症ではないかと疑っている。
https://twitter.com/okdshin/status/666903312151613440
0935デフォルトの名無しさん
2015/11/19(木) 13:53:23.84ID:sezybF4H0936デフォルトの名無しさん
2015/11/21(土) 04:03:24.93ID:w+2inzGVまあよく頑張った方。
Cのマクロのシンタックスシュガー上がりの言語としては。
0937デフォルトの名無しさん
2015/11/22(日) 09:09:47.14ID:Zrtw+QZihttp://anago.2ch.net/test/read.cgi/bizplus/1448106828/
NTPをカンタンに説明すると、
・1900年1月1日0時0分0秒が基準(=スタート時刻)
・1秒ごとにカウンタが1加算される
・カウンタは32ビット=4,294,967,295まで
仕様になっている。つまり設計の段階から、
・1900年1月1日0時0分0秒 + 4,294,967,295秒 = 2036年2月6日6時28分15秒
までしか管理できない仕組みになっているのだ。
0938デフォルトの名無しさん
2015/11/22(日) 10:56:07.31ID:Sy1sSdDlNTPは解決済みです。
0939デフォルトの名無しさん
2015/11/22(日) 14:31:54.99ID:yPUHF/WV今時何を言ってるんだよ…
メジャーなシステムは 64bit になってる
0940デフォルトの名無しさん
2015/11/22(日) 14:39:01.10ID:QRD2Q6hyそんなことない。信頼性が必要なところはレガシーなシステムによって
支えられている。主役はDOSやUnix。64bitは新しもの好きのキモオタしか使ってない。
Windows 3.1の障害によりパリ=オルリー空港が一時閉鎖の事態に
http://gigazine.net/news/20151116-windows-3-1-alive/
0941デフォルトの名無しさん
2015/11/22(日) 15:01:19.79ID:3DWgrAn1で、そのアホシステムがインターネットの崩壊に何の関係があるんだよ、爺
0942デフォルトの名無しさん
2015/11/22(日) 15:04:38.35ID:QRD2Q6hyバカ野郎!インターネットの根幹は信頼性の高いシステムによって
支えられてるんだぞ。つまり、DOSやUnixがその役割を担っているわけ。
お前らキモオタが使ってる最末端のクライアント端末とはわけが違うのだよ。
インターネットは2036年に崩壊する。
0943デフォルトの名無しさん
2015/11/22(日) 15:31:11.74ID:yPUHF/WV具体的なルーターやサーバーの型名書いてからほざけよ、爺
0944デフォルトの名無しさん
2015/11/22(日) 15:37:00.48ID:QRD2Q6hyなんで具体的な製品名言わなきゃいけないわけ?
じゃあお前が本名名乗れよ木偶の坊。
0945デフォルトの名無しさん
2015/11/22(日) 15:58:54.98ID:yPUHF/WV過去の古ぼけた知識で語ってるのがミエミエだからだよ w
0946デフォルトの名無しさん
2015/11/22(日) 16:43:37.22ID:QRD2Q6hyじゃあてめえが木偶の坊であることが見え見えだから本名言えよ。
0947デフォルトの名無しさん
2015/11/22(日) 17:13:34.49ID:sysF3yQ7> 信頼性が必要なところはレガシーなシステムによって
> 支えられている。
妄想です。ごく一部。
> 主役はDOSやUnix。64bitは新しもの好きのキモオタしか使ってない。
UNIXはLP64が最初に普及したOSグループの一つです。
それから64bit計算モデルと
time_t相当が64bitになってるかどうかってのは別問題です。
0948デフォルトの名無しさん
2015/11/22(日) 17:48:29.34ID:yPUHF/WV人に名前を聞くなら、まず自分から名乗れよ
爺の癖に礼儀も知らんとか、終わっとる
0949デフォルトの名無しさん
2015/11/22(日) 18:16:07.42ID:QRD2Q6hy何そのクソレス。超つまんない。
0950デフォルトの名無しさん
2015/11/22(日) 18:33:15.65ID:yPUHF/WVとか思ってるのか… w
0951デフォルトの名無しさん
2015/11/22(日) 18:35:14.68ID:QRD2Q6hy0952デフォルトの名無しさん
2015/11/22(日) 18:36:49.01ID:QRD2Q6hy支えられている。主役はDOSやUnix。64bitは新しもの好きのキモオタしか使ってない。
Windows 3.1の障害によりパリ=オルリー空港が一時閉鎖の事態に
http://gigazine.net/news/20151116-windows-3-1-alive/
0953デフォルトの名無しさん
2015/11/22(日) 19:06:23.08ID:fBu/dhDiそれくらいパッチ当ててるよ。
2004年に当ててるベンダーと当ててなかったアホが浮き彫りになったっしょ。
レガシーなシステム語る割には歴史しらんのな。
0954デフォルトの名無しさん
2015/11/22(日) 19:16:49.35ID:yPUHF/WV早めに病院行けよ w
0955デフォルトの名無しさん
2015/11/22(日) 19:38:44.08ID:QRD2Q6hy爺こわくてもう書き込めなーい
0956デフォルトの名無しさん
2015/11/22(日) 19:39:55.27ID:QRD2Q6hy2036年が楽しみだな。
俺は予言するよ。インターネットは2036年に崩壊する。
0957デフォルトの名無しさん
2015/11/22(日) 20:28:02.04ID:eGBlL0Yyゴルァ
0959デフォルトの名無しさん
2015/11/22(日) 20:58:10.93ID:eGBlL0Yy知恵遅れはこの板を去れ
0960uy ◆Qawu9.2l1E
2015/11/22(日) 21:11:26.75ID:i67Ztnvyこのスレの人たちのようなカスPGが世界中にいて
あろうことかそういう大勢のカスたちによってネットリソース作られてて
尽くハードコーディングするから更新出来ない
0961デフォルトの名無しさん
2015/11/22(日) 21:37:21.29ID:eGBlL0Yyカスはカス。
0962デフォルトの名無しさん
2015/11/23(月) 12:59:05.74ID:w0CpmHEa>>949
0963デフォルトの名無しさん
2015/11/23(月) 13:16:42.22ID:Rh/Dsjk/FORTAN77しか使えないおじいちゃん
0964デフォルトの名無しさん
2015/11/23(月) 21:10:33.27ID:dBtJs0Pgパーサージェネレータを使ったことがあるなら、コンフリクトエラーだとかambiguousエラーだとかに出くわすたびに、
隔靴掻痒のデバッグをしたことがあるはず。
0965デフォルトの名無しさん
2015/11/23(月) 21:28:39.86ID:TysZvHtWただ外に出す商品には、再帰無しに改善しないとね。
遊びや実験じゃあないんだから。
パーサーが再帰がないと書けないなんて考えてるなんて
非常識でプログラミング技術が低過ぎ。
パーサージェネレータで手こずってる段階から、早く抜け出すべき。
0966デフォルトの名無しさん
2015/11/23(月) 21:42:40.28ID:FbIB0zhM再帰好きの反対が再帰嫌いだと思うなよ馬鹿w
0967uy ◆Qawu9.2l1E
2015/11/23(月) 22:26:15.06ID:QX2C8YaDオブジェクト指向みたいのは努力でどうにかなるけど
再帰やツリーを頭の中でイメージしてコードを書く能力は
経験積んでもゼロな奴は一生ゼロw
wwwwwwwwwwwwwwww
0968デフォルトの名無しさん
2015/11/23(月) 22:38:00.61ID:TysZvHtW低レベル無能プログラマの妄想だね。
もっとも、こんな発言が出るような下らない所だから
再帰厨のような危険人物が野放しにされてしまうのだろう。
0969デフォルトの名無しさん
2015/11/23(月) 22:51:55.10ID:v536Eh0y再帰は普通に使われてるよ
0970デフォルトの名無しさん
2015/11/23(月) 22:52:33.64ID:dBtJs0Pgだから、そういう人はパーサをどう書くの?って聞いてるの。
jsonでもいいよ。どう書くの?
0971デフォルトの名無しさん
2015/11/23(月) 22:55:01.99ID:FbIB0zhMお前再帰って言いたいだけやろw
0972デフォルトの名無しさん
2015/11/23(月) 22:56:36.23ID:8hTjJ7jG0973デフォルトの名無しさん
2015/11/23(月) 23:02:54.56ID:FbIB0zhMあぁそうだね、300個の還元/還元衝突だね。
あれは文法を変換したりすれば消すことが出来るよ。
というかCやJavaの仕様書に載ってる文法が(LALR解析表を作る上では)クズすぎるのが原因だから、
同じ文を受理する曖昧性のない文法を導出すれば済む話。
あるいはGLR法を試してみたら?再帰を一切使わず実装できるよ?
>>972
continuationとループを使って実装すれば良いんじゃないかい?
>>973
任意の再帰は、不動点コンビネータが使えるならば、再帰を持たない関数だけで表現できる。
不動点コンビネータは、S関数とK関数、I関数により表現できる。例えばY=S(K(SII))(S(S(KS)K)(K(SII))) (by Wikipedia)
S関数とK関数とI関数はそれぞれチューリングマシン上でエミュレート出来る。
なのでチューリングマシン自体に再帰の機能が無くても、再帰は使える。
0976デフォルトの名無しさん
2015/11/24(火) 15:36:37.93ID:vXeBzDQXそこで継続とループを使う時点でCPSと何も変わらんでしょ。
でも正確に「言語が提供する再帰機能」を使わずに実装できるよ!やったね!
ジョークだけどなw
0978デフォルトの名無しさん
2015/11/24(火) 16:40:27.57ID:vXeBzDQX言語が提供するスタックを使わないから安全である、って馬鹿らしい結論に至るからなぁww
それアセンブラでオレオレ言語のコンパイラでも書いたら?みたいな話になっちゃう。
まぁループはループで、無限ループ+メモリ確保しまくりのコンボをキメられたら
どの辺が安全なのか分からなくなるけどなww
ガリガリガリガリ現在スワップ使用量20GiBガリガリ
結局の所言語や問題に適した方法を取るのが一番だよな。
手で書くならパースは再帰で、但しASTのevaluationはループ+継続で。
# そういや昔、某和製コンパイラの「ループが時々うまく動かないバグ」に引っかかって
# 仕方なくそこだけ末尾再帰で書き直した事があったなぁ
# (3バイトの前方ジャンプ命令と5バイトのそれのどちらをバイナリに埋め込むべきかという判定のミスで丁度いい長さのループが誤動作する問題)
0980uy ◆Qawu9.2l1E
2015/11/24(火) 18:31:41.35ID:lNjW2jsswwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
0981デフォルトの名無しさん
2015/11/25(水) 02:57:30.93ID:Qex1VIVs0982デフォルトの名無しさん
2015/11/25(水) 14:44:52.18ID:DpLrT1vG何らかのパターンがないと目に見えない
パターンがある場合主題の変奏がその周りにある
パターンは再帰的
再帰は主題を定分ずらした変奏で
それも一つのメタパターンだ
この指で触れられるものを探す
0983デフォルトの名無しさん
2015/11/25(水) 19:12:42.88ID:9hpYpU80デュエル・マスターズ的な非電源TCGの 《 オンライン化ツクール系ソフト 》 制作の企画。
例えば、ガチンコ・ジャッジを直ぐにでも導入できる機能を持っておりながら、
当面それを扱わず単純化させておいて、事後的に導入拡張する際に当該システムを
ブロック構造の組み合わせで後付け挿入できるように予めシステム化してあるソフト(エディター)。
既存の非電源TCGを劣らずに再現できるならば大概のニーズに応えられる筈。
バトスピ、ヴァンガ、ウィクロス、ポケカ、デジモン、ゼクス、モンコレ、ガンダム・ウォー、ライブオン、ディメンション・ゼロ、カードヒーローなど
のシステムを完全再現できるように設計するけど、他に此のTCGの此のシステムは再現希望とか有ったら書いて。
マジック:ザ・ギャザリングの全システムを完全に再現するのは無理だから、此れだけは必用だ!って部分のみリクエストして。
WEB通信での対戦は、個vs個、多数乱戦、チームvsチーム、個vsチームを可能な仕様とする方針。
設計思想は 《 RPGツクール 》 が良いかな? 他に、優れたエディター有ったら挙げてみて。
個人や企業などのベンダーが提示する開発費(見積もり)で折り合えば、発注する。
↓
エディター群から基本コンセプトを絞り込む(もちろんオリジナルで優れた新ネタが有れば導入する)。
↓
遊戯王OCGに関しては、タッグフォース、ADS、デュエルオンラインを発注先ベンダーに研究させる。
なるべく前述3つで可能な再現は全て実装させる方向を目指す。 まぁ努力する・・・
バトスピ、ヴァンガ、バディ、デュエマなど発売済みゲームソフトが存在してるケースはベンダーに研究させる。
↓
各社TCGを再現するテストプレイ ⇒ 更に改良や修正。
↓
機能制限した下位版を5万円以上で発売 + デュエリ−グ用に改造した上位版でサーバー稼動=営業開始。
↑
下位版の改造および商用利用には、別途で当社との契約が必要。
さ〜て、製作ベンダー見つけよっと!ww(クス
http://wc2014.2ch.net/test/read.cgi/entrance2/1448404407/-13
0984デフォルトの名無しさん
2015/11/25(水) 19:14:45.44ID:n/g2lh6I0985uy ◆Qawu9.2l1E
2015/11/26(木) 23:16:10.92ID:hdMKEMdm原子の中に世界がある という事をソースコード上でやる事です
再帰関数は、それを手繰る為のもの
間違ってもフラットArrayを再帰で辿るとか阿呆な事はしないように
0987デフォルトの名無しさん
2015/11/27(金) 12:21:44.47ID:0B5cIfOS再帰が無くちゃならないとは言わないけど、再帰があって便利なのは事実だし、原子の中に世界があるっていう言い方するから悪いだけだろ。マトリョーシカみたいなものなんだから
0988デフォルトの名無しさん
2015/11/27(金) 15:51:36.21ID:ssdfMMFk0989デフォルトの名無しさん
2015/11/27(金) 16:24:58.15ID:qMqg45bU特に特に特にクイックソートは、再帰で実装されたら極端に効率が悪すぎて使えないって。
0990デフォルトの名無しさん
2015/11/27(金) 19:59:37.85ID:W/GzBcKS末端に近くなったらinsert sortに切り替えたり。
実装が単純なのにかなり速い。
0991デフォルトの名無しさん
2015/11/27(金) 20:17:09.15ID:hOvgtNbZ語ったところで実りある議論にならないよ
0992デフォルトの名無しさん
2015/11/27(金) 20:41:30.81ID:2gRlH9t5もはや再帰と関係ない
0993デフォルトの名無しさん
2015/11/28(土) 01:01:51.15ID:a4BqYiCD0995デフォルトの名無しさん
2015/11/28(土) 08:36:18.25ID:09L0m97Iだから何?
実装に再帰が必要なわけでもなし
0996デフォルトの名無しさん
2015/11/28(土) 10:32:57.04ID:M/Wigktg0997デフォルトの名無しさん
2015/11/28(土) 12:24:23.32ID:2xw8Hd1y0998デフォルトの名無しさん
2015/11/28(土) 13:19:43.21ID:Tq6BVuZsライブラリみたいに速度を要求される部分はそう多くない
ほとんどのアプリケーションプログラマにとっては抽象化の方が重要
0999デフォルトの名無しさん
2015/11/28(土) 16:27:24.55ID:CrLuhOYhわざわざ問題のある再帰で書く必要なんてない。
ほとんどのアプリケーションプログラマは、
ループ方式で実装されたライブラリにより高速処理を実現することができる。
無理に無意味に再帰ばかりを使用しようとする再帰厨は、システムの破壊者だね。
1000デフォルトの名無しさん
2015/11/28(土) 16:30:38.50ID:CrLuhOYhそれをループ版に直すぐらいのプログラミング能力は備えるべき。
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
10021002
Over 1000Thread運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
http://premium.2ch.net/
http://pink-chan-store.myshopify.com/
レス数が1000を超えています。これ以上書き込みはできません。