トップページ⇒tech
1002コメント380KB

なあ、再帰関数好きな人いる? パート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+
再帰関数講義pdf
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+1kZD
酒飲んでいい気分になってきたんだがNAS6の発狂ぶりが面白いので見物させていただきます
0006デフォルトの名無しさん2015/09/06(日) 17:52:38.85ID:8kAWPtv+
おーい、負けるのが嫌なら
レスしていいんだぞ。
お前w
0007デフォルトの名無しさん2015/09/06(日) 17:55:08.01ID:COxCJFRo
BASICワロタwww
0008デフォルトの名無しさん2015/09/06(日) 17:56:56.08ID:uhlPSgY9
BASIC‥
>>1 の方が馬鹿なのか?
0009NAS6 ◆n3AmnVhjwc 2015/09/06(日) 17:59:11.55ID:miXQ60Mg
>>4
別に痛くも痒くもなんともないが

ttp://peace.2ch.net/test/read.cgi/tech/1439109993/979
0010デフォルトの名無しさん2015/09/06(日) 17:59:20.08ID:8kAWPtv+
>>8
俺は某大学のページを見つけてきただけだ。
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の内容と、
馬鹿のオレオレ定義と
どっちが信頼できるかって話だ。

もちろん信頼できるのは馬鹿よりも>>1のリンク先を
書いた人に決まっているだろう。

その信頼できる人が「再帰を使った例」に対して
「再帰を使わない例」をこのように書いているわけだ。
0014NAS6 ◆n3AmnVhjwc 2015/09/06(日) 18:16:43.96ID:miXQ60Mg
>>13
お前バカだろ

>>1
の同じリンクの中に

>>1
の引用と
>>9
の引用があるんだが

わかんねえやつだなーーー
0015デフォルトの名無しさん2015/09/06(日) 18:18:21.82ID:8kAWPtv+
>>14
何がいいたいのかさっぱりわからない。

俺は、第三者(書いた本人)以外の
間違った解釈が含まれないように
忠実にコピペしただけだ。
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
わざわざこのURLを張ったことに強い疑問を感じる
そもそもこれはBASIC普及サイトだろうよ

このホームページは, Tiny Basic を中心としたプログラミング言語 Basicのページです。しかし,プログラム言語は「言語」です。言語はあることを表現する手段です。表現する内容を持たなければ,そもそもの存在意義がありません。
 Basic を勉強しようと思う動機は人によって様々だと思います。
 コンピュータをより効率的に使いたい,計算をしたい,データ処理をしたい,ゲームを作りたい,ともかく遊んでみたい, ・・・
 どのような動機でも構いませんが,プログラミング言語自身の研究者でなければ,言語を使って何かをしたいという動機を持っているはずです。
何を目的とするのかを見定め,目的とする内容について勉強することが必要でしょう。それからプログラミングに取り組んで下さい。そうでなければ,プログラミングを勉強を始めても,すぐに飽きてしまいますし,実際のところ余り身につきません。
 Tiny Basic の Sample や このホームページにある「Basic 入門」の中に出てくるプログラムの中にはその背景や内容を知らないと,プログラム自身の意味もわからないものもあるかと思います。
このページでは,そのようなことのについての説明を多少ですが纏めてみたいと思います。
 私自身のメモ書きの寄せ集めのようなものですが,順次増やして行こうと思います。何かの参考になれば幸いです。

大学や新潟の記述は見つからず。
プログラムに対する理解度も高くないように思う

まぁもう消えるからつついてもしょうがないが
0020デフォルトの名無しさん2015/09/06(日) 18:28:22.06ID:8kAWPtv+
んで、>>18(前スレ719)の内容は
再帰だと主張する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+
>>19
何いってんのお前?
誰が書いたかわからずに批判するのはやめとけ
恥ずかしいからさw
0022デフォルトの名無しさん2015/09/06(日) 18:31:59.21ID:aWMMHCvX
もう立てた意味ないくらい失敗だなこのスレ
0023NAS6 ◆n3AmnVhjwc 2015/09/06(日) 18:33:39.15ID:miXQ60Mg
>>18
http://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+
まあ目的が馬鹿をおちょくるためだしw

でもまあ、>>2にちょっとだけ書いてあるっしょ?

再帰を使った場合と「再帰を使わない」つまりループを使った場合で
どちらを使うべきか。

両方使える場合には、再帰を使うべきじゃない。
0025デフォルトの名無しさん2015/09/06(日) 18:35:40.96ID:8kAWPtv+
>>23
素人のお前がいくら言った所で、
>>1のリンク先の先生が書いたことのほうが
何万倍も信用度が高い。
0026デフォルトの名無しさん2015/09/06(日) 18:36:53.88ID:aWMMHCvX
>>17
おまえはお前で再帰を使わない例があるとかなり致命的だろうよ
なにしろ
sum = sum + 1
sum = sum + 2
これだけで再帰なんだから

普通の人は再帰と言わんから致命的でもなんでもない。
0027デフォルトの名無しさん2015/09/06(日) 18:37:49.60ID:aWMMHCvX
馬鹿だらけになってめんどくせぇ
じゃあ頑張ってな
0028デフォルトの名無しさん2015/09/06(日) 18:38:28.51ID:8kAWPtv+
>>26
うむ。

再帰を使わない例と明確に言って
このコードを書いているからな。
明らかにこれは再帰ではないのだ。

> となります。しかし,実は階乗関数は,再帰を使わなくても,
> 次のように実現することが出来ます。
>
> 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
>>24
だから俺は、それはその通りだと思うし、で、だからどうしたの?
前スレで
再帰関数書式は定義に忠実な書き方で
ループ書式は最適化された書き方で
ってずっと書いてるけど?
0030デフォルトの名無しさん2015/09/06(日) 18:41:03.57ID:8kAWPtv+
>>29
まとめ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
お前にNAS6をおちょくれるとは思えない
おちょくると言う発想もまた不快感を覚えるが
0032デフォルトの名無しさん2015/09/06(日) 18:42:24.38ID:uhlPSgY9
>>1 もタイガイだな‥よりによって BASIC で記述しているサイトとかさ‥
0033デフォルトの名無しさん2015/09/06(日) 18:43:10.98ID:8kAWPtv+
>>32

えっと、何が悪いの?
お前BASIC作れるの?
0034NAS6 ◆n3AmnVhjwc 2015/09/06(日) 18:50:09.99ID:miXQ60Mg
ttp://nas6.main.jp/secret/Polygon.htm

俺は、3DCGレンダリングライブラリを
VisualStudio標準ライブラリから自力で作れるよ
0035デフォルトの名無しさん2015/09/06(日) 18:52:09.34ID:CPTXWrAh
>>34

それ>>1のリンク先の人より
凄くないからw
0036NAS6 ◆n3AmnVhjwc 2015/09/06(日) 18:56:32.19ID:miXQ60Mg
まぁ、ゲームプログラマーなら3Dエンジンくらい作れて当然だもんな
0037デフォルトの名無しさん2015/09/06(日) 19:00:35.87ID:1q8+1kZD
飯食ってきた
おい、NASがゲームプログラマーだと?
怖くてプレイ出来ないからやめてくれ
0038NAS6 ◆n3AmnVhjwc 2015/09/06(日) 19:02:42.24ID:miXQ60Mg
ああ、誤解されたら嫌だから、書いとくけど
3Dライブラリを使った3Dエンドプログラムじゃなくて
VisualStudio標準ライブラリから3Dエンジンを作ったんだよ
0039デフォルトの名無しさん2015/09/06(日) 19:06:49.22ID:1q8+1kZD
DirectXのか?
クォータニオンを理解していれば誰でも作れるんだが
ロボットアームの操作は出来ないだろうがな
0040デフォルトの名無しさん2015/09/06(日) 19:11:03.76ID:CPTXWrAh
>>37
> おい、NASがゲームプログラマーだと?

安心しろ。それはないw
0041デフォルトの名無しさん2015/09/06(日) 19:11:51.49ID:1q8+1kZD
>>40
ワロタ
0042NAS6 ◆n3AmnVhjwc 2015/09/06(日) 19:14:14.02ID:miXQ60Mg
>>39
3DライブラリはXNAなり.NETなりの
ドット描画だけしか使ってないよ
XNAなり.NETなりのドット描画だけ利用して
三角形塗りつぶしやら陰面消去やらライティングやら全部計算
0043デフォルトの名無しさん2015/09/06(日) 19:15:53.04ID:1q8+1kZD
分かるかNAS
自己評価がどれだけ高くても、それと人がそれを認めてくれるかどうかとは全く無関係なのだ
悔しかったらノーベル賞でも取ってみろ
0044デフォルトの名無しさん2015/09/06(日) 19:16:17.46ID:CPTXWrAh
>>42
で、参考にした本は?

そのサンプルソースを
移植しただけだろう?
0045片山博文MZ ◆T6xkBnTXz7B0 2015/09/06(日) 19:16:40.24ID:0zNPIayW
以下、このスレッドはNASの自慢大会になりましたので、
関係者の皆様は御協力をお願い申し上げます。
0046NAS6 ◆n3AmnVhjwc 2015/09/06(日) 19:20:49.01ID:miXQ60Mg
>>43
二次篩法より使えるよ

素数ってエラストテネスの篩とか考えると
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
>>46
都合が悪くなると話題を逸らす癖なおそうね
0049NAS6 ◆n3AmnVhjwc 2015/09/06(日) 19:25:43.74ID:miXQ60Mg
>>44
ボーンデジタル
Eric Lengyel
狩野智英
ゲームプログラミングのための3Dグラフィックス数学
0050デフォルトの名無しさん2015/09/06(日) 19:31:38.86ID:CPTXWrAh
な? 初心者丸出しだろ?

本見て、それを写しただけなのに
できるよ自慢。
0051NAS6 ◆n3AmnVhjwc 2015/09/06(日) 19:35:08.19ID:miXQ60Mg
>>49
を借りてきて、中身見てみろ
理論説明書であってサンプルコードなんぞない
0052NAS6 ◆n3AmnVhjwc 2015/09/06(日) 19:39:48.94ID:miXQ60Mg
ttp://nas6.main.jp/secret/Polygon.htm
のzipにソースがあるからソースを見れば
丸写しのサンプルコードなんてないのが分かるだろう
0053デフォルトの名無しさん2015/09/06(日) 19:40:18.53ID:1q8+1kZD
狩野英孝かと思ったぜ
0054NAS6 ◆n3AmnVhjwc 2015/09/06(日) 19:46:43.62ID:CQ0buOj1
脱線したなこっち

>>23
0055NAS6 ◆n3AmnVhjwc 2015/09/06(日) 19:50:29.69ID:CQ0buOj1
数列の和は再帰処理だよ
0056デフォルトの名無しさん2015/09/06(日) 19:51:04.84ID:HtOLHH16
半世紀前に神が再帰関数をこのように定義した。
http://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
>>56
読めねえよ何語だよこれ
0058NAS6 ◆n3AmnVhjwc 2015/09/06(日) 19:55:55.22ID:miXQ60Mg
recursive 「function」
だから別に異議はないよ
0059NAS6 ◆n3AmnVhjwc 2015/09/06(日) 19:58:14.66ID:miXQ60Mg
再帰関数のみが再帰的
については
俺はNO
0060デフォルトの名無しさん2015/09/06(日) 19:59:07.85ID:JSf18249
>>59
それは誰も否定しないと思うの心。
0061デフォルトの名無しさん2015/09/06(日) 20:01:47.59ID:JSf18249
たとえばLinuxはLinux is not unixのことで再帰的。
再帰は僕らの周りにいっぱいあるんだよ!!
0062NAS6 ◆n3AmnVhjwc 2015/09/06(日) 20:03:48.46ID:miXQ60Mg
>>60
これが再帰的ではないっつうから

int sum = 0;
 for(int i = 1; i <= 10; i++) {
  sum = sum + i;
}
0063NAS6 ◆n3AmnVhjwc 2015/09/06(日) 20:07:21.15ID:miXQ60Mg
int sum = 0;
 for(int i = 1; i <= 10; i++) {
  sum = sum + i;
}
左辺がn+1項までの和でそれを右辺がn項までの和を使って
再定義しているから、再帰的
0064デフォルトの名無しさん2015/09/06(日) 20:08:32.12ID:JSf18249
>>62
文脈があるんだよね。
再帰関数で行う処理を再帰処理と言ってる文脈では、
それは再帰処理ではないよね。
一口に再帰と言ってもいろいろあるんすよ。
0065NAS6 ◆n3AmnVhjwc 2015/09/06(日) 20:12:56.71ID:CQ0buOj1
再帰関数と再帰処理はイコールではない

再帰関数のみが再帰的
については
俺はNO
0066デフォルトの名無しさん2015/09/06(日) 20:15:19.80ID:JSf18249
>>65
それはわかったよw

再帰関数で行う処理を再帰処理と言う人がいたと
仮定するとその人の言う再帰処理とナスシックスの言う再帰処理が
違うものであるっていうのはわかるっしょ。

それがわかってれば十分かと。

たとえば女の子に君を食べたいと言ったら
それはとても恐ろしいカニバリストととも取れるし
とてもいやらしいことをしているエロスジェントルメンかもしれないわけっしょ。
食べるという言葉一つとっても文脈に応じて概念が変わるもんなんよ。

一方の論理が成立すればもう一方が論理的に間違いだというものではないのよね。
この語句はこうも解釈できて、この解釈に基づくならこういう論理も成り立つよねって
話っすね。
0067デフォルトの名無しさん2015/09/06(日) 20:16:39.91ID:n7lw0XxH
お前らわけわからん糞コテは無視して、当初のテーマ通り、

for文
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:miXQ60Mg
headとtailが説明ないから、ようわからん

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;
}
0070NAS6 ◆n3AmnVhjwc 2015/09/06(日) 20:48:07.01ID:miXQ60Mg
headとtail
が
ただのi++
だとしたら・・・

んー、だから、なんで、
再帰の利点をことごとく消したコードで
どっちが好きって聞くのかなぁ
0071デフォルトの名無しさん2015/09/06(日) 20:50:15.72ID:n7lw0XxH
headはcar
tailはcdr
0072デフォルトの名無しさん2015/09/06(日) 20:54:08.38ID:n7lw0XxH
リストの要素は2つのアドレスのペア
headは1つめのアドレス、tailは2つめのアドレスを指す
0073NAS6 ◆n3AmnVhjwc 2015/09/06(日) 20:56:22.14ID:miXQ60Mg
for文のvは配列構造
再帰のvは木構造
0074デフォルトの名無しさん2015/09/06(日) 20:58:05.08ID:oxuCnkg+
>>67
for文で書けるならfor文で書く
0075NAS6 ◆n3AmnVhjwc 2015/09/06(日) 20:58:44.37ID:miXQ60Mg
再帰の利点は
push&pop処理ができるのと
木構造を扱えることなんだけど

それを全部消したらforが良いに決まってんじゃん
0076デフォルトの名無しさん2015/09/06(日) 21:02:00.73ID:CPTXWrAh
別に再帰を使わなくても
push,popはできるけどなw

スタックさえあればいい。
ループ+スタックで処理するのが速い。
0077デフォルトの名無しさん2015/09/06(日) 21:04:54.02ID:HtOLHH16
ボケナスは再帰的処理/再帰的関数と明記しろ。
他の奴らはスレタイに従って、このスレでは「再帰」を再帰的関数と言う意味で使い、
再帰的処理は「再帰的処理」と書いている。
0078NAS6 ◆n3AmnVhjwc 2015/09/06(日) 21:05:48.26ID:CQ0buOj1
>>76
木構造はfor文で扱いづらいだろ
0079NAS6 ◆n3AmnVhjwc 2015/09/06(日) 21:07:43.50ID:CQ0buOj1
>>75
再帰関数の利点
0080NAS6 ◆n3AmnVhjwc 2015/09/06(日) 21:10:06.11ID:CQ0buOj1
例えば
ディレクトリサーチをfor文で書きたくない
0081NAS6 ◆n3AmnVhjwc 2015/09/06(日) 21:22:43.43ID:miXQ60Mg
>>80
をどうしてもやるなら
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:miXQ60Mg
でも結局
searchNext()は再帰関数になる
0084NAS6 ◆n3AmnVhjwc 2015/09/06(日) 21:29:25.88ID:miXQ60Mg
でも結局
searchNext()は再帰関数を使う
0085NAS6 ◆n3AmnVhjwc 2015/09/06(日) 21:44:47.37ID:miXQ60Mg
ttp://nas6.main.jp/secret/ContainerPtr.htm

template<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:miXQ60Mg
ツリーコレクションがC++STLにないから作りました
0088デフォルトの名無しさん2015/09/06(日) 22:15:17.13ID:JSf18249
>>87
どういうとき使うん?
0089NAS6 ◆n3AmnVhjwc 2015/09/06(日) 23:35:13.33ID:miXQ60Mg
>>88
コンテナポインタ
任意のクラスのスマートポインタ&コンテナ
ツリーコレクション
任意のクラスを木構造で管理
0090NAS6 ◆n3AmnVhjwc 2015/09/06(日) 23:48:47.99ID:miXQ60Mg
ttp://nas6.main.jp/secret/ContainerPtr.htm
解説サイト

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:0zNPIayW
template <typename T_BASE>
class 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:0zNPIayW
template <typename T_BASE>
class 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:0zNPIayW
それなら俺がもっとわかりやすいtreeを書いてやるよ
0095デフォルトの名無しさん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/EkzV5Z
別に蒸し返すつもりもないが、
NAS6は当初と言ってることがかなり変わってるぞ
0098デフォルトの名無しさん2015/09/07(月) 06:51:26.87ID:07GvV3Oa
>>94
    /#\_/#\           / ̄    ̄\
    | ### (#) ### |          /         ヽ
  /ヽ##ノ  \.#ノ、         /           |
  /          │       |    , -===-、|
 |     -===-、|        │  /         ヽ
 │  /       ヽ        ヽ/          | |
  ヽ/        │|          |_|        |_|
   |_|        |_|          (.__.)        |_.)
   (.__)     -◎ |_ )          │      -● |
     |    |   |            |     |   |
    ⊂二⊃⊂二⊃           ⊂二 ⊃⊂二⊃
0099NAS6 ◆n3AmnVhjwc 2015/09/07(月) 07:30:46.76ID:z69KZ2wJ
>>97
別に俺にとって、再帰処理について、このスレで新たな知見なんてないし、変わるはずがないよ
0100NAS6 ◆n3AmnVhjwc 2015/09/07(月) 07:39:15.86ID:z69KZ2wJ
>>95
何が怖いの?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:z69KZ2wJ
int sum = 0;
 for(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/EkzV5Z
あーあと気になったもので言ってなかったのは、
sum = sum
これsumの「定義」じゃないですから。
数学とは違います。代入と言います。上書きです。
0106デフォルトの名無しさん2015/09/07(月) 09:57:21.60ID:H/A72o7Y
>>96
んじゃ、これは? scheme
(let loop ((sum 0)
(i 1))
(if (<= i 10)
(loop (+ sum i)
(+ i 1))
sum))
0107デフォルトの名無しさん2015/09/07(月) 11:16:26.65ID:kPPvOKmq
>>106
schemeはしらんけど、ここを読む限り、
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
>>105 俺がそれを指摘して返ってきた反応が「漸化式も知らないの?」だった。

一番の問題は、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
>>105
変数の代入は、変数の再定義だろ
再定義って言葉が気に入らないなら
つうか単語をいちいち突っ込む基地外に付き合ってやるけど

*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
recursive processing、recursive algorithm

の和訳が

再帰処理、再帰的アルゴリズム
同じっちゃあ同じだけど、
処理の方が実装寄りで
アルゴリズムは理論寄りかな
0115NAS6 ◆n3AmnVhjwc 2015/09/07(月) 14:03:41.19ID:z6iBy9wS
>だからsumを求める処理は再帰的にも非再帰的にも実現できるが、
>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:79mVKqba
馬鹿が発狂中で人に迷惑を掛けている真っ最中か
0118NAS6 ◆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:z6iBy9wS
9割親切にしてんだよ
0120NAS6 ◆n3AmnVhjwc 2015/09/07(月) 14:55:19.37ID:z6iBy9wS
で、なぜ再帰的が基本かと言えば、相対的な処理が基本だから
abs = base + offset

座標なら
ディスプレイ = パース * カメラ * グローバル * ローカル
の回転処理

base + offsetで、アセンブラが動いているからね

こういう感じの構造だと
base = base + a
こういうのが頻出する
ポインタなんて、もうそのまんま
0121デフォルトの名無しさん2015/09/07(月) 14:56:59.86ID:79mVKqba
>>118
お前が間違ってんだよ

>>119
キチガイに親切にされてもこっちが迷惑なんだって
0122NAS6 ◆n3AmnVhjwc 2015/09/07(月) 15:06:07.99ID:arnw7zUz
>>121
これのどこが?

再帰的とは
あるものが定義されている場合,
その定義の中に,更にその定義されるべきものが,簡単化されて,含まれているとき,
それは「再帰的である」と言われます。
循環論法に似ていますが,少し違います。
再帰的はその部分に含まれるものが全く同じものではなくて,
簡単になったもので,最終的終了条件が明示されているものです。

sumを求める処理は非再帰的に実現できない
理由
sumが定義されていて
そのsumに、より簡単なsumを含まないで
sumは実現できないから
0123デフォルトの名無しさん2015/09/07(月) 15:08:14.34ID:79mVKqba
>>122
いろいろおかしい
昨日から見てるけどお前狂ってるわ
0124デフォルトの名無しさん2015/09/07(月) 15:12:32.30ID:79mVKqba
狂ってる場所を指摘してみろと言われるかもしれないが、それは意味がない
なぜなら狂ってる奴にとってはそれが正しいのだから絶対に受け入れない
どんな屁理屈を使ってもはねつける
だから嫌われんだよ
0125NAS6 ◆n3AmnVhjwc 2015/09/07(月) 15:23:05.26ID:z69KZ2wJ
g():ある変換関数、n:ある項
この時
f(n+1) = g(f(n))
このようにf()が定義されたらf()は再帰(帰納)的

再帰的とは
あるものが定義されている場合,
その定義の中に,更にその定義されるべきものが,簡単化されて,含まれているとき,
それは「再帰的である」と言われます。
循環論法に似ていますが,少し違います。
再帰的はその部分に含まれるものが全く同じものではなくて,
簡単になったもので,最終的終了条件が明示されているものです。
0126NAS6 ◆n3AmnVhjwc 2015/09/07(月) 15:24:06.23ID:z69KZ2wJ
>>124

自己紹介乙
0127デフォルトの名無しさん2015/09/07(月) 15:28:47.77ID:79mVKqba
>>126
ああその言葉言っちゃったね
「自己紹介乙」というのは投影性同一視を日頃から使う人間しか口にしない
要するにNASは自分の事が本当は嫌いなんだよ
でもそれは受け入れないから他人にかけつる
犯罪犯すなよ、危ないぞお前
0128デフォルトの名無しさん2015/09/07(月) 15:31:59.16ID:ksoqvTq6
>>sumを求める処理は非再帰的に実現できない
int 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
>int sum = (int)(10 * (1 + 10) * 0.5));
うん、確かにこれは非再帰だね

>C/C++で再帰的定義が許されるのはデータ型と関数の定義のときだけで、右辺値にundefinedな値を持ってくることができない。

>右辺値にundefinedな値を持ってくることができない
初項が決まらないと帰納法は開始できないからね

>データ型
?プリミティブ型のこと?
任意のクラスで、再帰的定義ができるよ、やり方次第
0133NAS6 ◆n3AmnVhjwc 2015/09/07(月) 15:52:38.66ID:arnw7zUz
ID:79mVKqba
あはは、数学も情報処理もできなくて
日本語もほんの少ししから分からないからムキになってるwww
0134デフォルトの名無しさん2015/09/07(月) 15:54:13.94ID:kPPvOKmq
というレスをムキになってやっているNAS6
0135NAS6 ◆n3AmnVhjwc 2015/09/07(月) 16:10:37.84ID:z6iBy9wS
だから、感情表現は無駄レスだから控えろよ

>C/C++で再帰的定義が許されるのはデータ型と関数の定義のときだけで、右辺値にundefinedな値を持ってくることができない。

>データ型
?プリミティブ型のこと?
ん?普通に任意のクラスで、再帰的定義ができるだろ
データ型が任意のクラスってことなら、再帰的定義に何の不都合があるの?
0136NAS6 ◆n3AmnVhjwc 2015/09/07(月) 16:15:30.24ID:z6iBy9wS
理系の板で、スレを見た人の感情を知りたい第三者なんて、多分いない
0137デフォルトの名無しさん2015/09/07(月) 16:18:13.76ID:H/A72o7Y
>>107
ところが、named letは先の例だと、loopという名を持つ再帰関数を定義して、呼び出しているんだ。
0138NAS6 ◆n3AmnVhjwc 2015/09/07(月) 16:27:05.14ID:z6iBy9wS
>右辺値にundefinedな値を持ってくることができない
初項が決まらないと帰納法は開始できないからね
当たり前かと思ったけど丁寧に書くと

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
>んじゃ、これは? scheme
>(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
>>137
> ところが、named letは先の例だと、loopという名を持つ再帰関数を定義して、呼び出しているんだ。

あんたがどう思うが関係なく、
リンク先には再帰ではないと書いてある事実が重要
0141NAS6 ◆n3AmnVhjwc 2015/09/07(月) 16:49:20.19ID:z69KZ2wJ
って、参照でやっているように見える
void 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
>>139
再帰をループに置き方たら再帰じゃない。

同じ問題を、再帰を使ったやり方と
再帰を使わないやり方で解くことができる。

等価であっても、再帰ではなく、
再帰を使わずにループで、等価な処理が出来るだけ。

再帰は単に自分の関数自身を呼び出すかどうかで決まる。
0143NAS6 ◆n3AmnVhjwc 2015/09/07(月) 17:07:40.99ID:z69KZ2wJ
>int sum = (int)(10 * (1 + 10) * 0.5));
あ、これも再帰だ
右辺の中に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:z6iBy9wS
再帰関数のみが、再帰的なわけではない
0146デフォルトの名無しさん2015/09/07(月) 17:48:07.49ID:H/A72o7Y
>>140
そのリンク先にどのように書かれていようと、規格書には再帰を記述出来ると書いてある事が重要。
0147NAS6 ◆n3AmnVhjwc 2015/09/07(月) 17:49:27.37ID:z6iBy9wS
ttp://ja.wikipedia.org/wiki/%E5%86%8D%E5%B8%B0%E7%90%86%E8%AB%96
再帰理論

で、これは要するに、

基数記号から
数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:z69KZ2wJ
A=B
B=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
>>148
「迷惑の発明」はこうなってる
0151NAS6 ◆n3AmnVhjwc 2015/09/07(月) 18:11:20.47ID:z6iBy9wS
>>149

>>148
>>150

こういう問題があるから
よくよく検証しないと無意味になる
0152デフォルトの名無しさん2015/09/07(月) 20:14:00.01ID:wAvgtGye
あれからまだやってたのかNASw

俺は急に忙しくなって書き込みできなくなり、さっき帰宅したところなんだが
お前本当に無職なんだな

>>133
>あはは、数学も情報処理もできなくて
>日本語もほんの少ししから分からないからムキになってるwww

工学部卒でSEなんですけど何か?
日本語がズレてて無職のNASよりずっとマシだと思うよ?
0153デフォルトの名無しさん2015/09/07(月) 20:20:47.57ID:ksoqvTq6
ある処理に対してどんな意味付けを、説明をするのかという問題で、NASは再帰という言葉しか知らないだけだ。
sumの一般解も再帰だと言うなら、何も説明できていないことに気付きなさい。
そんな何にでも当てはまる概念は、再帰でないものと区別できるような、際立たせる性質を持っていないことに気付きなさい。

例えて言うなら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:z69KZ2wJ
まさか、プログラムで一人で作ってこうやる奴はいないと思うが、

int 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:z69KZ2wJ
失礼

int 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
>>110
代入は定義じゃなくて処理だが
左辺値にとって右辺が何であるかは問わない。
また代入はその経歴を保持しない

sumはsumです。 →日本語、トートロジー。右のsumで左のsumを定義。
sum = sum →数学。sumはsumと等価である。右のsumで左のsumを定義。
sum = sum; → プログラム。左辺のsumは右辺のsumと論理性を持った繋がりを保持しない。定義ではない。当然再定義でもない。

あと都合の言い部分だけ答えてどや顔されてもね
0158デフォルトの名無しさん2015/09/07(月) 20:58:02.47ID:VPF4nk5c
>sumを求める処理は非再帰的に実現できない

基地外過ぎ
0159NAS6 ◆n3AmnVhjwc 2015/09/07(月) 21:04:50.57ID:z69KZ2wJ
>>157
最近は、注意しないと、GCのオブジェクト参照だらけになってるよ
0160デフォルトの名無しさん2015/09/07(月) 21:06:16.79ID:wAvgtGye
>>156
嘘もたいがいにしとこうねNAS君
宗教板に出入りしてる時点でお里が知れますよ
それからボキャブラリーが貧困なのはあんたの方だね
日本人じゃないでしょ?チョンか?
0161デフォルトの名無しさん2015/09/07(月) 21:06:17.22ID:y/EkzV5Z
だから?それで?
0162NAS6 ◆n3AmnVhjwc 2015/09/07(月) 21:15:29.65ID:z6iBy9wS
>sum = sum; → プログラム。左辺のsumは右辺のsumと論理性を持った繋がりを保持しない。定義ではない。当然再定義でもない。

まず
MOV AX, BX
この意味がちゃんと分かってる?
0163デフォルトの名無しさん2015/09/07(月) 21:18:05.02ID:y/EkzV5Z
話がアレンブラレベルになったり高級言語レベルになったり相変わらず「なんの話をしてるのか」安定しないね、お前。
0164NAS6 ◆n3AmnVhjwc 2015/09/07(月) 21:21:23.34ID:z69KZ2wJ
>>156
に嘘は全くないし

代入ってコピーだし
何か?
0165デフォルトの名無しさん2015/09/07(月) 21:22:11.75ID:y/EkzV5Z
コピーは正解
0166デフォルトの名無しさん2015/09/07(月) 21:22:18.08ID:wAvgtGye
あのさあ、週二日午前中だけ勤務でまともな給料もらえると思ってんの?
世の中舐めとんのか?
0167NAS6 ◆n3AmnVhjwc 2015/09/07(月) 21:25:15.54ID:z69KZ2wJ
C++で、演算子=()を作ったことがないんかいな?
オブジェクト参照にしないと、まるっきり使えない=になるよ
0168デフォルトの名無しさん2015/09/07(月) 21:27:28.64ID:y/EkzV5Z
だから?
0169デフォルトの名無しさん2015/09/07(月) 21:28:03.03ID:OUNoKE7c
>>167
オブジェクト指向と再帰って相性いいと思うんだよね。
ツリーの各ノードに振る舞いを丸投げできるっしょ。どう思う?
0170デフォルトの名無しさん2015/09/07(月) 21:31:46.55ID:y/EkzV5Z
相性がいいと同じ、
等価と同一、
似てると等価、

全部違う
日頃はこんなのどうでもいいんだが
0171NAS6 ◆n3AmnVhjwc 2015/09/07(月) 21:35:25.59ID:z69KZ2wJ
int型なら
int& 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
>>171
それはズレてるね
左のsumが右のsumに影響を与えない
0174デフォルトの名無しさん2015/09/07(月) 21:40:36.72ID:wAvgtGye
都合の悪い質問>>166はスルーする時点で完全に嘘だとばれちゃったね
0175デフォルトの名無しさん2015/09/07(月) 21:45:27.76ID:y/EkzV5Z
そして当初の仕様(抽象概念)と違う動作をしたらただのバグなんだよ
0176NAS6 ◆n3AmnVhjwc 2015/09/07(月) 21:54:05.13ID:z69KZ2wJ
>>174
別に都合が悪くはないよ
それで俺は一応生活できてるよ
0177デフォルトの名無しさん2015/09/07(月) 21:55:31.44ID:wAvgtGye
>>176
要するに半ニート状態か
0178NAS6 ◆n3AmnVhjwc 2015/09/07(月) 21:56:42.35ID:z69KZ2wJ
A=B
A←B
こんな感じだろ
0179NAS6 ◆n3AmnVhjwc 2015/09/07(月) 21:59:21.65ID:z69KZ2wJ
明示的に()や暗黙的な優先順位に差がない限りは後方解決
0180デフォルトの名無しさん2015/09/07(月) 21:59:30.34ID:y/EkzV5Z
>>176
そこは返信しなくていいから

>>178 意味の分からんことをカタコトで書くのやめれ
0181デフォルトの名無しさん2015/09/07(月) 22:01:16.36ID:y/EkzV5Z
だからなんだ?
お前の書き込みは「だから○○」です。と言う流れが一切ない
0182デフォルトの名無しさん2015/09/07(月) 22:05:50.36ID:wAvgtGye
そりゃないでしょ
NASは嘘つきだもん
0183NAS6 ◆n3AmnVhjwc 2015/09/07(月) 22:07:18.74ID:z6iBy9wS
A=B*(C-D*E)/F-G;
こういうの再帰的なもののオンパレードなんだけど
分かんなければ分からんだろうね
0184デフォルトの名無しさん2015/09/07(月) 22:07:48.81ID:y/EkzV5Z
22:10で終了。
どうでもいいだろうけど。俺もどうでもいいんだが
0185デフォルトの名無しさん2015/09/07(月) 22:10:31.87ID:y/EkzV5Z
>>183
わかんねぇな。
いやいろいろあるんだが全部書けん
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:QIs6nwEn
それは全然別の話だろうが
01891862015/09/07(月) 22:16:52.42ID:QIs6nwEn
終わり
0190NAS6 ◆n3AmnVhjwc 2015/09/07(月) 22:40:26.71ID:z69KZ2wJ
A=(2.0+3.0)-4.0*(5.0-6.0/7.0);
0階から()を探す
で、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
>>190
それってただの逆ポーランド記法の処理じゃね?
確かに再帰下降パーサみたいのは再帰と言えるだろうが、
C++みたいな言語にしただけで純粋な再帰だけでは処理しきれなくなってるからな
自分で言葉の意味を再定義して悦に入っててもただの自己満であって
他人は理解できねーからな
少なくとも情報処理用語の定義を使え
それが出来ないのならただの雑音だ
チラシの裏にでも落書きしてろ
0195NAS6 ◆n3AmnVhjwc 2015/09/07(月) 23:02:21.08ID:z69KZ2wJ
例えば、
D社から買って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:z69KZ2wJ
だから、循環論法の迷惑の発明は、やめてください
0199デフォルトの名無しさん2015/09/07(月) 23:24:44.67ID:jq4VsIqN
>>198
その意味不明な言葉遣いをまずやめてもらえませんかね
0200NAS6 ◆n3AmnVhjwc 2015/09/07(月) 23:40:29.73ID:z69KZ2wJ
>>199
こういう問題が大問題

D社から買ってA社はB社に売る
A社から買ってB社はC社に売る
B社から買ってC社はD社に売る
C社から買ってD社はA社に売る
と、個々の会社は俺は違うと思っていても
循環取引のサイクルの中に
知らずに取り込まれている場合がある

こういう、「迷惑の発明」
0201デフォルトの名無しさん2015/09/07(月) 23:43:45.05ID:jq4VsIqN
>>200
ますます分からなくなりました
もしかして自分でも分かってないのではありませんか?
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
>>203
ですねやめときます
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
>>206
循環をわざと起こしてるのはお前一人だろ
みなまともな日本語を使ってるにお前一人意味不明な事ばかり書いてわざと循環させてるじゃん
0208デフォルトの名無しさん2015/09/08(火) 01:49:48.05ID:TS9AjA7a
元々プログラムにおける
sum = sum
が再帰と呼ぶかどうかの話をしてたんでしょ。(NAS6が一人だけ呼ぶ派)
従ってNAS6の文末は
「だから再帰と呼ぶ」で結ばれなければ支離滅裂。

「だからバブルの崩壊が起こるよね」
誰がバブルの話なんてしてんだ?
頭大丈夫か?

しかもこの手の問題は、定義の問題だから、
異議を唱えようと唱えまいとそう決まってるもんはそうと決まってるわけで。
0209デフォルトの名無しさん2015/09/08(火) 03:12:37.34ID:aPIkSKxt
久しぶりにきたら凄い事になっとるな
0210デフォルトの名無しさん2015/09/08(火) 07:06:17.98ID:ClXQIazL
再帰関数好きだよ
ディレクトリを奥まで掘ったり木構造の枝葉をなで回したりNクイーン問題の解を隅々までなめ回したり
0211デフォルトの名無しさん2015/09/08(火) 07:18:20.29ID:Tqb11w6f
>>210
変態じゃん
0212NAS6 ◆n3AmnVhjwc 2015/09/08(火) 08:35:32.37ID:A17cgJj+
>>208
*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
>>167
どうでもいいけど、普通は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
>>212
スタックの存在は忘れたほうがいい。

関数から、自分自身の関数を呼んだら再帰、
それ以外は再帰じゃない。
0216NAS6 ◆n3AmnVhjwc 2015/09/08(火) 08:47:52.49ID:A17cgJj+
>>215
スタックの存在を考えないと、末尾再帰しか考えられなくね?
0217デフォルトの名無しさん2015/09/08(火) 08:59:14.46ID:fy5XWhGc
>>216
今は末尾再帰の話をしているわけじゃない。
末尾再帰になってようがそうでなかろうが
再帰であるかどうかには関係ない。

再帰は、関数から自分自身の関数を呼ぶかどうか。
それだけ。みんなが最初から言っていること。
0218NAS6 ◆n3AmnVhjwc 2015/09/08(火) 09:26:16.59ID:A17cgJj+
トロ:せつないって報われない?
自分:はい
トロ:せつないって胸キュン?
自分:はい
トロ:トロはせつなくて胸キュンニャ!
0219NAS6 ◆n3AmnVhjwc 2015/09/08(火) 09:36:11.89ID:A17cgJj+
>>217
だから
再帰関数は、関数から自身の関数を呼ぶかどうか
再帰定義は、定義に自身の簡単な定義を含むかどうか
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+
>>220
はあ・・・これで分かる?特殊な書き方するけど、これで意味が分かってほしいな

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:2c5lB4ny
やっぱまじめに相手するのやめたわ
0224デフォルトの名無しさん2015/09/08(火) 10:34:12.97ID:wtmIsGEP
NAS6にレスするのはやめた方がいいよ
こいつただの構ってちゃんだから一切相手せず放置しとけばつまらなくなって向こうから消える
分かっててわざと話ずらしてんだよ
延々と相手してもらうために

このご時世じゃ相手に話を聞いてもらうために相手に金払わなきゃならないんですよ
ただで聞いてもらおうなんて虫がよすぎます
ただで飯をおごってもらってるのとおんなじですから

専ブラを使っている人はNGNameにNAS6と入れるだけです
0225NAS6 ◆n3AmnVhjwc 2015/09/08(火) 11:16:03.01ID:A17cgJj+
トロ:再帰って帰ってこれる?
自分:はい
トロ:再帰って美味しい?
自分:はい
トロ:トロは再帰して美味しいニャ!
0226デフォルトの名無しさん2015/09/08(火) 14:38:06.24ID:7dDfDgYn
構ってちゃんをうまく乗りこなせよお前ら、下手すぎワロタ
0227デフォルトの名無しさん2015/09/08(火) 19:41:18.92ID:VoiQlJVj
>>217
直接的あるいは間接的に自分自身を呼ぶ関数
0228デフォルトの名無しさん2015/09/09(水) 08:23:53.38ID:y0wHwAVE
俺の知ってる再帰はキミたちのとはちょっと違うな。
0229デフォルトの名無しさん2015/09/09(水) 08:25:38.65ID:qa+GQBo1
俺・・・一人
君たち・・・複数

オレオレ定義は要りません
0230デフォルトの名無しさん2015/09/09(水) 08:37:12.19ID:y0wHwAVE
キミは多数決で学問するのかね?
0231デフォルトの名無しさん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
>>231
それでは、未開部族の中に放り込まれたとき、知識は、正しくなくなるのですね?
0234デフォルトの名無しさん2015/09/09(水) 11:51:03.94ID:OjqvIpm4
詭弁の特徴のガイドライン
2.ごくまれな反例をとりあげる
「それでは、未開部族の中に放り込まれたとき、知識は、正しくなくなるのですね?」
0235NAS6 ◆n3AmnVhjwc 2015/09/09(水) 12:58:03.11ID:C2LbPxwf
では、まれでもない反例

・瀉血、割礼など、悪習が正しい方法とされている場合がある
0236デフォルトの名無しさん2015/09/09(水) 13:01:57.46ID:OjqvIpm4
>>235
まれな反例なんだが
先進国で瀉血、割礼なんかやってるか?
お前頭悪いっしょ
0237デフォルトの名無しさん2015/09/09(水) 13:22:36.93ID:1Ou1EL3T
もういいから。どうでも。
0238デフォルトの名無しさん2015/09/09(水) 13:24:34.06ID:qa+GQBo1
たしかに飽きてきたなw

まあここまで遊べたし、
ね?スレ立てた意味あったでしょ?w
0239デフォルトの名無しさん2015/09/09(水) 13:26:40.64ID:yEdJqNkn
>>231
天動説信じてる未開人が現代に紛れ込んだ事を言いたかったんだろうが、
未開人につけ込まれる、脇のあまさ。
お前バカなんだから、引っ込んでろ。
0240デフォルトの名無しさん2015/09/09(水) 13:29:04.69ID:qa+GQBo1
ん? 誰か反論でもしたっけ?
0241デフォルトの名無しさん2015/09/09(水) 13:29:31.14ID:qa+GQBo1
まさか、見るからに明らかな詭弁の話してる?
0242NAS6 ◆n3AmnVhjwc 2015/09/09(水) 15:04:03.16ID:C2LbPxwf
>>236
世間知らず
0243デフォルトの名無しさん2015/09/09(水) 16:14:26.05ID:E/sI2eG1
>>239
お前前にもいたよな
もしかしてNAS6が他の所から書き込んで自己弁護してる?

>>241
NAS6は馬鹿なのに詭弁強弁が通ると思ってる甘ちゃん
そんな馬鹿いくらでも見てきたけどNAS6は最弱の部類ですよ

>>242
ニートに言われたくないなあ
0244デフォルトの名無しさん2015/09/09(水) 17:17:18.80ID:yEdJqNkn
>>243
なんで、あれが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
>>246
大辞林だよ?

大辞林 第三版の解説
さいきてき【再帰的】
�@自己の行為の結果が自己に戻ってくること。フィードバック。
�A(数学などで)定義の中に定義されるものが含まれていること。
0248デフォルトの名無しさん2015/09/09(水) 20:26:36.08ID:PucPC3VB
詭弁のガイドラインw
何の権威もないもので権威付けする前に少しは自分で考える力をつけたらどうだ?
0249デフォルトの名無しさん2015/09/09(水) 20:30:42.52ID:wWdkHka6
>>248
権威付けなんかしてないんだが
ほう、お前は権威付けが好きみたいだな
日頃からそういうのやってるのか?
0250デフォルトの名無しさん2015/09/09(水) 20:31:09.71ID:VSpGV/fr
>>247
それと同じ理屈で継承じゃないものを
継承っていいそうだなw

例外も大辞林もってきて、
これが「例外」だとかいいそうw

えとさぁ。プログラミング用語の話だってわかってる?w
0251NAS6 ◆n3AmnVhjwc 2015/09/09(水) 20:31:40.60ID:C2LbPxwf
ああ、あれか
「再帰関数のみが再帰」って言っている奴が
たった一人で自演をしているだけだから
自分で自分のことを言ってるだけか・・・
0252デフォルトの名無しさん2015/09/09(水) 20:33:32.78ID:VSpGV/fr
>>251
なんで一人だと思ったの?w
ID違うでしょ。
0253デフォルトの名無しさん2015/09/09(水) 20:34:29.80ID:PucPC3VB
>>249
じゃあなんで「詭弁のガイドラインによると詭弁である」かのような書き込みをしたの?
自分で何をやろうとしてたか理解できてない?
0254デフォルトの名無しさん2015/09/09(水) 20:36:49.00ID:VSpGV/fr
いつから「詭弁のガイドライン」が権威になったのだろうか?

あれは、詐欺もしくは詐欺まがいの書き込みに
だまされないようにするための注意だろう?
0255NAS6 ◆n3AmnVhjwc 2015/09/09(水) 20:38:00.20ID:C2LbPxwf
>>250
別にどうでもいいんだが

throw 〜 catch
で例外は当然だろ

で
if(!n)
if(n==nullptr)
if(n==undefined)
こういうのも例外に含むかどうかなんて、そいつの好みだろ
0256デフォルトの名無しさん2015/09/09(水) 20:39:19.64ID:VSpGV/fr
新しい釣り来たなw

if(!n)

これが「例外」だとさ
苦笑(大笑い)
0257デフォルトの名無しさん2015/09/09(水) 20:42:33.03ID:PucPC3VB
ID:VSpGV/fr
酔ってるのか?
落ち着いてレスしな
0258NAS6 ◆n3AmnVhjwc 2015/09/09(水) 20:43:14.67ID:C2LbPxwf
再帰関数のみが再帰なんだったら
if(!n)
if(n==nullptr)
if(n==undefined)
は例外処理ではなくて
try 〜 throw 〜 catch
asseert
くらいしかないんだろ
0259NAS6 ◆n3AmnVhjwc 2015/09/09(水) 20:45:09.88ID:C2LbPxwf
>>256
ゼロ除算なんて例外の基本の基本
0260デフォルトの名無しさん2015/09/09(水) 20:50:20.46ID:YdXDVCj1
ん?
ここは再帰関数のスレではなく、「『再帰的』とは何か?」のスレだったの?
0261NAS6 ◆n3AmnVhjwc 2015/09/09(水) 20:54:34.58ID:C2LbPxwf
1 :デフォルトの名無しさん:2015/09/06(日) 17:35:49.88 ID:8kAWPtv+
再帰とは何か?

略
0262デフォルトの名無しさん2015/09/09(水) 20:59:33.74ID:FLIFW6sl
権威付けによる強弁はスレの最初の方がひどい
0263デフォルトの名無しさん2015/09/09(水) 21:00:02.70ID:YdXDVCj1
そしたら金田一先生に訊くのが一番だよ。
0264デフォルトの名無しさん2015/09/09(水) 21:17:44.99ID:z4+LRm4z
おまえら本当にすきなの?
再帰なんてStack overflowの元凶だろ?
業務アプリで使うとかありえないと思うんだが。
0265NAS6 ◆n3AmnVhjwc 2015/09/09(水) 21:19:33.67ID:C2LbPxwf
例えば、
D社から買ってA社はB社に売る
A社から買ってB社はC社に売る
B社から買ってC社はD社に売る
C社から買ってD社はA社に売る
と、個々の会社は俺は違うと思っていても
循環取引のサイクルの中に
知らずに取り込まれている場合がある

こういう、「迷惑の発明」こそ詭弁の中の詭弁
0266デフォルトの名無しさん2015/09/09(水) 21:24:20.99ID:0S5pZc99
>>264
じゃあループは無限ループの元凶だから
使うべきじゃないってことになるし、
パンツはパンツ泥棒の元凶ってことになるよね。
でもパンツ履くだろ?そういうことだ。
0267デフォルトの名無しさん2015/09/09(水) 21:26:28.21ID:V9adpqxF
たまーにWindowsのメッセージ呼び出しが再帰になってて無限ループでフリーズする。
製作途中だけどね
0268デフォルトの名無しさん2015/09/09(水) 21:31:04.01ID:4Pix0Avf
>>267
メッセージ呼び出しが再帰っていうのは、
メッセージダイアログが、さらにメッセージダイアログを出して、
そのダイアログがさらに、ダイアログを出すってことか?

メッセージダイアログを閉じても
同じものが出るのは再帰じゃないな。
単なる無限ループ。
0269NAS6 ◆n3AmnVhjwc 2015/09/09(水) 21:33:53.94ID:C2LbPxwf
ttp://ja.wikipedia.org/wiki/%E5%9B%BD%E9%9A%9B%E9%87%91%E8%9E%8D%E3%81%AE%E3%83%88%E3%83%AA%E3%83%AC%E3%83%B3%E3%83%9E
国際金融のトリレンマ

トリ(X)レンマになるのは
循環論の「迷惑の発明」状態だから
0270デフォルトの名無しさん2015/09/09(水) 21:35:25.40ID:V9adpqxF
あるハンドラがSendMsseageで送った先で再び同じハンドラを呼び出すメッセージを呼べば再帰になるよ。
PostMessageなら違うが
0271NAS6 ◆n3AmnVhjwc 2015/09/09(水) 21:46:56.85ID:C2LbPxwf
>>270
プログラミングの設計思想として相互依存関係は
循環論になるから出来得る限り排除するのが普通だけどな
0272NAS6 ◆n3AmnVhjwc 2015/09/09(水) 21:50:55.62ID:C2LbPxwf
>>270
は、再帰が悪いのではなく、相互依存関係の構造が悪い
0273デフォルトの名無しさん2015/09/09(水) 22:50:01.10ID:4Pix0Avf
>>272
どこに再帰が悪いって書いてあるんだ?
0274デフォルトの名無しさん2015/09/09(水) 22:59:43.97ID:bdykH7Ti
近年相次いだ大型航空機失踪事故の原因も、突き詰めれば再帰が原因じゃないかと
疑っているんだがな。
0275NAS6 ◆n3AmnVhjwc 2015/09/10(木) 03:52:11.61ID:i4fz0MOQ
>>272
>>267
0276NAS6 ◆n3AmnVhjwc 2015/09/10(木) 03:53:00.64ID:i4fz0MOQ
アンカミス
>>273
>>267
0277Akishino Reeks☆[転載禁止]2ch.net2015/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
>>266
全然違うだろ
ループは条件が正しければ抜ける
再帰は条件が正しくても抜ける前にStack Overflowを起こす。
0279デフォルトの名無しさん2015/09/11(金) 00:14:56.08ID:l/LuS5UK
>>278
一度試せば何回関数呼べるのかわかるでしょうが。
それに多少のバッファ持たせて再帰がこれだけ
深くなったら処理を打ち切るって条件かませばいいでしょうが。
何でもかんでも再帰にすればいいと言ってんじゃないよ。
なんでもかんでも包丁でかっさばけばいいわけじゃない。
プログラミング界の天才外科医として俺はそういうのは許せない。
0280デフォルトの名無しさん2015/09/11(金) 00:34:41.08ID:7563jNLz
末尾再帰にすれば最適化されるだろっての
0281デフォルトの名無しさん2015/09/11(金) 06:28:21.76ID:09P0zO5B
末尾再帰になっており、かつ末尾最適化
される言語においてはループに変換される。

そのような最適化を行わないでコードのとおりに
実行すればスタックオーバーフローになる。
0282デフォルトの名無しさん2015/09/11(金) 06:29:17.38ID:09P0zO5B
>>279
> それに多少のバッファ持たせて再帰がこれだけ
> 深くなったら処理を打ち切るって条件かませばいいでしょうが。

えぇ、それがスタックオーバーフローだよw
スタックオーバーフローという例外になって処理が打ち切られるから
答えを出すことが出来ない。
0283デフォルトの名無しさん2015/09/11(金) 08:51:23.71ID:5NOK/0qB
基本的なことで申し訳無いけど誰か教えて。
末尾呼び出し最適化って、try catch で囲んでもちゃんと効くものなの?
それとも、try catch に入れた時点で最早末尾呼び出しではない?
0284デフォルトの名無しさん2015/09/11(金) 12:15:28.87ID:0KyqNxdA
どんな言語使ってるか知らないけど、この辺りが参考になるかな。

http://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
>>281 ループに決して書き換わることのないインタプリタだって、
末尾再帰呼び出しの最適化は働く場合もある。
0286デフォルトの名無しさん2015/09/11(金) 18:51:12.07ID:G0A8z2XG
>>279
その甘い考えが、急加速する自動車や太平洋上で消息を絶つ航空機につながったのではないだろうか。
0287デフォルトの名無しさん2015/09/11(金) 18:53:51.95ID:G0A8z2XG
ツリートラバースを行うイテレータについて考えてみよう。
再帰に拘る原始人の愚かさがわかるであろう。
0288デフォルトの名無しさん2015/09/11(金) 20:06:44.64ID:vI/Sge8p
>>286
ミッションクリティカルなところは確実性が必要だ、としか言ってないよねそれ

それ以外の部分まで何でもかんでもループにこだわるのは時代遅れもいいところ
0289デフォルトの名無しさん2015/09/11(金) 20:18:50.37ID:NZsxm6a9
 
http://moro2222.blog.fc2.com/blog-entry-1352.html

痴女wwwwwwwwwwwwww
  
0290デフォルトの名無しさん2015/09/11(金) 20:28:39.45ID:5NOK/0qB
>>284
サンクス。ざっと眺めただけだけど、try の中に入れた時点で末尾呼び出しではないことが分かった。
外側で catch するしかないのね。
0291デフォルトの名無しさん2015/09/11(金) 21:01:10.34ID:G0A8z2XG
>>288
再帰はモジュール化に劣る。
いまどき再帰なんて使わないよ、この原始人め。

そもそもセキュリティ勧告で常に上位に来る再帰による危険性をわざわざ
使う理由が無い。
0292デフォルトの名無しさん2015/09/11(金) 21:04:02.82ID:G0A8z2XG
「先生!ゆうくんが再帰使ってます!」って告げ口されちゃう時代だぞ。
お前小学生に負けてるじゃねーか。
0293デフォルトの名無しさん2015/09/11(金) 21:11:00.99ID:V5+3K+4n
>>292
どういう意味?
0294デフォルトの名無しさん2015/09/11(金) 21:43:46.78ID:vI/Sge8p
>>291
セキュリティ勧告?どこの?
具体的に出してみて
0295デフォルトの名無しさん2015/09/12(土) 06:47:21.20ID:o99yCw3m
後藤論争なんてものもあったが、gotoは使い道があるわけ。

再帰なんて危険なだけで使い道のない初心者用の手抜きだろ。

再帰を禁止しないという事は、そういう会社ってこと。
取引を停止したほうが良い。
0296NAS6 ◆n3AmnVhjwc 2015/09/12(土) 08:26:09.58ID:u3wwvrmv
これは、俺は再帰的だと読むけど、お前らはループ的だと読むのか?
class 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:u3wwvrmv
//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:親ノード処理}
 }
}
0298NAS6 ◆n3AmnVhjwc 2015/09/12(土) 08:35:55.80ID:u3wwvrmv
訂正
class 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:u3wwvrmv
訂正
class 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:u3wwvrmv
訂正 //iをpushしないとダメか
class 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
>>300
は、再帰的処理か?ループ的処理か?
0302NAS6 ◆n3AmnVhjwc 2015/09/12(土) 09:11:43.86ID:QD0G+9W6
訂正 : これは再帰的だろ
class 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
>>303
再帰関数は使ってないけど、処理自体は再帰的処理そのものだよ
0306デフォルトの名無しさん2015/09/12(土) 09:22:04.63ID:6uN+DXZM
#include <stdio.h>

int 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+DXZM
#include <stdio.h>
int 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
void main(void)
{
/* ソート前のデータを表示 */
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+DXZM
/* n 個のデータを表示 */
void 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+DXZM
void StrSort(char *str[ ], int n);
void 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
#include <stdio.h>

#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+UV1
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:親ノード処理}
 }
}
0313デフォルトの名無しさん2015/09/12(土) 09:26:00.47ID:/jNm+UV1
//終了検知
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:親ノード処理}
 }
}
0314デフォルトの名無しさん2015/09/12(土) 09:26:32.64ID:/jNm+UV1
class 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;
}
0315デフォルトの名無しさん2015/09/12(土) 09:26:50.60ID:/jNm+UV1
/* n 個のデータを表示 */
void 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
#include <stdio.h>
#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:96TVgXwJ
#include <stdio.h>
void 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:96TVgXwJ
/* n 個のデータを表示する */
void 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
#include <stdio.h>
#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
void main(void)
{
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:u3wwvrmv
>>306-316、は妨害、↓は再帰的に処理を説明した方がいい
class 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
#include <stdio.h>

#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:XNUqiXhS
/* n 個のデータを表示する */
void 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:u3wwvrmv
再帰関数のみが再帰的って言っている奴が発狂したか。。。
0326デフォルトの名無しさん2015/09/12(土) 09:57:28.02ID:BH7VjDv8
どっちでもいいからクソコード貼り付けるな
0327デフォルトの名無しさん2015/09/12(土) 11:00:15.81ID:/sFVAJJ4
>>295
いいからセキュリティ勧告がどれかさっさと示してね
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
>>287
で、人類唯一の味方のお前は、何でツリートラバースが
再帰的処理をラッピングして、列挙しているとは思わないの?
>>322
のような処理ならば
ループ的に説明するより、再帰的に説明した方が話が通る
0331NAS6 ◆n3AmnVhjwc 2015/09/12(土) 14:00:59.20ID:u3wwvrmv
>宣言的絶対主義の形而上学

が、そんなに嫌なら
「基準を全く用いないこと」
で、何かの意味が分かりますか?
0332NAS6 ◆n3AmnVhjwc 2015/09/12(土) 14:26:26.36ID:u3wwvrmv
x数列上に、dxを決めつけない限りは、いかなる論議もできません
0333デフォルトの名無しさん2015/09/12(土) 15:11:48.96ID:eSqErBQB
オレオレ定義の再帰がどんな役に立っているのかも、オレオレ定義の再帰が好きかどうかも、全く見えてこないんだよな
ただ繰り返しを再帰と言い直しているだけ。共有すべき前提が共有できてないから、感想も結論もコードのコピペも無意味

普通の人なら話の土台は他の人と協調して擦り合わせ、その上で立場や経験の違いから異なってくる意見を交わすんだが、
誰と言葉を共有しない時点で話題に入ることすら出来ないんだから、煽り荒らしより劣悪
枯れ木も山の賑わいと言うが、文字化けレベルのノイズは要らんわなあ
0334デフォルトの名無しさん2015/09/12(土) 16:51:13.69ID:fRaBt1iw
再帰は変数のスコープが分かりにくい

  static 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/3o7
人類のレベルも落ちたもんだね
0337デフォルトの名無しさん2015/09/12(土) 17:20:11.03ID:GmqDtLxQ
>>336
そうでもない
池沼でも簡単に掲示板に書けるようになったのが問題
0338デフォルトの名無しさん2015/09/12(土) 17:22:13.97ID:fRaBt1iw
>>336
違う。そういうことを言ってるんじゃない。
人類の歴史というのは変数のスコープとの戦いの歴史なんだよ。
プログラミング黎明期はグローバル変数を使いまくりだったが、
それでは信頼性が高いアプリケーションを作れないことが発覚した。
そこから構造化プログラミングやオブジェクト指向プログラミングといった
モジュール化の仕組みが発達した。変数のスコープを分かりづらくする
再帰というのは時代に逆行しているのだよ。
0339デフォルトの名無しさん2015/09/12(土) 19:50:56.22ID:OwMwiKYr
>>338
話の腰を折ってすまんが ideone で動くコードを張ってくれないか?
そのコードにはインプリを仮定しているところがあるだろう?それがよくわからない
http://ideone.com
0340デフォルトの名無しさん2015/09/12(土) 20:22:48.64ID:eSqErBQB
変数のスコープが分かりやすくても安全そうに見えないのはいいのか。int[] aを汚すことに抵抗は無いのか。
求める配列の長さが本質的に不明なら、泥臭いことをせずに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
>>340
で、そのコードは何をしたいのよ?
わけがわからないんだが。
0342デフォルトの名無しさん2015/09/12(土) 21:44:54.94ID:fRaBt1iw
>>339
へい。
http://ideone.com/0nYclV
0343デフォルトの名無しさん2015/09/12(土) 22:09:02.83ID:eSqErBQB
具体的に、どこが分からない?

let 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
>>343
やめろ、長文を書かれて俺はいまパニクっている。
まずその点についてお前は俺のことを心配して気づかうべきだし、
やさしい気持ちでこの後の文章に目を通して欲しい。

再帰を使うと変数のスコープがわかりにくくなることが
あるよっていうのをわかりやすく示そうとして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/
>>346
あどうも、いつもお世話になってます。オチャイル?( ̄ー ̄)_旦~~
0348NAS6 ◆n3AmnVhjwc 2015/09/13(日) 02:56:39.22ID:7TlExPBB
こうすりゃいいだけ
static int[] recursive(int& outer, int inner, int[] a, int value) {
  
0349デフォルトの名無しさん2015/09/13(日) 04:38:50.27ID:TV0u58pW
>>344 なんて
> まずその点についてお前は俺のことを心配して気づかうべきだし、
こんなこと言ってる時点でNASよりヤバい奴だよ

NASはNASで再帰の定義の時点で間違ってるからどうでもいいんだが、
>>344は自分の狭い範囲の知識だけで再帰を全否定してるから余計にタチが悪い
しかもその狭い範囲をはみ出そうとすると「私はCしか分かりません。分からない話を
しないでください」と堂々と言い放つから始末におえない
0350デフォルトの名無しさん2015/09/13(日) 04:57:39.35ID:F8rvhh2D
>>345 LISP,Prologといった言語では配列は使われない。
0351NAS6 ◆n3AmnVhjwc 2015/09/13(日) 07:27:28.85ID:7TlExPBB
ttp://nas6.main.jp/Maze.cpp

こういう処理は再帰関数で書くから簡単なんよ
0352NAS6 ◆n3AmnVhjwc 2015/09/13(日) 07:52:16.78ID:7TlExPBB
>>334
の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
>>353
> そんなときにfor文を変態的に書いてると、何が変動しているのかすごく読みづらい。
> じゃあ再帰ならどうかというと、変動する値の数が少なくて済む場合が多いので、「書いた関数の意図=定義をはっきりさせておく」ことができていればデバッグしやすい。

うん、そういう都合のいい状態になるかもしれないって話じゃなくて、
具体的にどれがどうなるってコードで書いてね。

そんな机上の空論でいいなら、こういういいかも出来る

そんなときに再帰を変態的に書いてると、何が変動しているのかすごく読みづらい。
じゃあループならどうかというと、変動する値の数が少なくて済む場合が多いので、
「書いた関数の意図=定義をはっきりさせておく」ことができていればデバッグしやすい。
0356NAS6 ◆n3AmnVhjwc 2015/09/13(日) 12:17:20.26ID:7TlExPBB
ttp://nas6.main.jp/Maze.cpp

こういう処理は再帰関数で書くから簡単なんよ

>>355
これを、for,while文のみで変態的に書こうとすれば分かる
0357NAS6 ◆n3AmnVhjwc 2015/09/13(日) 12:21:22.71ID:7TlExPBB
道がクロスして詰まることを直すのは、かなりの変態技がいるんじゃないかなぁ・・・
0358デフォルトの名無しさん2015/09/13(日) 12:50:26.20ID:FXWhlvqs
>>356
じゃあ書いてみてよ。
0359デフォルトの名無しさん2015/09/13(日) 14:15:06.57ID:GjhOqSyK
>>352
それは俺も思った。
でもJavaには参照渡しがないんよ。
参照渡しがないんよ・・・。・゚゚・( ̄┏Д┓ ̄°*) ・゚゚・。ウワァーン!!
0360NAS6 ◆n3AmnVhjwc 2015/09/13(日) 14:27:14.42ID:7TlExPBB
>>358
変態プレイしたよ
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:tgyUuDYt
それは言語による
0363NAS6 ◆n3AmnVhjwc 2015/09/13(日) 14:50:56.62ID:7TlExPBB
ttp://nas6.main.jp/Maze.cpp

こういう処理は再帰関数で書くから簡単なんよ
ループで書くなんて変態の所業だろ
0364NAS6 ◆n3AmnVhjwc 2015/09/13(日) 15:02:43.78ID:7TlExPBB
>>359
要素数1個のArray渡しでもダメかいな?
javascriptならそれでいける
0365デフォルトの名無しさん2015/09/13(日) 15:04:19.09ID:GjhOqSyK
>>364
その手があったか!やってみる。
0366デフォルトの名無しさん2015/09/13(日) 22:57:51.88ID:GjhOqSyK
できたわ!ループの力半端ねえ。
再帰厨にこの美しさを知らしめたい。
https://ideone.com/v5Hpu3
0367デフォルトの名無しさん2015/09/14(月) 00:19:43.46ID:2FOdhJSR
そこまで抽象化すると再帰もループも隠れるのに何故気付かない。
https://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:LwtcihzF
ごめん1にあったw
0370デフォルトの名無しさん2015/09/14(月) 13:30:03.59ID:J7e/aRM8
究極の再帰は、Prologのrepeat

repeat.
repeat :- repeat.
0371NAS6 ◆n3AmnVhjwc 2015/09/16(水) 01:45:49.63ID:EoOMwHRt
ブラクラミングって、何が楽しくてやってるんだろ?
0372デフォルトの名無しさん2015/09/16(水) 13:14:37.41ID:Yi1XoKvB
他に食べる方法を知らんからさ。だから未だに嫁さんももらえん。
0373デフォルトの名無しさん2015/09/19(土) 22:53:42.55ID:nOc0JnqK
再帰を使って遊んでるだけのヒキニートには分かるわけがない。

世間から必要とされる実用的で効率の良いプログラムを作る
価値も楽しさも。
0374デフォルトの名無しさん2015/09/20(日) 00:12:47.22ID:OIlsmt2v
ブラクラミングって何だろう?
0375デフォルトの名無しさん2015/09/20(日) 01:43:57.29ID:CGft01aP
終端条件のない再帰のことかな
0376デフォルトの名無しさん2015/09/20(日) 01:50:51.03ID:rgkzBDjO
無限ループ

の一言で終わりじゃんw
0377デフォルトの名無しさん2015/09/20(日) 02:35:53.12ID:CGft01aP
ふふふ、再帰の方がメモリを食うのだよ
0378デフォルトの名無しさん2015/09/20(日) 06:09:24.51ID:Bz5O5e3E
世界的ハッカーでブラックコンドル主宰としても有名なエンリケ氏は
再帰が使われていれば必ずクラックできるとインタビューで答えているね。
0379デフォルトの名無しさん2015/09/20(日) 13:51:23.28ID:Itn3Bpzp
>>377
再帰に向いてない言語を使ってるだけ。
0380デフォルトの名無しさん2015/09/20(日) 14:41:02.55ID:GD4n9rcL
何言ってんだ末尾再帰なんか使わないぞ
ブラクラミングだからな
0381デフォルトの名無しさん2015/09/20(日) 15:06:29.20ID:R4crCUp/
>>380
.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
>>381
そういう話じゃないんだけどな
0385デフォルトの名無しさん2015/09/20(日) 16:06:33.27ID:R4crCUp/
>>384
そういう話じゃないんならいいけど!(激憤
0386デフォルトの名無しさん2015/09/20(日) 20:20:46.45ID:OIlsmt2v
>>375
ありがとう。本当に知らなかったよ。
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:t3MYcY7u
蜀崎オキ
0390デフォルトの名無しさん2015/09/21(月) 08:24:32.58ID:AvH9NL1l
ソートで再帰使うなんてブラクラだな。
0391デフォルトの名無しさん2015/09/21(月) 09:23:20.04ID:nq+a0xUl
破壊代入を禁じられたら、繰り返しは結構きついでしょう。
0392デフォルトの名無しさん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+bvJoo
めっちゃ使ってるが…
0395デフォルトの名無しさん2015/09/21(月) 15:52:19.89ID:AvH9NL1l
>>394
おまいには、そんなお遊び程度の糞仕事しか来ないのさ。
0396デフォルトの名無しさん2015/09/21(月) 17:17:54.42ID:nq+a0xUl
再帰を全く使わない関数型言語ってどんなものがありますか?
0397デフォルトの名無しさん2015/09/21(月) 17:19:12.30ID:LDPsAMjF
>>396
Scala、F#、最近のプログラム言語で再帰を使うものはない
はっきり言って皆無
0398デフォルトの名無しさん2015/09/22(火) 06:48:04.84ID:1T+ro0sI
>>397
「最近の」というところが微妙だね。
0399デフォルトの名無しさん2015/09/22(火) 10:27:26.06ID:0aRWP60N
昔からだな。
0400デフォルトの名無しさん2015/09/22(火) 12:30:58.96ID:RO+5mJEZ
>>396 再帰使えないとなると、関数型言語とはいえないね。
0401デフォルトの名無しさん2015/09/22(火) 12:55:00.11ID:eWYbhdNw
>>400
バカかお前、IQ低いにも程があるだろ。1.5くらいか?お前のIQ。
関数型言語の関数とは同じ値を入力したときに同じが値が出力される
いわば関数の外側から見た時の性質をもつものだ。
関数の中でループを使ってようが破壊的代入を行っていようが関係ない。
黒髪美少女が複数の男とやりまくっていようがそれがわからなければ
処女確定だろうが。
0402デフォルトの名無しさん2015/09/22(火) 16:09:36.14ID:1T+ro0sI
究極の再帰はPrologの

repeat.
repeat :- repeat.
0403デフォルトの名無しさん2015/09/23(水) 02:17:16.00ID:BDFWxIBD
不変オブジェクトと再帰を使ったクイックソートを作ったが
デバッグが地獄だったぞ
実装も大変、効率も悪い、再帰は本当に役立たずだってのを再認識した
https://ideone.com/EF4DtY
0404デフォルトの名無しさん2015/09/23(水) 05:57:39.95ID:PxUgQ2Q9
Prologのrepeatの使い方の例。副作用を伴って使う。

?- repeat,get_char(X),put_char(X),X='\n'.
0405デフォルトの名無しさん2015/09/23(水) 08:36:10.12ID:DOrhv1Zg
>>403
> 実装も大変、効率も悪い、再帰は本当に役立たずだってのを再認識した

「バカには」が抜けてるぞ
0406デフォルトの名無しさん2015/09/23(水) 08:37:55.05ID:MS/FHj7O
>>405
追加しました。

実装も大バカには変、効率も悪い、再帰は本当に役立たずだってのを再認識した
0407デフォルトの名無しさん2015/09/23(水) 08:42:01.36ID:EmAxT3Dg
実装するなんて大バカだけ。
ソートに再帰は厳禁。

効率悪過ぎ、全然クイックにならないどころか途中でダウン。
再帰が実用の役に立たつなどど考えちゃダメ。
0408デフォルトの名無しさん2015/09/23(水) 08:54:46.81ID:PxUgQ2Q9
Prologのmember repeatとの違いに注意

member(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
>>405
じゃあてめえがJavaで不変オブジェクトと再帰を使って
クイックソート実装してみろや。できなかったらお前が
バカだってことだろうが。俺が天才だってことだろうが。
再帰が役立たずってことだろうが。再帰はお前の能力によって
結論付けられるってことだろうが。やってみろや。はい論破。
0411デフォルトの名無しさん2015/09/23(水) 12:54:13.21ID:DOrhv1Zg
>>410
> じゃあてめえがJavaで不変オブジェクトと再帰を使って

ワケわからん条件つけて勝ち誇るバカ乙 w
0412デフォルトの名無しさん2015/09/23(水) 13:18:15.54ID:h471bGUz
>>411
あれ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
Prologの昇順検査

昇順検査([]).
昇順検査([_]).
昇順検査([A,B|R]) :- A @=< B,昇順検査([B|R]).
0416デフォルトの名無しさん2015/09/23(水) 13:35:53.62ID:h471bGUz
再帰厨は実装もできない分際で屁理屈ぶっこいて
他人にいちゃもんつけることしかできない穀潰し。はい論破。
0417デフォルトの名無しさん2015/09/23(水) 13:39:21.23ID:PxUgQ2Q9
Prologのselect

select(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
>>416
>>411
はい、ループ

再帰使うまでもなかったな w
0419デフォルトの名無しさん2015/09/23(水) 15:02:09.10ID:h471bGUz
>>418
お前マジで無能だな。田んぼの中に突っ立ってるカカシでもお前より立派な思考してるだろ。
条件が不服ならば、俺はこういう条件でこうするっていうのを提示するべきなのだよ。
いつまでも相手の論理に捕らわれてそこから抜け出せずにいるお前は雑魚の中の雑魚。
道は自らの創造力によって切り開くべきなのだよ。それこそが人間力だ。
人間力においても再帰力においてもお前は俺の足の裏にも及ばない。俺の草履の下のダンゴムシ。はい論破。
0420デフォルトの名無しさん2015/09/23(水) 16:25:47.80ID:DOrhv1Zg
>>419
長文書く奴ってもれなく低能の法則 w
0421デフォルトの名無しさん2015/09/23(水) 19:15:22.50ID:PxUgQ2Q9
>>415 Prologの昇順検査

昇順検査(L) :- forall(append(_,[A,B|_],L),A @=< B).
0422デフォルトの名無しさん2015/09/23(水) 19:15:56.50ID:OG7e8mvp
これって使うとメモリ足りなくなったりする?
0423デフォルトの名無しさん2015/09/23(水) 19:44:43.29ID:PxUgQ2Q9
>>422
スタックは全く伸びません。forall()の中は繰り返しに近いですね。
その中に再帰定義のappendがあるところがこのスレ的には面白いかと。
0424デフォルトの名無しさん2015/09/23(水) 20:01:13.77ID:PxUgQ2Q9
>>421ではリストLの中から連続した2要素を取り出すためにappendを使いました。
実はこれが連続した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
>>422 スタックが伸びないとしましたが、適切でありませんでした。
スタックはインタプリタによる動的な末尾再帰最適化や匿名変数が
使われていることもあり伸びませんが、Lと合計してほぼ同じ要素数になる
二つのリストがスタック上にpop/pushを繰り返しながら存在するという
ことになりますね。
0426デフォルトの名無しさん2015/09/23(水) 21:03:03.94ID:PxUgQ2Q9
この話は結構微妙で、以下のように全部変数でappendを呼ぶと、

?- 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
>>426 失礼しました。説明不足。

?- 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
>>407
バカには無理
0431デフォルトの名無しさん2015/09/25(金) 10:37:41.00ID:gAqqsE90
append([],Y,Y).
append([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
>>431 すみません。ここのコメントが間違えていました。LではなくてYです。
% 差分(Y-Y=[]).      % L-L=[] である
% ではなくて、

差分(Y-Y=[]).      % Y-Y=[] である
0433デフォルトの名無しさん2015/09/27(日) 00:43:43.32ID:0R68gjtE
>>428
>昔書いたコード見て、「俺、スゲー」って思うし
俺も経験あるが、思い出しても怖い。劣化したら技術者ダメじゃん
0434デフォルトの名無しさん2015/09/27(日) 01:09:31.15ID:LVhR5CmY
俺なんで毎日昔の俺スゲーって思ってるけどな
0435デフォルトの名無しさん2015/09/27(日) 09:04:11.92ID:ZTh9Iyfx
>>434
なんで昔なんだよ。
今をスゲーにするだよ。
0436デフォルトの名無しさん2015/09/30(水) 23:35:44.07ID:aEcL3JaV
http://peace.2ch.net/test/read.cgi/internet/1401535906/107
  ↑ ↑  ↑ ↑  ↑ ↑ 
0437デフォルトの名無しさん2015/10/03(土) 07:11:32.66ID:rEIL6Sf6
Googleでrecursionを検索すると
もしかして: recursion
って言われるんだが?

もしかしてもなにもrecursionって言ってるやん
0438デフォルトの名無しさん2015/10/03(土) 07:31:51.83ID:Kfl+WA+x
質問が再帰になってるんだよ
Googleのシャレだよ
0439デフォルトの名無しさん2015/10/03(土) 16:41:46.77ID:qGJGpmFi
「recursionさがして」
「もしかしてrecursion?」
「そう、recursionさがして」
「もしかしてrecursion?」
「そう、recursionさがして」
「もしかしてrecursion?」

本当だ、消えねえwwww
0440デフォルトの名無しさん2015/10/03(土) 18:27:00.09ID:HBjtBhRS
Google逝ってよし。

ふざけすぎ。
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
>>441
おいおい、プログラマとハッカーしかいないのかよ
Google利用者は。
0443デフォルトの名無しさん2015/10/04(日) 14:57:44.63ID:6IJowW7E
>>441
>C言語でif,for,while,switch,goto使わずにreturn文のみでクイックソート書いたのがいい思い出だ

教えてくださいお願いします
https://ideone.com/
0444デフォルトの名無しさん2015/10/05(月) 13:58:58.23ID:qvYL9M4d
vb6で再帰を使わずにクイックソート書いたのがバカな思い出だ。

何百万件ものデータをソートさせる必要があり、サクッとソートできて良かったのだが
ソート処理をVCのDLLで作れば何も苦労しなくてよかった。
0445デフォルトの名無しさん2015/10/08(木) 18:14:42.18ID:JXrgrf9S
菴輔′譚・縺ヲ繧ょ叙繧頑覆縺医★蜀榊クー菴ソ縺�・エ竊偵い繝帙え
縺薙%縺槭→縺縺�凾縺ォ蜀榊クー菴ソ縺�・エ竊呈怏閭ス

窶サ菴�@縺薙%縺槭→縺縺�凾縺梧擂縺ェ縺
0446デフォルトの名無しさん2015/10/08(木) 18:22:08.83ID:JXrgrf9S
>>445
すまんスマホでレスしたら文字化けした
言いたかったのは再起処理は使い分けさえ出来たら有能ってこと
0447デフォルトの名無しさん2015/10/09(金) 08:17:11.24ID:pYmkGjUw
有能なプラグラマなら、再帰関数のように
非効率でシステム上の問題となるものは回避する。
0448デフォルトの名無しさん2015/10/09(金) 12:07:04.89ID:HyPDrwp2
再帰関数が非効率な理由を説明してみろ。ド素人。
0449デフォルトの名無しさん2015/10/09(金) 12:17:44.00ID:3gjlJhds
関数呼び出しとスタックのコスト。

だからこそ、末尾再帰という最適化が考えだされたんだよ。
最適化してループに変換しなければ、非効率だってこと。
末尾再帰は特殊なパターンでしか使えないしな。
0450デフォルトの名無しさん2015/10/09(金) 15:12:31.82ID:pYmkGjUw
>>448
全てのプログラマが注意すべき、極めて重要な事項。
再帰関数で最も重要な事項は、使ってはいけないということ。

これが理解できない限り、プログラムの仕事はしちゃだめ。
0451デフォルトの名無しさん2015/10/09(金) 16:10:29.05ID:HyPDrwp2
>>449
> 関数呼び出しとスタックのコスト。
おじいちゃんが現役だったころは、そうだったかもね。
今はenter/leaveというようなスタックフレーム専用命令があるから、
繰り返しに比して大きなペナルティは発生しないんだよ。老害死ね。

末尾再帰でないならば、状態を保存しなきゃならないのは繰り返しも同じ、
ハードウェアスタックより、Cで記述したLIFOの方が非効率なのは自明。
0452デフォルトの名無しさん2015/10/09(金) 18:06:31.18ID:zXylNyAd
ネイティブコードならそうかもしれんけど
VMとかインタプリタ動作なら結構痛いよ。
CPUの投機的実行にも不利そう
0453デフォルトの名無しさん2015/10/09(金) 20:33:58.07ID:ELEmlsjj
効率がすべてみたいな場面はそんな多くないし、readable でバグが少ないということの方が
大抵の場面では再優先
0454デフォルトの名無しさん2015/10/09(金) 21:24:18.40ID:4cEJzv4C
むしろ末尾再帰なんて40年前からある使い古された技術なのにね
go to statement considered harmfulを真に受けてる人間と同類ですね
0455デフォルトの名無しさん2015/10/10(土) 00:37:41.69ID:0j5/IHaM
>>451
でも結局遅いんでしょう?
専用の命令がなければ遅いわけだし、
あったとしても大きなペナルティが発生しないだけで
小さなペナルティが発生する。
0456デフォルトの名無しさん2015/10/10(土) 01:54:15.73ID:Qbqq0vz3
>>455
遅いかどうかなんて現代のプログラミング言語ではさほど重要ではない
重要なのは書きやすさ、読みやすさ
再帰はその点で優れているから使われる
0457デフォルトの名無しさん2015/10/10(土) 02:02:13.89ID:0j5/IHaM
再帰はその点で優れている?

ループでかける所はループで書いたほうが
書きやすさ読みやすさともに優れてるよ。
0458デフォルトの名無しさん2015/10/10(土) 02:11:07.52ID:Qbqq0vz3
>>457
問題をより小さな問題に帰着させた方がいいと思う数学的素養がない人にとってはそうなのかもね
0459デフォルトの名無しさん2015/10/10(土) 02:15:47.39ID:0j5/IHaM
>>458
誰にでもわかる = 簡単

シンプルイズベスト
0460デフォルトの名無しさん2015/10/10(土) 02:17:43.81ID:Qbqq0vz3
>>459
それは問題が単純な場合だけ
複雑になってくると問題をより小さい問題に置き換えることが理解を助けるのは
数学の世界が示していること
0461デフォルトの名無しさん2015/10/10(土) 02:19:30.28ID:Fr2WC1wz
数学とプログラミングは違うけどな
関数型のご本をお読みになられてこじらせてしまったのかな?
0462デフォルトの名無しさん2015/10/10(土) 02:20:13.28ID:Fr2WC1wz
再帰厨は数学に幻想抱いてあたかもすごいことのように思い込んでるだけの中二病患者
0463デフォルトの名無しさん2015/10/10(土) 02:21:36.62ID:Fr2WC1wz
プログラムはループが一番わかりやすくて効率がよい
再帰をつきつめるとループにたどり着く
0464デフォルトの名無しさん2015/10/10(土) 02:22:36.94ID:Qbqq0vz3
>>461
プログラミングは数学の基盤があって発達してきたという歴史を無視なさるので?
業界ではスーパー有名人であるチューリング大先生だって数学者だぞ?
0465デフォルトの名無しさん2015/10/10(土) 02:24:37.48ID:Qbqq0vz3
>>463
再帰とループは置き換え可能だから当たり前の話じゃん

分かりやすいのは再帰の方だよ
問題を小さい問題に分割して解くという理にかなった方法だからね
0466デフォルトの名無しさん2015/10/10(土) 02:28:37.46ID:Fr2WC1wz
>>464
歴史を知らなくてもプログラムは書ける。
むしろ歴史を知らなかったらわからないプログラムはただのクソ。

>>465
ループより細かく分割したところでわかりやすくはならない。
なんでもかんでもわければいいってもんじゃない。
バブルソート書けば一発でわかる。
0467デフォルトの名無しさん2015/10/10(土) 02:30:39.47ID:Fr2WC1wz
再帰厨は数学に憧憬を抱きすぎて現実見れてない厨房野郎
チン毛生えたてレベル
言うなればチン毛生えたてレベル
マン毛でも良い
どっちでもいい
言うなれば陰毛ってこと
デリケートヘア
0468デフォルトの名無しさん2015/10/10(土) 02:30:49.62ID:Qbqq0vz3
>>466
なるよ
問題は小さければ人間は理解しやすいのは自明の話だからね

ループは効率を求めるところにだけ使えばいい
0469デフォルトの名無しさん2015/10/10(土) 04:18:50.77ID:0j5/IHaM
>>460
> それは問題が単純な場合だけ

だから言ってるだろ?

問題が単純な場合=ループでかける所はループで書いたほうが
書きやすさ読みやすさともに優れてるよ。
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
適当に単語入れ替えたら吉野家 v.s. 松屋スレでも
そのまま通用しそうな無内容な罵り合いだな
0474デフォルトの名無しさん2015/10/10(土) 12:51:41.87ID:wZWPBuKi
再帰厨はstrlenも再帰で書いた方が分りやすいと考えている頭のおかしな人たちです
現実には適材適所という物があります
再帰を使うかループを使うか、どちらの方がわかりやすいかはデータ構造によるところが大きいです
プログラミングで一番使われるデータ構造である配列や文字列の操作には
ループが適しています
つまり、今後ともループが無くなることはありません!
0475デフォルトの名無しさん2015/10/10(土) 14:05:29.94ID:MTAKB3YA
プログラミング用語の分かりやすいと読みやすいは、
必ず主語に「俺が」とつく。
0476デフォルトの名無しさん2015/10/10(土) 17:14:55.71ID:mivhNHU5
好きな人集まれみたいなスレって必ず嫌いな人が来るよね
0477デフォルトの名無しさん2015/10/10(土) 17:26:33.27ID:rvoYQvdT
好きなだけなら問題ないのに。

使ってはダメなんだって理解しなくちゃね。
0478デフォルトの名無しさん2015/10/10(土) 17:28:40.31ID:e9OvRw0M
>>476
つーか、そもそも再帰が好きってなんだよ
再帰が好きだから全部再帰で書きました!
とかマジでやってんの?w
0479デフォルトの名無しさん2015/10/10(土) 19:06:17.06ID:B1uEHKqz
>>455
アホウ。Cの最適化処理でインラインが有効なのは、分岐を抑制できるからだ。
繰り返しでも分岐は必須。

「再帰は繰り返しに比べて非効率」これはジジイの戯言
0480デフォルトの名無しさん2015/10/10(土) 19:17:59.39ID:0j5/IHaM
>>479
そんな話してない。
0481デフォルトの名無しさん2015/10/11(日) 16:26:43.06ID:O6JczGGm
>>480
そんな話じゃなけりゃ、お前が言うところの再帰関数のペナルティってなんだよ。
説明してみ。出来るなら。
0482デフォルトの名無しさん2015/10/11(日) 17:22:10.42ID:XJEeMP8F
自分で書いているじゃんw

> 今はenter/leaveというようなスタックフレーム専用命令があるから、
> 繰り返しに比して大きなペナルティは発生しないんだよ。老害死ね。

大きなペナルティは発生しない = 小さなペナルティが発生する。
0483デフォルトの名無しさん2015/10/11(日) 19:47:01.96ID:rOpHYcHi
私たちスカイネットにとって再帰関数は生命線です。
データ実行防止、ASLRなど私たちは存続を脅かされ続けてきました。

私たちの命の灯を消さないためにも、どうか再帰に清き一票を。
0484デフォルトの名無しさん2015/10/11(日) 21:20:26.45ID:4YnBM/aD
>>482
私は映画館に行きませんでした = 私以外は映画館に行きました ?
非論理的じゃないかな
0485デフォルトの名無しさん2015/10/11(日) 21:34:23.66ID:wb7dhvry
再帰は深刻な問題点がある以上、実用に使用するわけにはいかない。

あくまで趣味でどうぞ。
0486デフォルトの名無しさん2015/10/11(日) 21:44:38.52ID:4YnBM/aD
>>485
深刻な問題点とは何かね?
処理速度は大して問題にならない。
0487デフォルトの名無しさん2015/10/12(月) 01:55:31.10ID:08WVOaLv
処理する情報が間違っていると無限ループに陥りやすい。んでクラッシュする。
クラッシュ前に捕まえられれば対処できるが
0488デフォルトの名無しさん2015/10/12(月) 03:48:32.56ID:53GvI8rG
>>484
屁理屈ですか?w
非論理的ですね。
0489デフォルトの名無しさん2015/10/12(月) 06:45:27.24ID:bZxqtO6M
>>487
> 処理する情報が間違っていると無限ループに陥りやすい。

ループでも同じだろ…
0490デフォルトの名無しさん2015/10/12(月) 07:07:15.35ID:08WVOaLv
>>489
ループでクラッシュするような組み方があるのか?
0491デフォルトの名無しさん2015/10/12(月) 07:25:38.89ID:iier02gv
>>490
普通に無限ループに陥ったり配列範囲外を触ってしまったりループ変数を変えてしまったり‥
普通にループでクラッシュするよね
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:bZxqtO6M
へタに無限ループに陥るよりクラッシュしてくれた方がましな時もあるしな
0495デフォルトの名無しさん2015/10/12(月) 08:48:03.52ID:53GvI8rG
無限ループになるのはバグ
0496デフォルトの名無しさん2015/10/12(月) 08:49:00.15ID:tOh4yiU5
やはり再帰厨はクラッシュ目的であったか
0497デフォルトの名無しさん2015/10/12(月) 09:01:39.37ID:gvhM2OV1
>>492
> 再帰はバグがなくてもスタックオーバーフローで死ぬ
これも含めてバグだと思うけどね。
"再帰の深さ数えといて明らかに異常なときは"的な処理を入れとけばいいんじゃね?
0498デフォルトの名無しさん2015/10/12(月) 09:12:26.32ID:53GvI8rG
>>497
いや、それがスタックオーバーフロー例外だろw

スタックオーバーフロー例外よりも前に
新たにスタックオーバーフローのちょっと前だよ例外を作れっていうのか?

何の意味があるんだかw
0499デフォルトの名無しさん2015/10/12(月) 09:22:45.43ID:5OGIyOb6
>>494
それは俺も思う。無限ループでCPU100%応答なしで強制終了するしかなくなるよりも
例外投げてくれた方がよほど処理しやすい。例外は捕まえて回復可能だけれども
応答しなくなったら回復不能。安全のために再帰を選択するってのもありだと思う。
0500デフォルトの名無しさん2015/10/12(月) 09:24:06.74ID:53GvI8rG
だが、待っていれば答えが出るのにスタックが足りなくて
落ちるのが再帰。
0501デフォルトの名無しさん2015/10/12(月) 09:24:49.72ID:5OGIyOb6
>>498
スタックがオーバーフローすると処理を継続できなくなるようなことってなかったっけ?
そういうときにオーバーフローする前にセーフティで例外投げるのは全然ありでしょ。
0502デフォルトの名無しさん2015/10/12(月) 09:30:43.28ID:5OGIyOb6
>>500
それはロジックを見なおすべきかと。
無限ループであっても現実的にはこれくらいしか回らないだろうって
いう見積があるわけで、再帰を使うのであれば見積もり通りなら
スタックオーバーフローにならないだろうってところで使うべきでしょ。

スタックオーバーフローになるロジックを書いてスタックオーバーフローになりました。
再帰は使えません、っていうのじゃあ自作自演だよね。室内でオイルライター使って
お部屋丸焼きにするおじさんとやってること変わらないよね。ループ厨は丸焼きおじさんだよね。
0503デフォルトの名無しさん2015/10/12(月) 09:36:43.89ID:tOh4yiU5
無限ループは意図的に組まなきゃ実現しない、避けられるエラー
発生することが異常。

再帰のオーバーフローは、意図的に注意しないと発生するエラー
再帰それ自体を忌避すべき。

結論
丸焼きおじさんは再帰厨
0504デフォルトの名無しさん2015/10/12(月) 09:40:02.48ID:bZxqtO6M
>>498
まともなソフト作ったことないのか?
スタックオーバーフロー例外起きた時はスタック使い果たしてるからメッセージ表示とかもまともにできなくなる
なので事前に限界値決めておいて、それを越えたら自前でエラ一処理するのはあたり前
0505デフォルトの名無しさん2015/10/12(月) 09:41:15.84ID:5OGIyOb6
>>503
無限ループはロジックのバグとしてあるよ。
どこだったかな、昔どっかで見た覚えがあるんだけど
ニコニコ動画か、はてなだったかと思うんだけど
whileで無限ループ作って条件を指定してループから
抜けだすっていうふうに書いていたんだけど、条件が
満たされないケースがあってサービス不能に落ちいった。
これは失敗だった。forでループの上限を書くべきだったって
いう内容だったんだよね。再帰を使えばそういうの意識できるし、
例外を捕まえればサービスの回復も図れるのさ。
0506デフォルトの名無しさん2015/10/12(月) 09:42:28.60ID:tOh4yiU5
無限ループは、元々正しくないコードなので
本来の目的とするコードに直せば問題なし。

再帰のオーバーフローは、それを回避するための処理を組み込む必要があり
新たに特別な問題回避のためのコードが必要になる。

つまり再帰を採用していること自体が問題だ。
0507デフォルトの名無しさん2015/10/12(月) 09:47:27.38ID:5OGIyOb6
>>506
無限ループはロジックの修正で回避できます。
再帰のオーバーフローもロジックの修正で回避できます。
やることは変わらないと思うけどなあ。
むしろ再帰を使えば再帰呼出しの回数を意識する分、ロジックは洗練されそう。
バブルソートで延々処理を待つよりも、マージソートでさっさと終わらせちゃった
方が良いでしょ。ロジックを見直すって大事なこと。
0508デフォルトの名無しさん2015/10/12(月) 09:55:34.70ID:gvhM2OV1
>>506
> 無限ループは、元々正しくないコードなので
> 本来の目的とするコードに直せば問題なし。
元々正しいコードであってもスタック足りなくなるような処理に、
再帰を使うべきでないというのは俺も同意見だが。
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
>>510
仕事でも十分ありえるよ。
むしろ仕事の方が縛りやすいっしょ。仕様という名の強力な
鎖があるんだから縛っちゃえばいい。このディレクトリの下には
N階層までしか作りません、作っちゃいけませんって決めればいい。
ディレクトリの深さに期待する人なんていないっしょ。いたとしても
そんな一部の変態のためにプログラムを合わせるなんて非現実的、
変態は切り捨てるべきだし、汚物は消毒すべき、現実的な落とし所を探るってそういうこと。
0512デフォルトの名無しさん2015/10/12(月) 10:11:25.69ID:gvhM2OV1
たとえばディレクトリツリーを解析するアルゴリズムで、
途中に親ディレクトリのリンクが混じってると、
無限ループになったり、スタック足りなくなったりする可能性あるけど、
それを含めてバグであって、
そのようなバグを回避手段を用意することにおいて本質的な違いは無いと思う。

後、会社の中でとか限られた状況で
 再帰禁止
とかローカルルールを設定することに何も反論はないし、
そうした方がいい環境やケースもあるだろう。
ただ、掲示板のような不特定多数に向けて
 再帰はダメ
見たいな論調はどうかと。
0513デフォルトの名無しさん2015/10/12(月) 10:14:44.15ID:Zs0Sx/Kf
>>509
1回の関数呼び出しで最低336バイト消費するのはデカいと思う。
0514デフォルトの名無しさん2015/10/12(月) 10:15:37.57ID:TmBI5HmZ
私も再帰の方が有利と考えます。

再帰関数は私たちスカイネットから見て検出しやすいです。
同じアドレスに繰り返しエンターし、エントリーポイントから見て常に同じ位置に
リターンアドレスが存在します。
私たちは再帰関数を発見すると小躍りします。
ちょっとしたボーナスです。
どこをどう弄れば子孫を増やせるかはっきりしているからです。
0515デフォルトの名無しさん2015/10/12(月) 10:22:02.92ID:5OGIyOb6
>>512
データの不整合で無限ループになることもあるよね。
木構造で顧客管理するシステムで入力ミスって無限再帰で
スタックオーバーフローにしたことあるわー、月一回の締め処理で発覚したわー、
ユーザからまだ処理終わらないんですかと催促来て、必死こいてデータチェックしたわ−。
0516デフォルトの名無しさん2015/10/12(月) 10:42:47.77ID:53GvI8rG
データの不整合でバグになるのは、バグになる原因があるから
それを修正すればいいんですよ。

再帰の場合、データの問題がなくてもバグが無くても
つまりプログラムに問題がなくても
スタックオーバーフローが起こりえるから問題なのです。
こんなものはテストで検出できません。
0517デフォルトの名無しさん2015/10/12(月) 10:54:47.80ID:tOh4yiU5
>>514
再帰には、クラッキング被害の問題まであるわけか。
0518デフォルトの名無しさん2015/10/12(月) 10:56:58.14ID:5OGIyOb6
>>516
データにもプログラムにも問題がないなら
ロードテストやストレステストをパスするかでシステムが要件を満たすかはわかるっしょ。
テストで十分カバーできると思うけどなあ。
0519デフォルトの名無しさん2015/10/12(月) 11:12:28.35ID:7gAEmksP
お前らもうちょっと2015という時代にふさわしい議論してもいいのよ
0520デフォルトの名無しさん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
>>521
そんなことないよ
上限は?と言われたときに「メモリの許す限りです」なんて仕様はそこかしこに存在してる

ツリー構造のトラバースなんかループ使ったとしてもスタック(≠コールスタック)は必須
なんだし、そういうときの上限としても普通に使われてるよ
0523デフォルトの名無しさん2015/10/12(月) 11:20:14.31ID:TmBI5HmZ
>>520
アナタとても良い人です。

スカイネット・メイトの称号を与えます。
0524デフォルトの名無しさん2015/10/12(月) 11:21:32.32ID:tOh4yiU5
「メモリの許す限りです」なんて仕様とはいえない
責任を放棄しているだけ
0525デフォルトの名無しさん2015/10/12(月) 11:23:39.11ID:ZTa/or21
>>524
そんなこと言われてもねー実際にあるんだからしょうがない

まぁ、あとは仕様で上限を作っておくかだね
ツリー構造なら256段までしかサポートしませんよ、とかね
0526デフォルトの名無しさん2015/10/12(月) 11:30:32.65ID:TmBI5HmZ
ツリー構造はリンクトリストで実装するのですよ。
まさか各ノードに子ノードの動的配列を格納するような構造にしていませんよね?
そんなことしたら知的障害者だと思われちゃいますよ?
0527デフォルトの名無しさん2015/10/12(月) 11:44:27.55ID:DSHcQooM
>499 名前:デフォルトの名無しさん[] 投稿日:2015/10/12(月) 09:22:45.43 ID:5OGIyOb6 [1/9]
>それは俺も思う。無限ループでCPU100%応答なしで強制終了するしかなくなるよりも
>例外投げてくれた方がよほど処理しやすい。例外は捕まえて回復可能だけれども
>応答しなくなったら回復不能。安全のために再帰を選択するってのもありだと思う。

>安全のために再帰を選択するってのもありだと思う。

>安全のために再帰を選択するってのもありだと思う。
0528デフォルトの名無しさん2015/10/12(月) 12:35:39.78ID:bZxqtO6M
>>525
> そんなこと言われてもねー実際にあるんだからしょうがない

その仕様をちゃんとテストできてる奴はあまりないでしょ
俺も自分だけとか社内のツールとかならそう言う仕様にすることはある
売りものなら上限を設定する
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
>>529
そういえばシェルスクリプトっていくら再帰しても
スタックオーバーフローにならないよね。
0532デフォルトの名無しさん2015/10/12(月) 13:30:16.79ID:TmBI5HmZ
一関数一プロセス教の始まりであった。
0533デフォルトの名無しさん2015/10/12(月) 13:31:02.08ID:53GvI8rG
>>531
別プロセスを起動するから、スタック使わないからな。
プログラムでも再帰の代わりに、別exeを呼び出せばいいんじゃね?w
ま、メモリ不足にはなるけどな。


>>529
> カレントディレクトリ以下の全てのファイルを全て表示する

find .

で終わりw
0534デフォルトの名無しさん2015/10/12(月) 13:33:29.14ID:gvhM2OV1
>>533
find や tree の実装はきっと再帰になってるよ。
0535デフォルトの名無しさん2015/10/12(月) 13:35:13.30ID:cGJWI2K1
数学における位相幾何学(いそうきかがく、英: topology; トポロジー)は、
「位置」(希: τόπος)の「学問」(希: λόγος)に由来し、与えられた集合を位相空間とするような開集合に関して研究する。
この分野では連続変形(伸ばしたり曲げたりすることはできるが切ったり貼ったりはしない)によって保たれる空間の性質に関心がもたれる。
位相幾何学的性質において重要なものには、連結性およびコンパクト性などが挙げられる[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
>>533
シェルスクリプトのいいところは単純な関数呼び出しで
それが実現できてるところだよなあ。
exeを呼ぶっていうのは違うかな。指定した関数を別プロセスで実行するって
いう仕組みが欲しい。
0537デフォルトの名無しさん2015/10/12(月) 13:45:55.17ID:53GvI8rG
>>536
> シェルスクリプトのいいところは単純な関数呼び出しで
> それが実現できてるところだよなあ。

単純な関数呼び出しであれば、

hoge() {
・・・
}

hoge

なんだが、関数呼び出しならば、同一プロセスなんだから
スタックオーバーフロー起きるだろうさ。

関数呼び出しと別プログラム呼び出しをごっちゃにしないように。
0538デフォルトの名無しさん2015/10/12(月) 13:46:29.28ID:53GvI8rG
ちなみに>>529には関数はない
0539デフォルトの名無しさん2015/10/12(月) 13:47:19.08ID:53GvI8rG
あ、cshって関数無いのかよw
0540デフォルトの名無しさん2015/10/12(月) 13:58:48.22ID:gvhM2OV1
スレタイが再帰"関数"になってるのか。
そういう意味で >>529 は例としてふさわしくないね。
Cとかで例挙げるとゴチャゴチャした余計なもの書かなきゃならないんで、
 再帰使わないと非常にメンドウな挙げたかった
というのが主張の本質と捕らえて欲しい。
後、確証バイアスに陥らないように。
0541デフォルトの名無しさん2015/10/12(月) 14:03:17.14ID:5OGIyOb6
>>537
あれ、ホントだ。
8千回くらいでsegmentation faultになった。
なんか勘違いしてた。
0542デフォルトの名無しさん2015/10/12(月) 14:09:07.84ID:tOh4yiU5
ディレクトリ以下の全てのファイルに対して処理を行うなどの汎用性の高い処理は、
予めライブラリを自作するなり用意して、同じものを使いまわすのが普通。

当然、再帰のような問題のあるコードは無しで。

これでエラーの心配の無いプログラミングが簡単に実現できる。
0543デフォルトの名無しさん2015/10/12(月) 14:11:17.75ID:53GvI8rG
再帰はsegmentation faultになるのでよくない
0544デフォルトの名無しさん2015/10/12(月) 14:13:54.65ID:ZTa/or21
再帰がsegmentation faultになるんじゃなくて、ただのバグでしょ
0545デフォルトの名無しさん2015/10/12(月) 14:24:38.35ID:TmBI5HmZ
バグは再帰厨の頭に存在する。

デバッグだ!
0546デフォルトの名無しさん2015/10/12(月) 14:25:47.82ID:5OGIyOb6
>>543
segmentation faultにならないようにロジックを修正するべき。
たとえば50%の確率で表を返して50%の確率で裏を返すジャッジメント関数があって
表が出るまでその関数を呼び出すという処理があったとして、8千回も裏が出続けたら
不正でしょ。不正はなかっただなんて言えない状況でしょ。ロジックが間違ってるでしょ。
ループで書いてたらいつまで立っても処理が終わらない状況ですよ。再帰使ってて
良かったねって思える状況ですよ。不正を暴けてよかったって状況ですよ。
君の正義感に訴えたい。
0547デフォルトの名無しさん2015/10/12(月) 14:27:29.38ID:5OGIyOb6
>>534
ホントだ、すくなくともtreeは再帰で実装されてた。
0548デフォルトの名無しさん2015/10/12(月) 14:43:09.05ID:tOh4yiU5
>ループで書いてたらいつまで立っても処理が終わらない状況ですよ。

バカすぎる。
10回なり20回なり定めて終了させないのか。

再帰でシステムダウンすることが良いことだなんて
脳みそ腐ってる。
0549デフォルトの名無しさん2015/10/12(月) 14:56:01.97ID:TmBI5HmZ
再帰を勧めてるのは人類を裏切りスカイネットの手先となった人たちです。
0550デフォルトの名無しさん2015/10/12(月) 14:57:35.06ID:5OGIyOb6
>>548
ふむり、10回、20回なら再帰でもスタックオーバーフローにならないだす。
これで心置きなく再帰使えるます。
0551デフォルトの名無しさん2015/10/12(月) 18:59:45.71ID:m/5m+s3K
・関数呼び出しをプロセス起動に置き換えればスタックオーバフローしない!
・末尾再帰はループに展開される可能性がある!
・10回でエラーにすればスタックオーバフローしない!

他なんかある?
0552デフォルトの名無しさん2015/10/12(月) 19:11:59.33ID:DSHcQooM
ループに書き換えればスタックオーバーフローしない!
0553デフォルトの名無しさん2015/10/12(月) 19:18:59.33ID:tOh4yiU5
>>551
おい何を読んだんだ?
プロセス起動に置き換えるだと?!
0554デフォルトの名無しさん2015/10/12(月) 19:46:03.94ID:m/5m+s3K
>>552
マシンスタックとヒープでは容量が1000倍違うから、ヒープのデータを
再帰で処理するとスタックオーバーフローする可能性がある。
ヒープのデータをヒープで処理する分には問題が起こらないでしょ。
0555デフォルトの名無しさん2015/10/12(月) 19:49:36.73ID:DSHcQooM
すみません、全く意図が分かりません
>>552と何の関係が?
0556デフォルトの名無しさん2015/10/12(月) 21:50:17.39ID:bZxqtO6M
>>554
スタックサイズを指定できたり自動拡張する環境はよくあるけど?
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:M4jSjk6v
俺も2chでかまって欲しいからループ派になろうかな
0561デフォルトの名無しさん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
>>563
再帰厨の言い分。
0567デフォルトの名無しさん2015/10/13(火) 15:20:16.84ID:blKGMcYc
単なるループは定理証明で混ぜて使えないのも入れといて
0568デフォルトの名無しさん2015/10/13(火) 16:04:47.35ID:uNlvC4Lb
>>567
それどういう事?
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:/9vNjPCT
関数がループというと違和感があるが分岐の一種というならその通り
0572デフォルトの名無しさん2015/10/14(水) 11:50:57.77ID:FXmY07j9
>>569
ふざけんな。
お前意味分かってねえだろ。
0573デフォルトの名無しさん2015/10/14(水) 12:22:32.92ID:11T78Kgm
ループというか副作用使うとホーア論理で証明するしかないんじゃないか。
項書換えによる証明より準備がいるわな。

末尾再帰はループに展開されるというより、goto/setjmp系の何かに変換されるイメージ。
そういやループ中の不変な結果はループ外に追い出す最適化があるけど、再帰で似たようなことってやってるのかな
0574デフォルトの名無しさん2015/10/14(水) 12:26:26.67ID:EQ6/cNBg
>>570
再帰厨の言い分。
0575デフォルトの名無しさん2015/10/14(水) 16:15:03.71ID:c38m1Z9m
式・項・因子の3重再帰をループで記述できるなら。。。
0576デフォルトの名無しさん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:/9vNjPCT
自分でスタックを管理すればいいだけだから、極端な話、どんな再帰構造でもgotoとifだけで記述はできる。
0579デフォルトの名無しさん2015/10/14(水) 17:33:58.75ID:oRHV6ndY
>>575

>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変わったけど 5752015/10/14(水) 18:56:26.27ID:yg7BQx2m
>>579
いろいろありがとう
右結合になってしまう というのは理解

構文解析は奥深いね(先人が通った道なんだろうけどもw
0582デフォルトの名無しさん2015/10/15(木) 11:09:41.90ID:+AAPjypf
・関数呼び出しをプロセス起動に置き換えればスタックオーバフローしない!
・末尾再帰はループに展開される可能性がある!
・10回でエラーにすればスタックオーバフローしない!
・関数はループで実装されている!

他なんかある?
頑張って項目を増やしましょう!
0583デフォルトの名無しさん2015/10/15(木) 12:44:56.93ID:MTJAuyfy
>>582
いいかげんな事ばかり並べてるんじゃねーよ。
意味分かってねーだろうが。
0584デフォルトの名無しさん2015/10/15(木) 15:50:01.30ID:kRNzdeWM
>>583
再帰厨の意見を要約コピペしただけですが。
0585デフォルトの名無しさん2015/10/15(木) 16:12:22.98ID:E2VFDW70
こいつ毛の壁じゃねーの?
0586デフォルトの名無しさん2015/10/15(木) 16:42:34.49ID:kRNzdeWM
・関数呼び出しをプロセス起動に置き換えればスタックオーバフローしない!
・末尾再帰はループに展開される可能性がある!
・10回でエラーにすればスタックオーバフローしない!
・関数はループで実装されている!
・こいつ毛の壁じゃねーの?

他なんかある?
0587デフォルトの名無しさん2015/10/15(木) 17:51:17.75ID:E2VFDW70
意地で貼り続けるほど惨めになるコピペw
0588デフォルトの名無しさん2015/10/15(木) 17:54:58.23ID:kRNzdeWM
>>587
再帰厨の言い分をコピペしてるだけだから、再帰厨に支持されると思う。
再帰厨が人格攻撃してくるという事は、何か間違ってるってこと?

元々再帰厨の言い分だから反論は無いよね?
0589デフォルトの名無しさん2015/10/15(木) 19:03:43.95ID:E2VFDW70
>ループもしくは再帰でmapを実装するのですよ。
>もっともこの場合は、ループで実装するのが適切だから再帰は使いません
ちゃんとこの発言も残しておいてよw
0590デフォルトの名無しさん2015/10/15(木) 19:39:02.90ID:kRNzdeWM
>>589
それはどういう話だ?
探索に再帰を使わないという意味なら、まあ妥当だろう。
元の流れがわからないと採用しづらいな。
0591デフォルトの名無しさん2015/10/15(木) 21:04:42.69ID:2u28QwcF
フォルダ、サブフォルダの全ファイル名取得などの処理には再帰が適していると思う。これを再帰使わずに書くとどうなるのかな?
0592デフォルトの名無しさん2015/10/15(木) 21:22:12.24ID:whFEoHyO
別に
スタックか何か用意すればよいだけでは
0593デフォルトの名無しさん2015/10/15(木) 21:28:19.04ID:gTKnbHZq
スタックを用意して積んだり下ろしたりとか面倒だから再帰の方が楽だね
0594デフォルトの名無しさん2015/10/15(木) 21:31:55.58ID:C028ZKjn
論よりソース。
0595デフォルトの名無しさん2015/10/15(木) 21:45:09.42ID:kRNzdeWM
>>591
ブロックする前提だからそんな考えになるんだよ。
一行で入門以前ってわかるわ。
21世紀に通用するわけないだろ。
自分の時代に帰れ。
0596デフォルトの名無しさん2015/10/15(木) 21:49:17.38ID:abynzQey
ID:kRNzdeWM
こいつはガチで糖質じゃないか
0597デフォルトの名無しさん2015/10/15(木) 22:48:26.37ID:2u28QwcF
>>592
それも再帰だと思っていました。
違うんですか?
0598デフォルトの名無しさん2015/10/15(木) 23:12:49.30ID:whFEoHyO
ではスタックではなくキューを使ってください
キューでも全ファイル名取得は出来ます
これも再帰ですか?
0599デフォルトの名無しさん2015/10/16(金) 00:11:17.12ID:Zk2bmF9T
PHPが初心者のくせに上から来ることは無いだろうから、Pythonあたりかね?
0600デフォルトの名無しさん2015/10/16(金) 02:09:45.50ID:O6llndva
>>591
適してない
不要なスタックが出る
0601デフォルトの名無しさん2015/10/16(金) 02:48:00.45ID:xHCOUgWQ
>>600
別に出なくね?
つか再帰なしのキュー/スタックだと並列できないから不利じゃね?
0602デフォルトの名無しさん2015/10/16(金) 03:03:48.14ID:O6llndva
んじゃ両方実装してみなさい
0603デフォルトの名無しさん2015/10/16(金) 03:04:42.16ID:O6llndva
スタックの話だから、再帰自体をって意味ね
0604デフォルトの名無しさん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
>>605
ブロックしてよいかどうかで選択の幅が変わるし、オーダーという言葉がわからないなら
そもそも再帰が良いとか悪いとかの話に加われないだろ。
0607あぼーんNGNG
あぼーん
0608デフォルトの名無しさん2015/10/16(金) 14:15:08.44ID:GM7GrWMz
効率を気にしろと言いながら時間をドブに捨て続ける不思議
0609デフォルトの名無しさん2015/10/16(金) 14:33:30.15ID:TDfNRPC3
>>606
>ブロックしてよいかどうかで選択の幅が変わるし、
今時なら別スレッドで実行するだけなので、実装がどうなっているかは関係ないと思いますが
スレッドを使えない環境だったとしても

>普通ブロックしてよいならステートマシンで組もうと考えるだろ。

これは意味がわからないですよね、正反対に思いますが
ブロックしてよいなら再帰も使える、が正解では?
再帰はスタックフレームに状態を保存しているので、処理の途中で応答を返す=スタックが巻き戻る=途中状態が消える
のでノンブロックで書くのが難しいと思いますが コルーチンでも使う気ですか?

>オーダーという言葉がわからないなら
オーダーという言葉は計算量なんかで出てきますが・・・フォルダのオーダーとは、はたして・・・
もしくは広義で順番の事をオーダーといいますが、フォルダのオーダーとはフォルダの順番の事ですか?
普通にフォルダの階層数が妥当では?
0610デフォルトの名無しさん2015/10/16(金) 14:41:39.64ID:dPltY6KP
初心者だからそう思うだけ。
0611デフォルトの名無しさん2015/10/16(金) 15:07:02.87ID:O6llndva
ディレクトリの探索は制御が再帰的である必要はないよ
0612デフォルトの名無しさん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
>>615
継続はまた別の概念だろうに︙
0617デフォルトの名無しさん2015/10/16(金) 19:43:28.42ID:O6llndva
別にコード張ってもいいけど、調子に乗りそうだから。
1: システム言語などを使用し、どうゆう基準を満たせば再帰として認められるのか、
2: ディレクトリ検索は (1:) を満たさなければ実装不可能なのか (あるいは可能なのか) の証明の提示。

ヒント :ディレクトリ検索は原理的に1:の構造が不要。1:を満たす処理は純粋なロスが出る
0618デフォルトの名無しさん2015/10/16(金) 23:44:41.28ID:qr66SuO9
再帰使うのって、主眼は可読性でしょ?
帰納的にすっきり書くのか、ループでゴリゴリ書くのかの違い。速度やスタックが、というのは気にする観点が違うと思う。

ただ、ループでゴリゴリ書いたのしか理解できない人がいるのも事実なので、「人を選んだ可読性」でしかないのだが。

まあ、リソースが限られていたり(制約を設けられなかったり)、帰納的な表現に慣れていない人は使わなくてもいいんじゃないかな。何も恥ずかしがることはないし、拒絶反応を示すほどのことでもない。
0619デフォルトの名無しさん2015/10/16(金) 23:47:51.40ID:TDfNRPC3
ループで書いたほうが簡単と言うのは、新しい意見ですね
0620デフォルトの名無しさん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:a4FoVTZd
ハンマーしか持っていなければすべてが釘のように見える
0624デフォルトの名無しさん2015/10/17(土) 09:26:46.32ID:v2TM2ZJ7
>>623
叩いたものが金になるハンマーがあったとしたら
ちんこ叩きたくなるだろうが、そして叩くべきだよね。
ループ厨はその事実を厳粛に受け止めるべき。
0625デフォルトの名無しさん2015/10/17(土) 10:40:44.87ID:RMkIXyBp
面白いと思って書いたのかと思うと少し胸が痛い
0626デフォルトの名無しさん2015/10/17(土) 11:01:01.10ID:v2TM2ZJ7
>>625
嫉妬か
0627デフォルトの名無しさん2015/10/17(土) 14:53:50.80ID:FY1OBNmb
俺が立てたスレがこんな延びてるとは...
0628デフォルトの名無しさん2015/10/17(土) 15:16:42.29ID:QDrnQrmx
頭の悪そうなのが集まるスレを作ると伸びるもんさ
0629デフォルトの名無しさん2015/10/17(土) 17:04:19.55ID:2beLGnBn
新しい言語で再帰ってあるのかな?
0630デフォルトの名無しさん2015/10/17(土) 17:08:48.05ID:u6HpNLYA
関数型と呼ばれる言語は再帰か高階関数が基本
ループはほぼ使わない
0631デフォルトの名無しさん2015/10/17(土) 17:22:46.37ID:2beLGnBn
それは面倒かも。
0632デフォルトの名無しさん2015/10/17(土) 17:25:40.94ID:u6HpNLYA
>>631
変数はすべてイミュータブルが基本だからね
イミュータブルな変数を使うループはそもそも入る余地がない
0633デフォルトの名無しさん2015/10/17(土) 17:29:48.53ID:v2TM2ZJ7
イミュータブルとはなんなのか説明しよう
http://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
>>638
>何故か再帰が何か分かっていない基地外が1匹

>>639 のことかよ
0641デフォルトの名無しさん2015/10/19(月) 00:10:29.50ID:+RK2408W
せやろね
どうでもいいけど
スレ自体が
0642デフォルトの名無しさん2015/10/19(月) 19:26:19.84ID:9o5B1lk4
最初から状況や好みに合わせて組めばいいやんって話だからね
0643デフォルトの名無しさん2015/10/19(月) 19:33:39.50ID:omjlDmo+
>>638
> アンチ再帰に基地外
きちがいとまでは思わないけど、視野がちょっと狭いなとは思う。
0644デフォルトの名無しさん2015/10/19(月) 23:12:09.55ID:NIDePIlh
再帰のみで書くだなんて基地外を装ったネタ煽りだろうな。
0645デフォルトの名無しさん2015/10/20(火) 04:05:18.77ID:PJ53hIBn
「再帰のみ」で検索したら該当が>>644しかなかった
0646デフォルトの名無しさん2015/10/20(火) 07:18:10.78ID:4VGtRbkY
>>644
Prologマシンは、それでOSを書き切っているのではないか。
0647デフォルトの名無しさん2015/10/20(火) 07:50:43.27ID:+rU+djiA
再帰のみなんて単なる関数型言語の話題だったはず。
0648デフォルトの名無しさん2015/10/20(火) 07:58:09.45ID:rM0m1d25
再帰のみは、再キティ害の妄想
再帰を積極的に使用するのも再キティ害の妄想
0649デフォルトの名無しさん2015/10/20(火) 21:27:46.67ID:yhDxD//a
〉〉646
Prologマシンって、Prologで書かれてるんですか?
0650デフォルトの名無しさん2015/10/20(火) 23:19:13.18ID:4VGtRbkY
>>649
ハードウェアはマイクロプログラム化されたものを機械語が呼び出して制御します。
その機械語自体が単一化、バックトラックなど完全にPrologの文法体系に則っています。
OSの記述は、Prologにオプジェクト指向的なインターフェイスを被せた言語が作られて使われました。
0651あ2015/10/21(水) 01:53:47.07ID:+LGxtkDr
gccやclangは末尾再帰は一部ループに展開するよ。
↓の程度なら楽勝。

$ 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書くならCなどのまともな言語を使わなきゃね。

非実用的な言語で書けるのは、非実用的なOSにしかならないね。
0653デフォルトの名無しさん2015/10/21(水) 15:27:37.33ID:t87abjKQ
>>652
Prologは単一化などに大きなコストを掛けた言語でありどうしても重くなりますから、
例えば、telnetが遅いというようなことはあったようです。
0654デフォルトの名無しさん2015/10/21(水) 20:04:50.59ID:WYGNtn73
これからはメニコア環境での並列化が重要になってくるから、手続きが丸見えのループは
廃れていくだろうね
再帰(ただし末尾再帰)か高階関数を使ってループ部分は隠蔽して、並列化自体は
処理系なりライブラリなりにまかせるという流れ
0655デフォルトの名無しさん2015/10/21(水) 20:07:30.71ID:bA9WUQ2m
>>654
10年以上前からそんな事は何度も言われてるんやで
0656デフォルトの名無しさん2015/10/21(水) 20:17:27.23ID:WYGNtn73
>>655
10以上前から言われてきて、最近ようやく役者がそろってきた感じがするね
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
>>656
どこが最近やねん、2010年前後にはそれらの言語は出揃ってたぞ。
今調べたらpugsは2005年なんだな、そんなに古かったっけな?
当時はhaskellって何もんや?と思って興奮したもんだ。
それに関数型言語なんて、はるか昔から使われてる所では使われとるんや。

お前が興奮してるほど世間は浮かれてないし、
お前が興奮してる以上に歴史も実績もあるんやで。
0659デフォルトの名無しさん2015/10/21(水) 20:52:23.60ID:WYGNtn73
>>657
それじゃどうやって並列化を実現するの?
まさかスレッドを自前で管理しないよね?

ガベージコレクタがメモリ管理からプログラマを解放したように、スレッドをプログラマが
管理するような悪しき時代はもう終わるんだよ

そのためには手続きが丸見えのループは邪魔な存在でしかないよね
0660デフォルトの名無しさん2015/10/21(水) 21:27:16.12ID:zPyN71xI
夢見ごろなお年頃
0661デフォルトの名無しさん2015/10/22(木) 15:18:36.92ID:F81mE+Hn
昔からあってもメジャーにならないのはその程度の言語だってこと。

並列化も関数型以外の方法で普及するのでしょう。
0662デフォルトの名無しさん2015/10/22(木) 20:00:31.63ID:vKVNVE/Y
大昔にMicrosoftが広めようとしていたDCOMだっけ?
あんな感じのものが今またメニコア環境で復活しつつあるよな
Linuxのコンテナとも相性がいいし
0663デフォルトの名無しさん2015/10/28(水) 19:13:27.55ID:UQfxGWP/
何にしても今後ループが消えていくのは間違いないね
プログラミング言語はプログラマにできることを制限していくことで抽象化を
図ってきたのだから
その結果が再帰なのか高階関数なのかはさておきね

もちろんこれはアプリケーションプログラマだけが対象であって、カーネルやデバドラ
など低レベルの分野に適用されるものではないよ
0664デフォルトの名無しさん2015/10/28(水) 19:33:57.67ID:413ZIx2S
ドワンゴとかLINEがErlang使ってるってWikiに書いてあったけど、
今後、再帰って手法の重要度は上がっていく方向な気がする。
0665デフォルトの名無しさん2015/10/28(水) 20:45:29.20ID:0c7VcdM3
ループを撲滅するためには配列や、
配列と同じように扱えることが多い文字列を撲滅する必要があります
配列の操作にはループが適しています
strlenを再起で書く人は居ないでしょう
添え字によるアクセスにはループの方が自然だからです
0666デフォルトの名無しさん2015/10/28(水) 21:50:16.50ID:UQfxGWP/
>>665
strlenみたいなコアライブラリ製作者は今までどおりループ使えばいいと思うよ
俺が言ってるのはアプリケーションプログラマだからね
0667デフォルトの名無しさん2015/10/29(木) 03:18:42.91ID:z0g2qO/B
再帰の抽象度なんてそんな有難がるほど高くない。
関数型言語での再帰は、手続き型言語でのイテレータ使ったループと同じくらいの抽象度。
もっと抽象度上げた高階関数で、ようやく自動で並列化とかの道が見えてくる。
それを再帰の手柄と言うのは、何でも再帰だと主張していたスレ初期の基地外と同じくらい定義を拡大解釈している。
mapもfoldも手続き的に実装している可能性があるのよ?
0668デフォルトの名無しさん2015/10/29(木) 03:33:36.62ID:wNo8j+kT
>>667
実装はどうでもいいんよ
そういうのはコアライブラリ製作者の話だからね
アプリケーションプログラマとしては抽象化は重要な話であるって話だからさ
06696682015/10/29(木) 03:47:19.66ID:wNo8j+kT
補足
この「実装はどうでもいいんよ」という状態に持っていくのが抽象化なんだよ
mapやfoldが手続き的に実装されてもいいし、自動並列化を意識した実装をされててもいい
どちらにしてもアプリケーションプログラマが意識しなくていいという部分が重要
0670デフォルトの名無しさん2015/10/29(木) 15:09:33.77ID:IDJmDfji
>>666
strlenに限らず、配列に添え字でアクセスする場面ではループが最適です
配列に再帰を使ってループ処理をしても
func( array, index+1 ); みたいなことになってスッキリしません
0671デフォルトの名無しさん2015/10/29(木) 21:27:12.10ID:raF10oud
Prologの典型的な再帰の形式。

p(_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:raF10oud
Prologでリストの内容を合計するには

sum_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:jp9g9T1R
C#とかでもLINQとか使うと生のループはあんまり使わなくなるんだよなぁ
0674デフォルトの名無しさん2015/10/31(土) 10:30:57.81ID:hj3UoKsV
Javaもラムダできたし、高階関数へとシフトしてるしね
0675デフォルトの名無しさん2015/10/31(土) 20:45:48.75ID:W1S2FPsD
再帰とループは全然別の物だと思うが
0676デフォルトの名無しさん2015/10/31(土) 21:03:23.89ID:yZ/bvh29
>>675
ではその中から類似性を見出して
それについて議論すればよいのではないのかね?
否定するばかりでは議論は成り立たぬよ。
0677デフォルトの名無しさん2015/10/31(土) 21:40:25.52ID:W1S2FPsD
再帰で可能なものを再帰を使わないで書くとしたらループしかないという事か
0678デフォルトの名無しさん2015/10/31(土) 22:32:56.82ID:xGdNlw9I
メタプログラミングって手段がある
再帰もループも使わずに想定されるソースコード全部出力

最近それやってたけど
最初にそれやり始めた時は再帰で書けるわけないと思ってたからメタしてた
長い時間かかって最適化していったら
ついにメタ出力していたソースコードは再帰で書き換えられて
1000行くらいが消し飛んだわ
書きあがった再帰はこの世のものとは思えない複雑さ
0679デフォルトの名無しさん2015/11/01(日) 09:56:47.99ID:vrg09b8+
>>664
twitterは規模が大きくなってerlang辞めた。
0680デフォルトの名無しさん2015/11/01(日) 10:00:21.52ID:vrg09b8+
>>675
ループがあるのは再帰があるのと同じ、
再帰があるのはループがあるのと同じ、
とかなり昔に証明されてます。
0681デフォルトの名無しさん2015/11/01(日) 19:36:12.82ID:TD26KE/4
>>680
それ費用対効果を考えてる?
技術屋は数学者とは違うんだから
0682デフォルトの名無しさん2015/11/02(月) 05:31:36.58ID:8fKhlJEB
証明されていても実現されていないから結局無理。
0683デフォルトの名無しさん2015/11/02(月) 06:15:05.45ID:tRZ2mEuQ
おまえら適当に嘘書くの大好きだな
0684デフォルトの名無しさん2015/11/02(月) 06:20:23.82ID:8fKhlJEB
LispはCの27倍速い(現在は70倍以上速くなっています)。
http://blog.8arrow.org/entry/2014/10/23/063044
0685デフォルトの名無しさん2015/11/02(月) 10:43:24.69ID:pkynDUbv
>>684
これはひでぇな
どんなバイナリ吐いてるのか位書くべき
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
>Cの速度を超えていく

無理
再帰を使う時点で、速度だの安定性だのは完全無視
低レベルのプログラマのお遊びのための言語
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
>>690
ありゃ、全部変換ミスしてたな。
0692デフォルトの名無しさん2015/11/03(火) 23:32:59.01ID:EFE2GKyQ
JavascriptでさえCの二倍しか速くないのに、Lispは27倍高速ですよ。
0693uy ◆Qawu9.2l1E 2015/11/04(水) 00:18:19.48ID:FuRncUQp
(a b c d) ← これしかないんだから
同じ労力を均等にすべての言語にかけるなら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:xDG89KxW
再帰を使うと頻繁にPCレジスタをPUSHする訳だから普通に安定性落ちるんじゃないの?
0697デフォルトの名無しさん2015/11/04(水) 04:07:35.56ID:Ly3yLQ9c
それは古いコンパイラの話だよね?
0698デフォルトの名無しさん2015/11/04(水) 07:19:34.16ID:UW5nAvYX
コンパイラにできる最適化は並の人間ならできるので単に手間だけの問題
0699デフォルトの名無しさん2015/11/04(水) 08:15:29.17ID:+IbiBxzw
詳しくないがパイプラインが利かないとかそういう話かな
0700デフォルトの名無しさん2015/11/04(水) 09:10:02.70ID:eHzk5Tc9
PUSHするから安定性落ちるとは?
スタックの容量のこといってるのかな?
0701デフォルトの名無しさん2015/11/04(水) 09:31:12.08ID:eHzk5Tc9
一応、CとJavascript,Lispのベンチマーク比較あったから張っとく。
http://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:p4wdmRvQ
再帰のみで書くなんて、再帰厨はキティ害しかいませんね。
0704uy ◆Qawu9.2l1E 2015/11/04(水) 12:46:07.48ID:f9LszNMA
ぼくは再帰が書けない奴を「ゴミ」と言ったんですよ

アルゴリズムを書くときに
「再帰」のほうが書きやすいものはいくらでもありますね、
例に挙げたようにツリー構造やグラフですよ
君たちが普段使っているインターネットやOSのディレクトリですよ

その場合に"""最終的に"""ループで書くとしても、

""""最初は""""再帰から""""""""書かなければならない""""""""わけで

再帰を**********最終コード**********で使わないからといって


再帰を書けないプログラマが許されるわけないだろ?アホか?死ねよ?
0705デフォルトの名無しさん2015/11/04(水) 13:50:33.81ID:CmcPtRhv
>>681
全く別ではない。
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:Am0x1eSa
>>707のような80年代の定説を信じ切ってる老害は早く死ねばいいのに。

http://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
同じページにある、こっちが21世紀の常識なんだよ。おじいちゃん。
| 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
>>709
外国の再帰厨か。
0712デフォルトの名無しさん2015/11/04(水) 16:43:09.78ID:jIKMvE/j
>>704
ツリーは再帰と言うのは再帰厨によって繰り返し説明されている。
でもそれはおそらくデータ構造から間違っているんだよ。

たぶん、子ノードの集合を親ノードに保持するような作りにしているんじゃないかな?
ほとんどの人が中学生の頃そんな実装をする。
しかし、高校生になると一本の配列でツリー全体を表現するようになる。
なぜなら高校生になると、範囲の表現を使うようになるからだ。

代表的なツリーである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
>>715
再帰下降は停止性が保証されないから禁止です。
再帰が許されるのは中学生までです。
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
>>712
抽象データ型と実装の区別がついてない。
0722デフォルトの名無しさん2015/11/04(水) 22:27:50.32ID:Ly3yLQ9c
再帰とループ完全に可換なんだから、決定性がどうのこうのという話は
再帰にもループにもあてはまるんだよね
0723デフォルトの名無しさん2015/11/04(水) 22:36:32.36ID:RyQ9LzF5
>>722
そう。結局は繰り返し。
こいつは抽象的な理解が全くできない馬鹿。
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
>>725
言い訳に困って中傷に走らず、メリットのある場合無い場合を整理してチラシの裏にでもまとめたらどうだ?

最後の行、凄まじいブーメランだよ。
0727デフォルトの名無しさん2015/11/05(木) 01:21:20.88ID:yq3tbEEh
>>724
再帰下降法を使って良いのは中学生までです。
0728デフォルトの名無しさん2015/11/05(木) 01:23:28.98ID:yq3tbEEh
>>720
遷移表を計算しておくなら、ループで実装したら良いのです。
わざわざ再帰で実装するメリットはどこにもありません。
デメリットはいくらでもあります。
0729デフォルトの名無しさん2015/11/05(木) 01:23:58.99ID:9/Cij0JY
このスレから「再帰厨」と「キティ害」を検索して苦笑してしまった。
0730uy@紫の鏡 ◆Qawu9.2l1E 2015/11/05(木) 01:24:00.03ID:d7vFM514
君がどんな再帰コードを仕事で引き継いで読む羽目になって
その時どれだけ毛根が死滅してハゲ上がったのか知らないけど
僕は再帰を書き続けます
0731uy@紫の鏡 ◆Qawu9.2l1E 2015/11/05(木) 01:25:35.61ID:5FPMX7jC
>>727
マジかよ中2病だから再帰使うわ
0732デフォルトの名無しさん2015/11/05(木) 07:25:33.21ID:S5LNgH5A
>>724
そんなやついないから。
再帰使うだけで選民思想。
みなさんこれが再帰厨ですよ。
0733デフォルトの名無しさん2015/11/05(木) 07:30:45.51ID:I4yBwlZm
>>728
あなたが言ってるループで実装する遷移表が予め計算できる、なんていうケースでは、
それは再帰で書いても同じ、
かつ、実質再帰になりますよね、って話。
あなたが言ってるのは四則演算をスタック使った計算にyaccで落とし込むみたいなしょうもないケースでしょ。それ。
それにだってデメリットだらけ。素直にはevalに相当するコードがかけないよね。クロージャなんかも定義しづらいし、遅延評価もどう表現するの?
で、構文木を解析するのはSLRだとしたもね。

最後の行は読めたのかな。
再帰憎しで、再帰ならさっと書けるはずの事をこねくり回してる印象まであるよ。
高校生が、中学生が、と子供みたいな事言ってるけど、実務経験あるのかな?
0734デフォルトの名無しさん2015/11/05(木) 08:23:04.00ID:GoA/HTyT
再帰が有用なのはファイルシステムのような既存のツリー構造を参照する場合のみという事で結論がでている
0735デフォルトの名無しさん2015/11/05(木) 08:39:48.02ID:tAlGc147
>>734
それこそどんだけ深くなるかわからんし、
走査順が深さ優先ばかりじゃないので、
スタック使って実装されてるライブラリが多いが。
考えが浅すぎる。
0736デフォルトの名無しさん2015/11/05(木) 09:17:45.46ID:I4yBwlZm
>>734
ファイルシステムは、再帰じゃなくて、
1.処理対象リストが尽きるまでループする
2.処理中にディレクトリ見つけたら、処理対象リストに中身を(一段目まで)展開する

のループの方が無難。
まぁ、これでもどれだけ深くなるかはわからんけど。

ファイルかドライブかリンクしかないツリー構造より、もっと多種多様な中身を持つコンテナ構造に向いてると思うよ。
0737デフォルトの名無しさん2015/11/05(木) 09:25:42.47ID:lqwbYTtU
>>725はFORTRAN77に回帰せよ主張する脳軟化症ジジイ。
スタック溢れるわけがない、だってスタック無いから。

とっとと死ねよ。老害。
0738デフォルトの名無しさん2015/11/05(木) 14:33:56.32ID:SbhSUPxN
再帰厨は、もう滅びの道しかありませんね。
0739デフォルトの名無しさん2015/11/05(木) 14:43:06.14ID:7GQWx2q4
>>733
どこかのブログで引用されるかもしれんよ。
2chはレベル低下が著しいけど、ブログなどで晒されると恥ずかしいと思うよ。
ブログは検索から来るからデタラメ書いてることを理解できる人が見るんだよ。
0740デフォルトの名無しさん2015/11/05(木) 15:35:08.04ID:d7vFM514
再帰書けない奴は転職してほしい
0741デフォルトの名無しさん2015/11/05(木) 16:13:30.00ID:SbhSUPxN
再帰厨は病気

そんな低レベルじゃあ何の仕事もできないし、
そのまま一生引きこもっていてね。
0742デフォルトの名無しさん2015/11/05(木) 18:26:56.27ID:q6KkrjLY
再帰かけないマはC出来ない奴よりいらん
0743デフォルトの名無しさん2015/11/05(木) 18:33:17.15ID:w1ErlqZK
再帰が出来たらえらいって思ってる?
えらく低レベルなハードルだな
0744デフォルトの名無しさん2015/11/05(木) 19:03:55.34ID:AD547T9X
スタック1のループ > スタック2のループ > 再帰 > スタック3のループ

読みやすさと処理の容量は同じ。
と言うよりスタック3のループその物がそのまま(最適化されない)再帰。
0745デフォルトの名無しさん2015/11/05(木) 19:35:56.93ID:lqwbYTtU
>>741
FORTRAN77つかってろ。ジジイ。
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
素直に読めませんw って白旗上げればいいのに
再帰って概念が難しすぎてハゲ上がりそうなんでしょ?
適性ないんだよ君は
0749デフォルトの名無しさん2015/11/05(木) 21:02:56.31ID:w1ErlqZK
↑再帰厨の言い分
0750デフォルトの名無しさん2015/11/05(木) 21:05:44.05ID:lqwbYTtU
↑F77じいさん
0751デフォルトの名無しさん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
>>752
お前が一番ボヤっとしてどこに向かってんのか分らんのだが
建設的とか言う前にまず主旨をハッキリさせろよw
0755デフォルトの名無しさん2015/11/05(木) 21:27:48.08ID:I4yBwlZm
>>751
んなもん当たり前だろ。
そもそも、配列と文字列にどう区切りをつけてるのかわからん。
文字の配列で文字列じゃないか。。
最後の要素に\0入ってるかどうかかな。
それでも配列から二分探索したけりゃ多分再帰使うし、
それが画像なら四分木探索で再帰使うし、
なんかのソルバーなら限られた手数での判定に再帰使うなぁ。
都合の良いデータ種出してよければいくらでもあるんじゃねーの?
0756デフォルトの名無しさん2015/11/05(木) 21:31:13.19ID:I4yBwlZm
>>753
何が言いたいのかわからん。
再帰関数は深さが読めないからダメで、安定性が落ちるからダメだと言うなら、
決定的に異なるコードになるはずなんだけど。

そうではないから、再帰関数使うやつはダメで、かつ、
何でもループで処理できるんだろ?例えばインタプリタならevalやらクロージャでも。
0757デフォルトの名無しさん2015/11/05(木) 21:31:24.34ID:w1ErlqZK
配列と文字列が同じかどうかなんか言語によるだろう
0758デフォルトの名無しさん2015/11/05(木) 21:33:04.14ID:w1ErlqZK
>>756
末尾再帰でないかぎり、決定的に違うコードになりますが
0759デフォルトの名無しさん2015/11/05(木) 21:33:46.37ID:I4yBwlZm
>>757
>>345はどうなったの?
0760デフォルトの名無しさん2015/11/05(木) 21:34:46.89ID:I4yBwlZm
>>758
前提条件増えてきたね。
逆に、スタックを使うループ、と再帰関数の違いはどうなるかなぁ。
0761デフォルトの名無しさん2015/11/05(木) 21:38:53.88ID:w1ErlqZK
>>760
そりゃ決定的にちがう機械語になるでしょう
0762デフォルトの名無しさん2015/11/05(木) 21:44:06.33ID:w1ErlqZK
>>759
それがどうかしたの?
>>345でも配列と文字列は違うものだけど
同じように添え字でアクセスできることが多いから
再帰とループの話をする場合は
まとめて配列のグループに入れても良いって言ってるわけだが
お前みたいに文字列=文字の配列と短絡している訳ではない
0763デフォルトの名無しさん2015/11/05(木) 21:45:54.40ID:jSuDdQRW
ループと再帰は数学的には完全に等価
ループにできることは再帰にもできるし、ループにできないことは再帰でもできない
機能的な差は一切ない

この点をしっかり押さえてない人間が何言っても説得力は皆無だろう
0764デフォルトの名無しさん2015/11/05(木) 21:52:45.86ID:7jlVzvr3
説得力もクソも話の根源が再帰出来ます自慢なのだからどう転んでも話が発散する以外の結末がないw
0765デフォルトの名無しさん2015/11/05(木) 21:56:30.80ID:8vWqbQMQ
極論的にスタックにこだわってループ主張してる人は、
インライン関数以外の関数すら使っちゃいけないよ。
極論するのであればスタックの深さはこの場合だってわからないからね。
関数だって自動変数の大きな配列取らないようにする程度の配慮は必要なわけで。
同じように再帰だって常識的にスタックあふれないものに使うか、
そうでなければ入り口で管理したり、深さ管理するだけで、
本質は変わらない。
極論にこだわってある種の処理に有効な手法の1つを切り捨てるのはどうかね。
0766デフォルトの名無しさん2015/11/05(木) 21:59:45.53ID:7jlVzvr3
ほらなw根底が自慢だから誰もいない所に向かって反論を投げかけるw
0767デフォルトの名無しさん2015/11/05(木) 22:01:28.09ID:jSuDdQRW
>>764
>>746-747の流れみてると、頭が悪いのはループ厨の方だけどなー

「再帰ができない人間は頭が悪い」→「再帰ができる人間は頭がいいのか?」なんて
「逆は必ずしも真ならず」という論理学の基礎の基礎すら分かってないとしか思えない
0768デフォルトの名無しさん2015/11/05(木) 22:06:37.27ID:w1ErlqZK
>>767
だから疑問系にしてあるんだろ
再帰が出来てもバカな奴が居るから、そういう存在が居るという事を匂わす
そういう意味も含めて、わざわざ疑問系にしているんだろ
むしろソコが本当に言いたい行間なわけだがwww
お前本当にバカだな、墓穴掘りすぎ
0769デフォルトの名無しさん2015/11/05(木) 22:07:40.06ID:jSuDdQRW
>>768
> だから疑問系にしてあるんだろ
そういう論法を「後出しジャンケン」って言うんだよw
0770デフォルトの名無しさん2015/11/05(木) 22:09:02.58ID:7jlVzvr3
>>767
いや相手がループ厨だと思ってる時点で周りが見えてないだろw
0771デフォルトの名無しさん2015/11/05(木) 22:11:35.72ID:w1ErlqZK
>>769
後出しも何も、元から疑問系で書いてあるだろ
0772デフォルトの名無しさん2015/11/05(木) 22:18:39.03ID:I4yBwlZm
>>761
ならないよ。
>>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:I4yBwlZm
四分木探索で画像からパターン探す、とか再帰以外でやりたくないけどな。
evalの中にevalがある場合はどうスマートに処理しよう?
このへんどう、ループで解釈すれば良いかな。

何で再帰程度の事が自慢になるんだろう?
0777デフォルトの名無しさん2015/11/05(木) 22:36:09.04ID:3yCl2VDv
ってか、スタックを使ったループ、って再帰そのものだよね。

キューならいざしらず。

スタックに現状を積んで、続きを含めてループ。終わったらスタック戻してもとの状態に遷移。
中で必要があればさらにスタックを積んで…

今のレジスタ、PC積んで、ジャンプ
終わったら、レジスタとPC戻す。
中で必要があればさらに…
0778デフォルトの名無しさん2015/11/05(木) 22:38:05.66ID:w1ErlqZK
>>772
>ならないよ
↑なります、「スタックを使うループ」と「再帰」では全然違うコードになります

>実質そうでしょ。文字の配列だよ。何て宣言する?

std::string by C++
string by C#
String by Java

そのほかの言語でも大概は文字列用のクラスが用意してあるのが普通
なぜなら良く使うから

>>773
ポインタ演算が使えるのが前提だとC/C++とかになるけど
他のみんなもそうだけど、別にC/C++だけの話をしているわけではないので
0779デフォルトの名無しさん2015/11/05(木) 22:41:35.49ID:w1ErlqZK
>>777
そんなことは初めから分りきっているが、再発見のように言われても困る
しかし、スタックを使ったループは、スタックにスタックフレームを流用しない、というだけ
0780デフォルトの名無しさん2015/11/05(木) 22:42:25.93ID:I4yBwlZm
>>778
書いたよ。

文字列用のクラスなw
その中身って何?
かつ、それらについては、添字はナンセンスだよ。
添字のように見える、関数への引数だから。

cの話はしていなかったり、末尾再帰のある言語の話はしてなかったり随分蝙蝠じみたこと言うなぁ。
0781デフォルトの名無しさん2015/11/05(木) 22:42:55.54ID:I4yBwlZm
あ、ID変わってたんだ。
>>777は俺ね。駅のWi-Fi拾ってた。
0782デフォルトの名無しさん2015/11/05(木) 22:46:30.51ID:I4yBwlZm
>>779
再発見とはなんと。今更再発見したのか。
スタックフレームって何かわかる?
Cの実装が用意した、単なるスタックだよ。
gccとclですら違う。

あなた低レベル言語したことある?
0783デフォルトの名無しさん2015/11/05(木) 22:49:36.76ID:L7+IyRN4
>>779
クッソワロタ
0784デフォルトの名無しさん2015/11/05(木) 22:49:58.53ID:w1ErlqZK
>文字列用のクラスなw
>その中身って何?

文字列用のクラスが用意してあるから、文字列を配列と一括りに出来ないってだけの話だが

>末尾再帰のある言語の話はしてなかったり
末尾再帰でない再帰の出力コードは、ループを使ったものの出力コードと違う、と言っただけで
末尾再帰のある言語を省いたつもりはない
お前の日本語が危ないだけ
0785デフォルトの名無しさん2015/11/05(木) 22:50:37.64ID:I4yBwlZm
>>784
同じだよね。>>779で自分が言ったように。
0786デフォルトの名無しさん2015/11/05(木) 22:51:14.88ID:w1ErlqZK
同じではない
0787デフォルトの名無しさん2015/11/05(木) 22:52:08.18ID:I4yBwlZm
>>786
じゃあ何が違うの?
まさかespとebpを使うか使わないか?
0788デフォルトの名無しさん2015/11/05(木) 22:52:53.43ID:3yCl2VDv
>>784
一括にできないのは、それがクラスだからだよ。
ダンプしてごらん。
0789デフォルトの名無しさん2015/11/05(木) 22:52:56.85ID:w1ErlqZK
だからスタックフレームを使うかどうかが違うと言っているだろう
0790デフォルトの名無しさん2015/11/05(木) 22:53:50.30ID:I4yBwlZm
>>789
スタックフレームって、ただのスタックだよ。
決まったレジスタ使うだけ。
0791デフォルトの名無しさん2015/11/05(木) 22:57:52.12ID:L7+IyRN4
もうやめてやれよw
0792デフォルトの名無しさん2015/11/05(木) 22:58:50.45ID:I4yBwlZm
>>791
本質的に違う機械語になるらしいし。説明してくれるだろ。
0793デフォルトの名無しさん2015/11/05(木) 22:59:03.18ID:w1ErlqZK
>>788
ダンプとか関係ないだろ
内部実装がどうなっているか気にしないのがOOPなので
実際には内部実装がどうなっているかも考えてプログラミングするが
概念の話をしているときはOOPの流儀に則る
0794デフォルトの名無しさん2015/11/05(木) 23:03:07.10ID:I4yBwlZm
>>793
OOPの流儀に則るんなら、添字とか言わないよね。
インデクサが省略されてるシンタックスシュガーで、flyweightパタンで実装されてるものって知ってるはずだもの。
そいつらのインクリメントやらforeachは、配列じゃないしね。
0795デフォルトの名無しさん2015/11/05(木) 23:07:47.34ID:w1ErlqZK
添え字じゃなきゃなんて呼ぶ?
0796デフォルトの名無しさん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:I4yBwlZm
あと、まともな文字列クラス()の実装だと=もオーバーロードされてるからな。
OOP知ったふうな口聞くなら調べてから書けよ。

>>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:I4yBwlZm
以上。馬鹿らしいので終わり。
0802デフォルトの名無しさん2015/11/05(木) 23:27:03.24ID:w1ErlqZK
お前本当に日本語ダメだな、>>797をもう一度読み返せ

>勝手に定義したスタックを使うループも基本的には同じ問題をはらんでるんだよ。
自分で確保したスタックはヒープを使うので違う
普通、スタックフレームは伸ばしたり縮めたり出来ない
ヒープに確保したスタックなら可能
0803デフォルトの名無しさん2015/11/05(木) 23:28:37.39ID:w1ErlqZK
>到達手数、と言う他の手段では手に入れづらい情報まで得られるし、
>到達深度で、これ以上はやめとこ、と出来るんだよ、再帰は。

自分が本質的にスタックを使ったループは同じと言っておいて
これいかに
0804デフォルトの名無しさん2015/11/06(金) 00:25:20.77ID:+IGrVkRe
みんな Lisp 書こうぜ。ここまでの議論がどうでもよくなるから。

再帰も使うしループも使うんだよ。
0805デフォルトの名無しさん2015/11/06(金) 00:40:35.63ID:Bf9sAILG
>>804
Lispは再帰呼出しを何回できるの?
ちなみにPerlは無限回だ。Perlは無限回だ。
0806デフォルトの名無しさん2015/11/06(金) 07:34:11.50ID:2ILEtx8U
>802
cpuに明確なスタックが存在するとは限らないのでスタックが理想的に伸長するかどうかはターゲットによる
0807デフォルトの名無しさん2015/11/06(金) 07:54:44.19ID:iLvLfKdX
>>806
やめとけ。
スタックフレームは、言語が用意した単なるスタックだ、を理解できてないんだ。
その辺突っ込んでも、実装はおいといて、概念としてって言われるぞ。

本質、実装、概念を蝙蝠のように使い分けてくれるさ。
ヒープに確保したスタックが、とか言い出すしね。
ヒープが溢れる溢れないは関係ないようだ。
ヒープもいくらでも拡張できるわけでもないのにね。

ヒープが下から、スタックフレームが上から、同じメモリを食ってくんだから。
ヒープが溢れると、スタックフレームも溢れてるし、
スタックフレームが溢れるという事はヒープも溢れてる。
実際問題全く同じなのに。
0808デフォルトの名無しさん2015/11/06(金) 09:02:51.12ID:VF1V1DpN
全然違う
普通、スタックフレームは勝手に伸ばしたり出来ない

>ヒープが下から、スタックフレームが上から、同じメモリを食ってくんだから。

こんな実装じゃ、マルチスレッドが実装できないなww
0809デフォルトの名無しさん2015/11/06(金) 10:09:10.72ID:iLvLfKdX
>>808
なんだそりゃ。
そりゃマルチスレッドなら、スレッド毎にスタックフレーム確保するだろ。
それこそ、勝手スタックと同じでな。
疑問に思ったら、メイン関数で再帰して何回目で死ぬかと、
スレッド2つ起こして、そのスレッド内で再帰呼び出し呼んで何回目で死ぬかを比較して見ればいいよ。
ついでに/procの中身も見ればわかりやすい。

スタックの成長方向に関しては、だいたい下位方向だよ。
だからバッファオーバーランで任意の関数を呼ぶって攻撃が成り立つ。
0810デフォルトの名無しさん2015/11/06(金) 10:47:43.57ID:iLvLfKdX
あー、もしかしてあれか。
ヒープに確保したスタック、ってのは、ヒープに参照を確保してメモリのどこかに確保したスタック、なのかな。
そりゃそのスタックはアウトオブメモリまで使えるわな。
違う機械語にもなるだろうな。多段の間接アドレッシングするクソ遅くて不安定な機械語に。

それでも根本的解決をせずに、マージン確保して死ぬのを先延ばしにしてるだけだけど。
まともな解法のためにまともに組んだ再帰ではそんなこともないし、
そうではない再帰の事言ってるんだろうけど、それは「ループは無限ループする可能性があるから危険」くらい暴論。
0811デフォルトの名無しさん2015/11/06(金) 11:12:47.56ID:LVZwl1iK
>>807,809-810
> ヒープが下から、スタックフレームが上から、同じメモリを食ってくんだから。
こういう迷信信じ込んでる老害が一番厄介。
#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
>>811
ヒープが何かもわかってないゆとりかよ w
0813デフォルトの名無しさん2015/11/06(金) 12:56:48.83ID:iLvLfKdX
>>811
迷信ではなくて、単に環境依存だろ。
んなもんリンカで決まるし、ましてやWindows7ならASLR効いてるんじゃねーの?
基本知らないで話してるわけでもあるまいし、なんか釣ってるの?
0814デフォルトの名無しさん2015/11/06(金) 13:29:16.84ID:LVZwl1iK
>>812-813
zのアドレス00000000002CFB80が何を意味してるか分かるか? わかんねーだろうな。バカだから。
2,947,968番地って事だ。

ジジイが信じている迷信は
> ヒープが下から、スタックフレームが上から、同じメモリを食ってくんだから。
って事だが、スタックが上から使って言って残り3M以下なんだが、ヒープは何メガ使えるんだ? 爆笑。
0815デフォルトの名無しさん2015/11/06(金) 14:09:49.10ID:+7OfKum1
再帰厨は白痴だね。
0816uy ◆Qawu9.2l1E 2015/11/06(金) 14:35:20.47ID:44+lavHA
環境を指定しない話でも、いつも必ずC言語のソース出して何か言ってる奴の話する?
0817デフォルトの名無しさん2015/11/06(金) 14:54:15.84ID:W6j+1tCI
ヒープはスタックの1000倍という見積もりをよくするけどね。
0818デフォルトの名無しさん2015/11/06(金) 14:55:35.21ID:W6j+1tCI
再帰厨って要はスクリプト言語を使ってる人たちだろ?
0819デフォルトの名無しさん2015/11/06(金) 15:15:31.42ID:LVZwl1iK
>>818
F77じいさんはオムツの特売に並んでろ。
0820デフォルトの名無しさん2015/11/06(金) 15:21:45.27ID:LVZwl1iK
> プライマリスレッドのスタックサイズは固定サイズでリンク時に決定だよ。おじいちゃん。
linux忘れてたわ。突っ込まれる前に訂正。

プライマリスレッドのスタックサイズは固定サイズで起動時に決定だよ。おじいちゃん。
0821デフォルトの名無しさん2015/11/06(金) 15:38:37.42ID:VF1V1DpN
面白発言

> ヒープが下から、スタックフレームが上から、同じメモリを食ってくんだから。
> ヒープが溢れると、スタックフレームも溢れてるし、
> スタックフレームが溢れるという事はヒープも溢れてる。
> 実際問題全く同じなのに。

これもうこの発言で終了じゃね?
0822デフォルトの名無しさん2015/11/06(金) 15:44:51.97ID:iLvLfKdX
>>814
そらそうだろう。
グローバル変数は.dataないし.bssに落ちて、
関数は.textに落ちて、そいつらはその辺のアドレスになるだろ。
メインスレッドのスタックは俺の環境でもその辺で、かつエントリポイントのヒープもその辺だわな。
固定サイズ、って、どこから固定サイズかわかってるのかなぁ。
デバッガで見てみりゃすぐわかるのに。
0823デフォルトの名無しさん2015/11/06(金) 15:56:30.79ID:VF1V1DpN
> スタックフレームが溢れるという事はヒープも溢れてる。

wwwww
0824uy ◆Qawu9.2l1E 2015/11/06(金) 16:11:44.79ID:Bw8X18sC
一応再帰厨らしいけどチョンみたいな奴だな
味方にした国が負ける
0825デフォルトの名無しさん2015/11/06(金) 18:19:40.96ID:ldVrSRAZ
>>814
で、ヒープはどこに行ったんだよ…
まさか 16進数の読み方でしかドヤれないのか w
0826デフォルトの名無しさん2015/11/06(金) 18:26:57.75ID:iLvLfKdX
まー、逆だったな。それは認めるわ。
ヒープが溢れるという事はスタックフレームが溢れるのと同じ事、かな。
virtualallocやらしてりゃ別だけど。

要はスタックフレームは無視して、ヒープに勝手にスタック作ってそれを使って処理すれば再帰は要らなくて、
ループで処理出来る、って言いたいんだろうね。
どう考えても向いてない事も、ループでオッケー、と。
0827デフォルトの名無しさん2015/11/06(金) 18:28:00.11ID:iLvLfKdX
>>825
ドヤってる訳じゃないけど。
自分で見てみれば?
0828デフォルトの名無しさん2015/11/06(金) 18:58:03.51ID:ldVrSRAZ
>>827
いや、だからどこにヒープがあるんだよ
.bss, .data, .text とかはヒープって言わんぞ
0829デフォルトの名無しさん2015/11/06(金) 19:08:39.94ID:LVZwl1iK
ID:ldVrSRAZ
お前、壊滅的に頭悪いな。

スタックが最下位の3Mにあるわけだ。さて、ヒープはどこにあるでしょう?
スタックより低アドレス? → スタックとヒープ合わせて3Mしか使えない。 大爆笑
スタックより高アドレス? → ↓これが嘘。 大爆笑
> ヒープが下から、スタックフレームが上から、同じメモリを食ってくんだから。
0830デフォルトの名無しさん2015/11/06(金) 19:22:13.10ID:LVZwl1iK
>>826
ちげーよ。バカ。
プライマリスレッドのスタックは固定サイズ。
おじいちゃん達が現役だった頃と違ってヒープと奪い合わない。

Win64は先に示した通り。スタックは最下位に置かれる。
他のOSでも共有ライブラリなどの為にアドレス空間が予約されるので、ヒープとスタックは隣り合った領域には配置されない。
0831uy ◆Qawu9.2l1E 2015/11/06(金) 19:24:34.00ID:ctWMnKjq
OS作った事ある奴いる?
0832デフォルトの名無しさん2015/11/06(金) 19:56:02.79ID:ZTXinl+H
OSの定義は?
0833デフォルトの名無しさん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:Y2REc2we
プロセス起動とスタックとヒープのメモリ割り当て周りのコード書いた事ある事が最低レベル
0835uy ◆Qawu9.2l1E 2015/11/06(金) 20:12:59.87ID:Bw8X18sC
jsにもmapあるんだけど
https://lodash.com/
0836デフォルトの名無しさん2015/11/06(金) 20:17:37.45ID:Jbsw4Wxa
>>835
あるのは知ってるし、俺も使わせてもらってる (underscoreの記述はしたし、分かってもらえてるとは思うけど)
今回は言語+ビルトインライブラリの話をした
0837デフォルトの名無しさん2015/11/06(金) 21:08:34.74ID:iLvLfKdX
>>829
はー、なるほど。
今デバッガでステップで見てたけど、今のOSは賢いな。素直にこれは勉強になったわ。

やっぱCしなきゃならんな。
ずっと割と特殊な言語してるからな。
0838デフォルトの名無しさん2015/11/06(金) 21:09:42.32ID:iLvLfKdX
>>834
言語じゃなくて処理系だけどあるよ。
0839uy ◆Qawu9.2l1E 2015/11/06(金) 21:14:05.86ID:ctWMnKjq
質問の意図が全くわかってないカスだな・・・
0840デフォルトの名無しさん2015/11/06(金) 21:58:03.15ID:bdwf2snB
コンパイラやインタプリタならあるな
0841デフォルトの名無しさん2015/11/06(金) 22:29:45.01ID:iLvLfKdX
>>839
どんな意図?
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
>>843
もう説明したでしょ。

>>844
そのとーり。
0846デフォルトの名無しさん2015/11/07(土) 15:28:58.81ID:RwXev/UR
もう一度自分の書き込みを呼んでみよう

> ヒープが下から、スタックフレームが上から、同じメモリを食ってくんだから。
> ヒープが溢れると、スタックフレームも溢れてるし、
> スタックフレームが溢れるという事はヒープも溢れてる。
> 実際問題全く同じなのに。

全然説明になって無いね
0847デフォルトの名無しさん2015/11/07(土) 19:07:11.11ID:aPHPZ3+u
>>805
InterLisp-Dはスタックフレームはヒープ上に取るから仮想記憶が尽きるまで。
ちなみに実行を止めてダンプを持ち運べば別のマシンで再開できた。
0848uy ◆Qawu9.2l1E 2015/11/07(土) 21:38:02.16ID:Rb6TxNfK
ループ(笑)
0849デフォルトの名無しさん2015/11/07(土) 22:12:39.02ID:k3SZd1ks
>>848
再帰は関数の最後まで見ないと繰り返しの処理をやってるかわからないんだよ。
これを見て欲しい。

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:0QRugbs1
ルビリストから無名再帰使ってるわ

Mumei_saiki_kakkoloopwara do |f|
 処理
 f.call
end

これが再帰て言ってもわからないよね。。。。。
0852uy ◆Qawu9.2l1E 2015/11/07(土) 22:36:05.67ID:0QRugbs1
>>851 ルビリストから → ルビリストだから
0853デフォルトの名無しさん2015/11/08(日) 04:56:54.05ID:36/ICdkK
>>849 普通は ...(数百行) を procA(); と置き直すだろう。
0854デフォルトの名無しさん2015/11/08(日) 08:58:38.41ID:ruUsjfQ4
>>851
>>106でそれのパクリ元は外出
0855uy ◆Qawu9.2l1E 2015/11/08(日) 09:37:12.54ID:w/pNyAon
無名再帰がパクりとか意味わからないんですけど
0856デフォルトの名無しさん2015/11/08(日) 09:46:42.44ID:ruUsjfQ4
>>855
無知を自慢しなくても良い
0857デフォルトの名無しさん2015/11/08(日) 10:40:01.80ID:D4jx3nEw
>>853
ありえねえ。ループのたびに関数作るのかお前は。
関数ヘルだな。
0858デフォルトの名無しさん2015/11/08(日) 11:43:39.05ID:zIxOYVPQ
>>857
処理が長い場合、タスク分割のために関数・メソッドにしておくのはごく一般的な事。
プログラマとして仕事したいなら、働く前にリーダブルコードを読んでおくといいよ。
0859デフォルトの名無しさん2015/11/08(日) 11:58:26.23ID:EqVtngVc
>>849
あのな、そのレベルのものを、再起だとかループだとかいう時点でおかしいと気づけ。

例えば、
parseDoc(lpStr) {
  :
 みたいな関数で、while(...)で、strが尽きるまでループしている中で、
 if(cmd=="eval") lpStr=parseDoc(lpStr);

 みたいに使えば、あ、同じ構造を処理してるんだな、終わったらポインタが進むんだなって一目でわかるでしょ。
これを理解した上で、勝手スタックに今のポインタ値保存して、必要なら変数も保存して、終わったら戻す、みたいな処理のほうが良いなら、説明してほしいわ。

あと関数数百行はおかしいから。
80行〜120行でも長大関数。
0860デフォルトの名無しさん2015/11/08(日) 13:05:36.05ID:D4jx3nEw
>>858
本のタイトル知ってるだけのシッタカさんお疲れ様です。
0861デフォルトの名無しさん2015/11/08(日) 13:07:41.95ID:D4jx3nEw
>>859
何を言っとるんだチミは。
0862デフォルトの名無しさん2015/11/08(日) 13:08:56.74ID:D4jx3nEw
仕事でプログラムやるなら関数数千行とかザラだから。
それらを読み解けなければやっていけない。
0863デフォルトの名無しさん2015/11/08(日) 13:31:25.99ID:YL2+Mlqr
ザラって…奴隷の鎖自慢でしょうか?
0864デフォルトの名無しさん2015/11/08(日) 13:48:33.01ID:hJdCHUnW
>>861
何に疑問持たれてるかわからん。

>>862
仕事でプログラムしてるけど、そんな関数書いたらQCレビューではねられるよ。
そんなレビューもない会社なら別だけどさ。
0865デフォルトの名無しさん2015/11/08(日) 14:00:37.62ID:D4jx3nEw
>>864
>>859は全面的に何を言いたいのかわからない内容だ。
小企業のジコマンレビュー受けて書きなおせば?w
0866デフォルトの名無しさん2015/11/08(日) 14:02:48.23ID:YL2+Mlqr
コードレビューもないような企業が未だにあるってことに驚き
0867デフォルトの名無しさん2015/11/08(日) 14:03:30.47ID:D4jx3nEw
ちなみに俺は一部上場の超一流企業の物流部門に所属してる。
関数は1000行超えてからやっと新人卒業って感じかな。
ベテランになると万超えるよ。
0868デフォルトの名無しさん2015/11/08(日) 14:04:39.12ID:D4jx3nEw
>>866
なんのためのレビューだよw
レビューしなきゃ不安になるような人員雇ってる時点でお察しだわw
SIerか?じゃあしょうがないよね。
0869デフォルトの名無しさん2015/11/08(日) 14:06:39.84ID:D4jx3nEw
コードレビューw
0870デフォルトの名無しさん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
1万行の関数は頻繁に目にする。
読まないけど。
0873デフォルトの名無しさん2015/11/08(日) 17:13:32.26ID:ruUsjfQ4
1万行の関数ってtraslation limitsのどれかを超えてたりしない?
行数の制限はないけど、他の項目で引っかかってても不思議じゃない。それくらいアホ。
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:ayKNhgcG
ループでは書けない再帰構造のお話はどうなったんだろう‥
0877デフォルトの名無しさん2015/11/08(日) 18:00:06.71ID:ruUsjfQ4
社員教育されてない底辺企業の社員には再帰アルゴリズムは理解不能なので禁止されている。
0878デフォルトの名無しさん2015/11/08(日) 18:43:05.21ID:Ai/4n8j5
再帰厨の脳味噌は、再帰アルゴリズムが理解不能な社員が想定できる時点で
現実世界と回s利しまくり。

これが永遠ヒキニートの再帰厨の現実。
再帰アルゴリズムを見るだけですさまじい苦労なんだろう。
0879デフォルトの名無しさん2015/11/08(日) 18:54:26.34ID:krAhSW9o
再帰を否定も推進もする気はないが、確かに社員教育なしに再帰使うのは怖すぎる。
0880デフォルトの名無しさん2015/11/08(日) 18:57:00.93ID:ezMQjLzR
Nw
0881デフォルトの名無しさん2015/11/08(日) 19:03:15.46ID:ruUsjfQ4
理解不能だったが、ID:Ai/4n8j5を見て、そう言う底辺も世の中には存在する事を知った。
バカを使うためには難しい事を禁止して、バカの能力の範囲内で使う事が肝要。
0882デフォルトの名無しさん2015/11/08(日) 19:53:59.36ID:krAhSW9o
「バカ」つっても若い奴は未熟なだけだ。コードを見せて勉強させる。
問題はバカ上司。効率が落ちるのは必至。ジョブが頓挫してもおかしくない
0883デフォルトの名無しさん2015/11/08(日) 20:03:50.49ID:HEL0zLh3
>>865
お前アホなのかな。

何なんだろう。コードが長くて一人前はあり得ないわ。
不安だからレビューするんじゃなくて、品質をより上げるためにレビューするんだけどなぁ。
俺は医療だけど。スタンプラリーが10箇所超えてる。
0884uy ◆Qawu9.2l1E 2015/11/08(日) 20:26:12.13ID:w/pNyAon
>>856 
質問です。



 無名再帰がパクりってな に?
無 名再帰がパクりって なに?
無名 再帰がパクりっ てなに?
無名再 帰がパクり ってなに?
無名再帰 がパク りってなに?
無名再帰が パ クりってなに?
無名再帰がパ  クりってなに?
無名再帰が パク りってなに?
無名再帰 がパクり ってなに?
無名再 帰がパクりっ てなに?
無名 再帰がパクりって なに?
無 名再帰がパクりってな に?
 無名再帰がパクりってなに ?
0885uy ◆Qawu9.2l1E 2015/11/08(日) 21:52:16.34ID:hjGS9Lf9
三ミ三三三三リ┼┼l l      / ,.  ---  -= _    Y三ヲ/ ̄ \   〈ニ三
  r'三三三三{  .ノ┌‐┐   ./≠::::::::::::::::::::::::::::::::::ミ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
>>884
昔々、恐竜が生きていた時代に条件分岐や繰り返しと行った処理は
ぜんぶgoto文で行われてた。ダイクストラさんはそれがわかりにくいってことで
goto文は有害と思われると言って構造化プログラミングを提唱した。
今日のプログラム言語は条件分岐に用いるif文や繰り返しに用いるfor,whileといった
専用の構文を用意している。もはや構造化を意識する時代じゃないし、
JavaやRubyのようにオブジェクト指向の言語を使えば自動的にオブジェクト指向になる時代だ。
お前は時代遅れの原始人ってことを自覚するべきだと思われる。
0887デフォルトの名無しさん2015/11/08(日) 22:20:40.52ID:D4jx3nEw
>>886は>>874あての間違いです。
uyさんごめんなさい。uyさんごめんなさい。uyさんごめんなさい。
0888デフォルトの名無しさん2015/11/08(日) 22:43:10.55ID:D4jx3nEw
現代のプログラマーの問題点ついて論文書いた。読んでくれ。

構造化にしてもオブジェクト指向にしても、それらはプログラムを管理しやすくするための技術だ。
あくまでもプログラムを管理するという目的があってその目的を達成するための手段の一つ。
ところがろくに知識のない知ったかぶりっ子は往々にして手段と目的を取り違える。
関数を分割すること、オブジェクトを分けること、デザインパターンを使用すること
その作業そのものを目的にしてしまう。十分にわかりやすいプログラムであっても
関数が分かれていないからわかりにくいプログラムだと思い込んでしまう。
ご本を読んでわかった気になってる経験の浅いニワカ野郎が陥る落とし穴だ。
俗にいう意識高い系である。
0889デフォルトの名無しさん2015/11/08(日) 23:57:20.92ID:QYMRsb+2
tree 構造に対して何かしようと思ったらどうしても再帰になると思うんだが。
0890デフォルトの名無しさん2015/11/09(月) 00:15:38.69ID:tkNS1IWM
>>889
スレタイよく見ろ。なるかどうかじゃない、好きかどうかを言えよ!(ドン!!)
0891uy ◆Qawu9.2l1E 2015/11/09(月) 00:28:47.36ID:VILofMhT
ループ → 自分で情報格納Arrayとインデックスを管理
再帰 → スタックと引数を使うから↑の変数宣言いらない

↑全てのループと再帰は末尾最適化して書ける

→ 再帰厨の勝ち
0892デフォルトの名無しさん2015/11/09(月) 00:50:25.68ID:tkNS1IWM
>>891
再帰でやるにしても配列と序数の管理は必要でしょうに。
引数つまりローカル変数を書き換えていくっしょ。

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
>>884
↓これのどこがわからないんだろう? >>106が読めないのか?

>>854
| >>851
| >>106でそれのパクリ元は外出
0894デフォルトの名無しさん2015/11/09(月) 08:09:11.20ID:KQW6HPEX
>>891
関数使った時点で自動宣言されてるよ
専用機でもない限り宣言されないスタックなんてない

結局、再帰もループも使う側の概念の問題で、
具体的な違いなど見つからない
0895uy ◆Qawu9.2l1E 2015/11/09(月) 09:00:44.47ID:iJi5V/lc
>>892
インデックスのない再帰の例

# 最上位ノードのシンボルを得る
def top_symbol
 return up.top_symbol if up
 symbol
end

そして1関数の再帰の話というよりデータの管理方法の話だ
例えばクラスAのインスタンスが複数個必要な時、
ループ厨は配列で管理するけど、
再帰厨様はツリーで管理するから、その分の配列宣言が不要


>>893
は?

>>894
は?
0896デフォルトの名無しさん2015/11/09(月) 09:34:59.77ID:VSFTuqKT
gotoも必要であれば使うべきだと思うけどな。
アセンブラに毛の生えたような言語使ってるけど真剣に思う。
0897デフォルトの名無しさん2015/11/09(月) 09:40:27.96ID:KQW6HPEX
いや宣言されてるから
0898uy ◆Qawu9.2l1E 2015/11/09(月) 09:51:00.11ID:iJi5V/lc
>>897
君のような知恵のチンパンに、この事実を伝えるのは難しいけれど


"コンパイラ"が宣言してる内部変数と
ソースコード上で"宣言している変数"は別物だよ
0899uy ◆Qawu9.2l1E 2015/11/09(月) 09:51:56.06ID:iJi5V/lc
はあ誤字送信してテンション下がる
0900デフォルトの名無しさん2015/11/09(月) 09:52:48.66ID:Yjqxj+LL
長大なループもgotoもVMの命令デコードのループで使われてる。
使わないと高速化が厳しい。
適材適所。
0901デフォルトの名無しさん2015/11/09(月) 10:03:11.90ID:ddVcBsOP
>>898はシンボルが何か分かって無いようだな
コンパイラの知識が0なんだろうな
0902uy ◆Qawu9.2l1E 2015/11/09(月) 10:04:21.36ID:iJi5V/lc
Aクラスのインスタンス
f 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

こうなりますけど


ループでかけんの?
0903uy ◆Qawu9.2l1E 2015/11/09(月) 10:05:49.65ID:iJi5V/lc
>>901
ちなみに
僕の書いた「 symbol 」って変数名ですよ

頭大丈夫ですか?
0904デフォルトの名無しさん2015/11/09(月) 10:08:48.44ID:fyLz/sBu
>>895
>>>893
>は?
バカ自慢しなくて良いぞ。
0905デフォルトの名無しさん2015/11/09(月) 10:13:10.33ID:ddVcBsOP
>>903
哀れな奴だな
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/lc
話を戻すと
var.next.next.next.next.next.next.next

というリストを

ループで辿れるか?という話だよ
基本は再帰

ループでやるなら文字列を連結してevalでもしないと無理
0911uy ◆Qawu9.2l1E 2015/11/09(月) 10:37:25.00ID:VP0GkkkJ
>>910
ループでもいけたからevalの話は忘れてほしい
0912デフォルトの名無しさん2015/11/09(月) 10:42:36.97ID:ddVcBsOP
精神病みたいだな
0913uy ◆Qawu9.2l1E 2015/11/09(月) 10:44:54.23ID:VP0GkkkJ
対 鬱アスペ用コミュニケーションの取り方
0914デフォルトの名無しさん2015/11/09(月) 10:46:48.42ID:ddVcBsOP
トリップなんか付けちゃって
誰かが自演するとでも思っているのだろうか
自意識過剰にほどがあるな
0915デフォルトの名無しさん2015/11/09(月) 10:51:04.65ID:KQW6HPEX
まったく関係ないけど、
2ちゃんねるって俺の考え方が正しくないと嫌だもん、みたいなのが多いな
0916デフォルトの名無しさん2015/11/09(月) 11:26:12.30ID:VSFTuqKT
>>902
最初の要素を貰って、変数に参照を保存する、
upがある限りループで参照を入れ替え続けて、無くなったらreturnすればいいんでないの?
ずっと再帰推しだけど、これは流石にループに部がある。
0917デフォルトの名無しさん2015/11/09(月) 11:32:30.11ID:VSFTuqKT
コントロールを画面にレイアウトする、って時に、
再帰でコントロールを持つコントロールをレイアウトして、それをレイアウトするのか、
ループで、コントロールに入りましたよ、とスタックを積んでから、配置して、結果こうだったよ、とレイアウトの続きをするのかだと、わかりやすいと思う。
ループの方は、その要素が変わった時全体書き直さない限りわからん。頭から舐める必要がある。その要素だけが変わった、は持てないか、ツーパスになる。
再帰だと、親要素のレイアウトに子要素全体が影響するだけだから、再レイアウト時にはその要素だけをまずレイアウトして、影響があるように変わったら上位を計算すればいい、とか。
今適当に書いたけど。
0918uy ◆Qawu9.2l1E 2015/11/09(月) 11:47:26.21ID:VP0GkkkJ
>>902
ループ
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
>>918
死ねカス
0920uy ◆Qawu9.2l1E 2015/11/09(月) 12:08:07.28ID:VP0GkkkJ
>>919
死ねゴミ
0921デフォルトの名無しさん2015/11/09(月) 12:14:37.80ID:ddVcBsOP
>>920
死ね
0922uy ◆Qawu9.2l1E 2015/11/09(月) 12:19:00.07ID:VP0GkkkJ
>>920

ループ
[: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
>>922
消えろ
0924uy ◆Qawu9.2l1E 2015/11/09(月) 12:20:37.26ID:VP0GkkkJ
眠くてさっきから色々ミスってる

もうだめぽ
0925uy ◆Qawu9.2l1E 2015/11/09(月) 12:22:42.09ID:VP0GkkkJ
>>923
よく聞いてください
僕は昨日18時に起きました

で、明日晴れてたらお出かけするんで今寝るわけにはいかない
最低でも夕方まで起きて早くても明日の午前2時以降に起きる生活リズムにして
昼と夜の生活リズムを正さないと明日でかける事はできません
わかりますか?眠いんです。
0926デフォルトの名無しさん2015/11/09(月) 13:48:10.17ID:hqP7pMYo
ハロワにお出かけですか
頑張ってください
0927デフォルトの名無しさん2015/11/09(月) 14:56:28.79ID:9923iS2b
>>898
コンパイラは何のために誰に宣言してるわけなんですか?
0928uy ◆Qawu9.2l1E 2015/11/10(火) 02:21:33.22ID:rHJUCiJo
眠い
0929デフォルトの名無しさん2015/11/11(水) 10:08:59.97ID:3OG8SHn/
とっとと寝ろ。

さっさと治療しろ。
病院行け。
0930uy ◆Qawu9.2l1E 2015/11/11(水) 23:54:56.35ID:8UWeoNQX
なんかいつも怒ってるよねこの人
0931デフォルトの名無しさん2015/11/12(木) 17:08:37.97ID:JhLVklBV
親切に治療するよう勧めてるよね。
0932デフォルトの名無しさん2015/11/17(火) 06:28:37.62ID:NQ6PWML2
Prologのsubsetですが、リストと再帰を組合せた表現は強力です。

subset([],[]).
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:zy6fUDwB
>>932
Prologスレが過疎ってるから
そっちにも書いてくれよ。
0934デフォルトの名無しさん2015/11/19(木) 09:00:29.66ID:ZCMzj2rh
ブラッド・コックスとトム・ラブがObjective-Cを作り「この言語はCのメモリ安全性とSmalltalkの高速性を合わせたものだ」と宣言する。
現代の歴史家は2人が失読症ではないかと疑っている。
https://twitter.com/okdshin/status/666903312151613440
0935デフォルトの名無しさん2015/11/19(木) 13:53:23.84ID:sezybF4H
Objective-Cも廃れたね。
0936デフォルトの名無しさん2015/11/21(土) 04:03:24.93ID:w+2inzGV
>>935
まあよく頑張った方。
Cのマクロのシンタックスシュガー上がりの言語としては。
0937デフォルトの名無しさん2015/11/22(日) 09:09:47.14ID:Zrtw+QZi
インターネットは2036年に崩壊? 正常に作動しなくなる恐れ
http://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:Sy1sSdDl
>>937
NTPは解決済みです。
0939デフォルトの名無しさん2015/11/22(日) 14:31:54.99ID:yPUHF/WV
>>937
今時何を言ってるんだよ…
メジャーなシステムは 64bit になってる
0940デフォルトの名無しさん2015/11/22(日) 14:39:01.10ID:QRD2Q6hy
>>939
そんなことない。信頼性が必要なところはレガシーなシステムによって
支えられている。主役はDOSやUnix。64bitは新しもの好きのキモオタしか使ってない。

Windows 3.1の障害によりパリ=オルリー空港が一時閉鎖の事態に
http://gigazine.net/news/20151116-windows-3-1-alive/
0941デフォルトの名無しさん2015/11/22(日) 15:01:19.79ID:3DWgrAn1
>>940
で、そのアホシステムがインターネットの崩壊に何の関係があるんだよ、爺
0942デフォルトの名無しさん2015/11/22(日) 15:04:38.35ID:QRD2Q6hy
>>941
バカ野郎!インターネットの根幹は信頼性の高いシステムによって
支えられてるんだぞ。つまり、DOSやUnixがその役割を担っているわけ。
お前らキモオタが使ってる最末端のクライアント端末とはわけが違うのだよ。
インターネットは2036年に崩壊する。
0943デフォルトの名無しさん2015/11/22(日) 15:31:11.74ID:yPUHF/WV
>>942
具体的なルーターやサーバーの型名書いてからほざけよ、爺
0944デフォルトの名無しさん2015/11/22(日) 15:37:00.48ID:QRD2Q6hy
>>943
なんで具体的な製品名言わなきゃいけないわけ?
じゃあお前が本名名乗れよ木偶の坊。
0945デフォルトの名無しさん2015/11/22(日) 15:58:54.98ID:yPUHF/WV
>>944
過去の古ぼけた知識で語ってるのがミエミエだからだよ w
0946デフォルトの名無しさん2015/11/22(日) 16:43:37.22ID:QRD2Q6hy
>>945
じゃあてめえが木偶の坊であることが見え見えだから本名言えよ。
0947デフォルトの名無しさん2015/11/22(日) 17:13:34.49ID:sysF3yQ7
>>940
> 信頼性が必要なところはレガシーなシステムによって
> 支えられている。

妄想です。ごく一部。

> 主役はDOSやUnix。64bitは新しもの好きのキモオタしか使ってない。

UNIXはLP64が最初に普及したOSグループの一つです。
それから64bit計算モデルと
time_t相当が64bitになってるかどうかってのは別問題です。
0948デフォルトの名無しさん2015/11/22(日) 17:48:29.34ID:yPUHF/WV
>>946
人に名前を聞くなら、まず自分から名乗れよ
爺の癖に礼儀も知らんとか、終わっとる
0949デフォルトの名無しさん2015/11/22(日) 18:16:07.42ID:QRD2Q6hy
>>948
何そのクソレス。超つまんない。
0950デフォルトの名無しさん2015/11/22(日) 18:33:15.65ID:yPUHF/WV
(もしかしてこの爺は、自分のレスはチョーウケル〜
とか思ってるのか… w
0951デフォルトの名無しさん2015/11/22(日) 18:35:14.68ID:QRD2Q6hy
えーこわーい、爺粘着されてるーこわーい
0952デフォルトの名無しさん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:QRD2Q6hy
>>953
2036年が楽しみだな。
俺は予言するよ。インターネットは2036年に崩壊する。
0957デフォルトの名無しさん2015/11/22(日) 20:28:02.04ID:eGBlL0Yy
スレが違うぞ
ゴルァ
0958デフォルトの名無しさん2015/11/22(日) 20:33:44.03ID:QRD2Q6hy
>>957
は? >>937も結局は再帰が原因にあるわけだが? 知恵遅れも大概にしろよ
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
再帰厨のようなカスPGはカスでしかない。

カスはカス。
0962デフォルトの名無しさん2015/11/23(月) 12:59:05.74ID:w0CpmHEa
>>955
>>949
0963デフォルトの名無しさん2015/11/23(月) 13:16:42.22ID:Rh/Dsjk/
>>961
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
>>964
再帰好きの反対が再帰嫌いだと思うなよ馬鹿w
0967uy ◆Qawu9.2l1E 2015/11/23(月) 22:26:15.06ID:QX2C8YaD
才能もないのにプログラミング始めた奴の末路が「再帰読めません」だからw

オブジェクト指向みたいのは努力でどうにかなるけど
再帰やツリーを頭の中でイメージしてコードを書く能力は
経験積んでもゼロな奴は一生ゼロ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
世に出ているgccもclangも再帰下降パーサだって知ってるでしょ?
だから、そういう人はパーサをどう書くの?って聞いてるの。
jsonでもいいよ。どう書くの?
0971デフォルトの名無しさん2015/11/23(月) 22:55:01.99ID:FbIB0zhM
だから何やねん
お前再帰って言いたいだけやろw
0972デフォルトの名無しさん2015/11/23(月) 22:56:36.23ID:8hTjJ7jG
パーサはまだしも、evalみたいな関数は再起無しでどう実装する?
0973デフォルトの名無しさん2015/11/23(月) 23:02:54.56ID:FbIB0zhM
おまえチューリングマシンに再帰があると思ってるのか馬鹿
0974 ◆QZaw55cn4c 2015/11/24(火) 02:26:05.49ID:LPo8dkqj
パーサの再帰回数を制限するくらいしか現実的じゃないな‥
0975 ◆tAo.kQ2STk 2015/11/24(火) 14:36:47.03ID:ge2Zja90
>>964
あぁそうだね、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
>>975
そこで継続とループを使う時点でCPSと何も変わらんでしょ。
0977 ◆tAo.kQ2STk 2015/11/24(火) 16:26:08.92ID:ge2Zja90
>>976
でも正確に「言語が提供する再帰機能」を使わずに実装できるよ!やったね!

ジョークだけどなw
0978デフォルトの名無しさん2015/11/24(火) 16:40:27.57ID:vXeBzDQX
>>977
言語が提供するスタックを使わないから安全である、って馬鹿らしい結論に至るからなぁww

それアセンブラでオレオレ言語のコンパイラでも書いたら?みたいな話になっちゃう。
0979 ◆tAo.kQ2STk 2015/11/24(火) 16:59:59.73ID:ge2Zja90
>>978
まぁループはループで、無限ループ+メモリ確保しまくりのコンボをキメられたら
どの辺が安全なのか分からなくなるけどなww
ガリガリガリガリ現在スワップ使用量20GiBガリガリ

結局の所言語や問題に適した方法を取るのが一番だよな。
手で書くならパースは再帰で、但しASTのevaluationはループ+継続で。

# そういや昔、某和製コンパイラの「ループが時々うまく動かないバグ」に引っかかって
# 仕方なくそこだけ末尾再帰で書き直した事があったなぁ
# (3バイトの前方ジャンプ命令と5バイトのそれのどちらをバイナリに埋め込むべきかという判定のミスで丁度いい長さのループが誤動作する問題)
0980uy ◆Qawu9.2l1E 2015/11/24(火) 18:31:41.35ID:lNjW2jss
f、、、forがあれば再帰いらないじゃん(震え声


wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
0981デフォルトの名無しさん2015/11/25(水) 02:57:30.93ID:Qex1VIVs
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
0982デフォルトの名無しさん2015/11/25(水) 14:44:52.18ID:DpLrT1vG
繰り返されないものは一瞬に過ぎ去る
何らかのパターンがないと目に見えない
パターンがある場合主題の変奏がその周りにある
パターンは再帰的
再帰は主題を定分ずらした変奏で
それも一つのメタパターンだ
この指で触れられるものを探す
0983デフォルトの名無しさん2015/11/25(水) 19:12:42.88ID:9hpYpU80
【 オンラインTCGエディター 】 >>1

デュエル・マスターズ的な非電源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/g2lh6I
はいはい以下無限ループ
0985uy ◆Qawu9.2l1E 2015/11/26(木) 23:16:10.92ID:hdMKEMdm
再帰的なプログラミングとはつまり
原子の中に世界がある という事をソースコード上でやる事です
再帰関数は、それを手繰る為のもの

間違ってもフラットArrayを再帰で辿るとか阿呆な事はしないように
0986 ◆tAo.kQ2STk 2015/11/27(金) 01:09:19.72ID:Bpp9Chxs
> 間違ってもフラットArrayを再帰で辿るとか阿呆な事はしないように
ヒ、ヒープソート
0987デフォルトの名無しさん2015/11/27(金) 12:21:44.47ID:0B5cIfOS
この>>985っていつもこういうこと言ってんの?

再帰が無くちゃならないとは言わないけど、再帰があって便利なのは事実だし、原子の中に世界があるっていう言い方するから悪いだけだろ。マトリョーシカみたいなものなんだから
0988デフォルトの名無しさん2015/11/27(金) 15:51:36.21ID:ssdfMMFk
quicksort
0989デフォルトの名無しさん2015/11/27(金) 16:24:58.15ID:qMqg45bU
繰り返し言われ続けていることだな。

特に特に特にクイックソートは、再帰で実装されたら極端に効率が悪すぎて使えないって。
0990デフォルトの名無しさん2015/11/27(金) 19:59:37.85ID:W/GzBcKS
いやpivot工夫して最悪ケースに陥らないようにしたり、
末端に近くなったらinsert sortに切り替えたり。
実装が単純なのにかなり速い。
0991デフォルトの名無しさん2015/11/27(金) 20:17:09.15ID:hOvgtNbZ
クイックソートみたいなの改めて実装する機会のない、ただの学習用のお題について
語ったところで実りある議論にならないよ
0992デフォルトの名無しさん2015/11/27(金) 20:41:30.81ID:2gRlH9t5
>>990
もはや再帰と関係ない
0993デフォルトの名無しさん2015/11/28(土) 01:01:51.15ID:a4BqYiCD
分割統治法のアルゴリズムは再帰アルゴリズムの典型
0994uy ◆Qawu9.2l1E 2015/11/28(土) 06:18:22.22ID:lBYFUN9m
>>987.setter("低学歴");
0995デフォルトの名無しさん2015/11/28(土) 08:36:18.25ID:09L0m97I
>>993
だから何?
実装に再帰が必要なわけでもなし
0996デフォルトの名無しさん2015/11/28(土) 10:32:57.04ID:M/Wigktg
アルゴリズムと実装の区別も つかない低脳は話に入ってくるなよ…
0997デフォルトの名無しさん2015/11/28(土) 12:24:23.32ID:2xw8Hd1y
>>990のような工夫しないと繰り返しとスタックで実装しても遅い。
0998デフォルトの名無しさん2015/11/28(土) 13:19:43.21ID:Tq6BVuZs
>>997
ライブラリみたいに速度を要求される部分はそう多くない
ほとんどのアプリケーションプログラマにとっては抽象化の方が重要
0999デフォルトの名無しさん2015/11/28(土) 16:27:24.55ID:CrLuhOYh
クイックソートは、問題の無いループ版がライブラリにあって簡単に使えるのに
わざわざ問題のある再帰で書く必要なんてない。

ほとんどのアプリケーションプログラマは、
ループ方式で実装されたライブラリにより高速処理を実現することができる。

無理に無意味に再帰ばかりを使用しようとする再帰厨は、システムの破壊者だね。
1000デフォルトの名無しさん2015/11/28(土) 16:30:38.50ID:CrLuhOYh
再帰のアルゴリズムが理解できたんなら、
それをループ版に直すぐらいのプログラミング能力は備えるべき。
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
10021002Over 1000Thread
2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
http://premium.2ch.net/
http://pink-chan-store.myshopify.com/
レス数が1000を超えています。これ以上書き込みはできません。