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

なあ、再帰関数好きな人いる? パート2 [転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
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;
}

認めるも何も間違った知見に、すり寄る気なんてさらさらありません
■ このスレッドは過去ログ倉庫に格納されています