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

1デフォルトの名無しさん
垢版 |
2015/11/28(土) 18:51:38.86ID:Rc2MJzM/
なあ、再帰関数好きな人いる?
2015/12/26(土) 22:10:31.84ID:oIXuKyHb
メモ化しないコードだとそうなるね
2015/12/26(土) 22:19:22.17ID:hFLlv/LI
メモ化とか線形のメモリ食うじゃね?
2015/12/26(土) 22:46:18.19ID:JxygBNoz
>>333
直近2つを記憶するだけだから定数
2015/12/26(土) 23:20:10.16ID:YV12MLKo
>>334
それは再帰的定義を使う方では?
フィボナッチ数列の第n項を直接nの式で表せるはずだが
2015/12/26(土) 23:36:55.55ID:JxygBNoz
>>335
文脈読もうな。
メモ化に必要な記憶領域が線形ではないか、と言ってる奴がいたから定数だ、と答えただけ。
2015/12/26(土) 23:44:58.30ID:jxcpNE9M
まだアーキ依存どころか言語依存の話してるの?
2015/12/27(日) 00:05:08.34ID:TlhMnrM9
再帰メモ化定数メモリフィボナッチってどんなソースになるの?
2015/12/27(日) 00:35:22.25ID:nuYFrBF7
fibonacci = fib (0,1)
fib (m1,m2) 0 = m2
fib (m1,m2) n = fib (m2, m1+m2) (n-1)
2015/12/27(日) 00:38:15.78ID:nuYFrBF7
タプルの代わりに木かハッシュを使えば値を全部保持する
普通のメモ化にできるがフィボナッチの計算にはもちろん不要
2015/12/27(日) 00:54:47.63ID:Y7IK7QLW
>>325
bashを使うのであれば

if [ $i -ge $j ]; then
の代わりに
if (( $i < $j )); then と書ける。

また(( )) の中で単体の変数は$を省略できる
if (( i < j )); then

一行で書くこともできる。
(( i >= $ )) && break
2015/12/27(日) 01:09:36.05ID:Y7IK7QLW
stack=("${stack[@]:0:((${#stack[@]}-2))}")

これは、こう書ける。

stack=("${stack[@]::${#stack[@]}-2}")

ついでに、""をつける方が正しいのではあるが、
値にスペースが無ければ、"" は省略可能。
2015/12/27(日) 01:15:06.76ID:Y7IK7QLW
p=$(( $((${array2[$i]}+${array2[$j]}))/2 ))


$((・・・)) の中では普通に () が使用可能

p=$(( (${array2[$i]} + ${array2[$j]}) / 2 ))
2015/12/27(日) 01:21:25.37ID:Y7IK7QLW
for i in `seq 1 1 1000`; do


`` は基本的に $() と同等。新しい$()の使用が推奨されている。

for i in $(seq 1 1 1000); do


また、これは以下のように書ける

for i in {1..1000}; do
2015/12/27(日) 01:32:25.91ID:Y7IK7QLW
lintツールとして、shellcheckコマンドがある。

qsort_rec $left $((i-1))
^-- SC2086: Double quote to prevent globbing and word splitting.

qsort_rec $((j+1)) $right
^-- SC2086: Double quote to prevent globbing and word splitting.

$leftと$rightにスペースが入ってる場合に問題になるから""をつけろと警告される。

これは冒頭で
left=$(($1))

right=$(($2))
のようにして数値であると保証してあげれば消える。

変数 pair が未使用

その他の警告は、上の指摘を修正すれば消えるはず
2015/12/27(日) 01:46:16.35ID:Y7IK7QLW
ループ版で時間がかかってるのはこの部分な気がするな。
配列をコピーしているわけだし。

stack=(${stack[@]::${#stack[@]}-2})

http://www.drk7.jp/MT/archives/000995.html
さて、ここの非再帰版を見ると、どうも配列のコピーはしてないようだ。
ループ版は高速化の余地がありそうだ。

やってみるかね? うまく実装できるかな?
347デフォルトの名無しさん
垢版 |
2015/12/27(日) 02:00:40.37ID:qGJmRem2
ループの途中でコマンドを呼び出すようにすればもう少し遅くできるんじゃないかな。
2015/12/27(日) 02:20:49.37ID:Y7IK7QLW
さーて、コードをほとんど読まずに、Perl版をそのまま置き換えてみたが
きちんと動かんぞとw 面倒くさいな。
速度的には再帰版より速くなりそうな感じはしてるが、処理間違ってるからなw
2015/12/27(日) 02:32:42.88ID:Y7IK7QLW
あ、できたっぽい? 参考にしたコードに二箇所バグが有るようだな。

> &qsort_array($array2,0,$size);
> $right_stack[0] = $right;

$sizeが$rightに入るが、正しくは$size-1

> if ($i - $left < $right - i) {

> if ( ($i - $left) < ($right - i) ) {

Perlの優先順位は、下のように解釈されるんだっけ?
そんなの変えないよな。

今コードを見直してる。
2015/12/27(日) 02:34:29.15ID:Y7IK7QLW
ごめん嘘だったw 。あれぇ〜?
2015/12/27(日) 02:58:09.23ID:Y7IK7QLW
Perl版実行してみたがもともとのコードからして動いてないw
2015/12/27(日) 03:31:06.37ID:Y7IK7QLW
マジめんどくさかったわw 参考にしたコードが悪すぎた。

他のコードと比べてよくわからん比較条件とか処理が多かったので
結局諦めてこっちを参考にした。
http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_102

結論。やっぱりループのほうが速かったねw
https://ideone.com/KmmnH7
recursive
real 0m0.550s
user 0m0.548s
sys 0m0.000s

loop
real 0m0.439s
user 0m0.436s
sys 0m0.000s


なお再帰版も>>326よりも速くなっているのは、
上で指摘した点をリファクタリングしたため。
>>326のコード
> recursive
> real 0m0.637s
> user 0m0.636s
> sys 0m0.000s
>
> loop
> real 0m0.723s
> user 0m0.720s
> sys 0m0.000s
2015/12/27(日) 03:35:18.72ID:Y7IK7QLW
ループの方が速かったので訂正よろw

328 名前:デフォルトの名無しさん[] 投稿日:2015/12/26(土) 21:22:21.55 ID:EXUTS9i+ [10/10]
なんだやっぱり再帰の方がいいのか

329 名前:デフォルトの名無しさん[sage] 投稿日:2015/12/26(土) 21:26:26.06 ID:hFLlv/LI [1/3]
ぐうの音も出ないなこれは
2015/12/27(日) 03:56:54.62ID:nuYFrBF7
定数の差とかどうでもいい
355デフォルトの名無しさん
垢版 |
2015/12/27(日) 07:31:06.68ID:hwv/tSGM
>>353
10000倍高速化してから言いなさい
2015/12/27(日) 07:39:49.49ID:Y7IK7QLW
>>355
いいだしっぺどうぞw
357デフォルトの名無しさん
垢版 |
2015/12/27(日) 07:50:22.72ID:hwv/tSGM
>>356
>>219の主張を受け継いで高速化したお前が言い出しっぺ
2015/12/27(日) 07:55:16.56ID:Y7IK7QLW
言い出しっぺの定義を変えるなよw
本当に往生際が悪いw
359デフォルトの名無しさん
垢版 |
2015/12/27(日) 08:00:41.71ID:hwv/tSGM
>>353でお前が訂正を求めたレスはID:6n5NtJkMの
「再帰は1万倍遅い」に対するレス。
なので、訂正を求めるには10000倍高速化する必要がある

知能障害児には理解不能かな?
2015/12/27(日) 08:06:42.55ID:Y7IK7QLW
と言われてもなぁw

俺は1万倍速いなんて言ってないし。
ループのほうが速いという証拠も出したからどうでもいいかなw
361デフォルトの名無しさん
垢版 |
2015/12/27(日) 08:16:44.55ID:hwv/tSGM
じゃ、求めた訂正を取り消しなさい。
2015/12/27(日) 08:18:08.68ID:Y7IK7QLW
>>361
これでいいのかい?w

ループの方が速かったよwww

328 名前:デフォルトの名無しさん[] 投稿日:2015/12/26(土) 21:22:21.55 ID:EXUTS9i+ [10/10]
なんだやっぱり再帰の方がいいのか

329 名前:デフォルトの名無しさん[sage] 投稿日:2015/12/26(土) 21:26:26.06 ID:hFLlv/LI [1/3]
ぐうの音も出ないなこれは
363デフォルトの名無しさん
垢版 |
2015/12/27(日) 09:08:43.20ID:hwv/tSGM
少し速いと10000倍速いの区別がつかないおバカさんとうエビデンス(笑)
2015/12/27(日) 09:33:20.24ID:Zmrinoji
分かったことは
・再帰をただ単にループに直すと却って遅くなる
・最適化を施せばループのほうが速くなるが、10000倍速くなるなんてことはない
の2点でおっけい?
365デフォルトの名無しさん
垢版 |
2015/12/27(日) 09:55:25.37ID:TQTcd7lL
そうだな。シリアがどうとか言い始めるほどループの方が優秀な訳では無さそうだな
2015/12/27(日) 10:12:22.58ID:dpCOQ+Jx
∞倍だね。

再帰なんってのと比較すること自体おかしい。
却って遅くなるなんて書いてる恥知らずは、プログラミング技術が無さ過ぎ。
2015/12/27(日) 10:24:13.63ID:Zmrinoji
>>366
昨日から昨晩に掛けてのやり取りを知らないのか?
俺はそのやり取りから、>>364が分かった事の全てであるって発言しただけなんだけど。
2015/12/27(日) 10:36:38.52ID:dpCOQ+Jx
やり取りからだって?

2chの妄想だけじゃなくて現実を見ろよ。
369デフォルトの名無しさん
垢版 |
2015/12/27(日) 10:40:01.29ID:hwv/tSGM
∞倍 wwwww
無限大を憶えたての小学生かよ
quick sort 再帰/quick sort 非再帰 = ∞, すなわちquick sort 非再帰が0って事だな。

再帰を必死に否定しているバカの主張

1 スタックが制限の厳しいリソースである環境が全てだと思い込み、再帰の致命的なペナルティだと主張する
2 シェル関数呼び出しをエビデンスとして、再帰が130倍遅いと主張する
3 再帰版のqsortは数万倍遅いと主張するが、数万倍速いはずの非再帰版を示さない
4 知能が低く再帰を理解できない。それをもって再帰は難解と主張する。
5 非再帰版qsortの実行時間はゼロ

本当に知能が低い
2015/12/27(日) 11:19:02.84ID:BwztOoZh
>>364
最適化なくてもループのが速いでしょ
10000倍は無いがw
2015/12/27(日) 11:22:49.99ID:Zmrinoji
>>368
お前の中ではそうなんだろうな。そんな事より現実を見ろよ。

大本の彼らの主張は「クイックソートをお題にした場合に於いて再帰はループに比べて何万倍も差がでる(>>219)」
俺らの主張は「そんなに差がでることは理論的にありえない(>>286)」
であって、
ループのほうが再帰より「僅かでも」速いかどうか(>>352-353)なんざ元々議論していない。

クイックソートをやる上で比較にならないほど再帰のほうが遅くなるというならソースを出せや
2015/12/27(日) 11:23:28.75ID:yWds0j/q
繰り返しの方が再帰より速い!
(ただしシェルスクリプトに限る)
2015/12/27(日) 11:23:33.41ID:Zmrinoji
>>370
>>325
2015/12/27(日) 11:29:16.92ID:nlFV9EHx
>>371
引数受け渡しとかレジスタ待避とかで、余分なメモリー操作が発生する。
2015/12/27(日) 11:32:56.76ID:Zmrinoji
>>374
>>260

定数オーダーの空間計算量で計算が出来ないなら、原理的に余分なメモリ操作は避けられない。
それはループでも一緒。
2015/12/27(日) 11:43:09.26ID:yWds0j/q
>>374
明示的なスタック操作と大差ないのでは?
2015/12/27(日) 11:52:39.31ID:BwztOoZh
>>373
純粋に処理速度の話してんならネイティヴコード化したものでないとさ
2015/12/27(日) 12:07:38.28ID:BwztOoZh
>>375
横ですが、再帰呼出だとcallのオーバーがある分遅くなるで良いのかな?
まあ数パーセント程度だと思うけど
2015/12/27(日) 12:20:57.14ID:nuYFrBF7
クイックソートだからなんとかなってるだけで
たとえば赤黒木の操作を自前でスタック管理するアホはいないわけ
380デフォルトの名無しさん
垢版 |
2015/12/27(日) 12:27:15.41ID:Zmrinoji
>>377
ほい、最適化しなければループのほうが遅い証拠。
http://www.fastpic.jp/images.php?file=8506909875.png
2015/12/27(日) 12:33:24.41ID:BwztOoZh
>>380
ああ分かってない人ねwww
2015/12/27(日) 12:35:34.85ID:Zmrinoji
>>378
Pen4のデータシートの値を元にするなら
ループのコストと再帰のコストは約2.5〜3clockくらいの差になると思う。

今時のCPUならもっと差は縮まるだろうし、実際に測った訳じゃないけど
だいたいそのくらいになる筈。
2015/12/27(日) 12:38:44.94ID:Zmrinoji
>>381
最適化が無くてもループの方が「僅かでも」速いって言い張るお前に
そうじゃない場合もあるって言ったのが>>373
で、それに対しお前はネイティブコードで比較しろっつーから
「最適化無しのネイティブコードで」比較したんだが。

一体お前は何を求めてるんだ?
2015/12/27(日) 12:38:57.92ID:BwztOoZh
>>382
そこまで解説できる人ならネイティヴコードだと逆転するのわかるでしょ
アセンブリで書けとは言わんけどさ

>>381はすまん
2015/12/27(日) 12:42:13.97ID:Zmrinoji
>>384
ループ以外の本質的な処理に100clock掛かるとすれば、
数%の差だけどループより再帰のが遅くなるって意見は正しいねって話さね

381については了解
2015/12/27(日) 12:46:31.99ID:BwztOoZh
>>385
thx
2015/12/27(日) 13:08:45.42ID:yWds0j/q
>>378
tail callを繰り返しに変換できるようなケースだと
関数呼び出しはコスト高かも知れないが、
ループ版では明示的スタック操作をしなければならない場合、
call,ret相当のことをjpと組み合わせて明示的にやらないといけない。
通常、関数呼び出し後のスタックフレームの確保はcalleeが明示的にやるからループ版と変わらないが、
スタックフレームの開放はretが自動的にやる。
だからコスト的には大差なく、
関数呼び出しの方が有利なケースだってあるはず。

繰り返しの明示的なスタック操作が圧倒的有利にあるのは、
FILOじゃなくてFIFOにしたり戦略が建てられること。
388デフォルトの名無しさん
垢版 |
2015/12/27(日) 13:36:27.64ID:9aquywWv
>>379
お前は何を言っているんだ。
FreeBSDもLinuxも.NETもJavaも赤黒木はループで実装してるぞ。
再帰はプログラムの中に時限爆弾仕込むようなもの。再帰使うやつはテロリスト。
2015/12/27(日) 13:46:00.90ID:nuYFrBF7
頑張ってバグ入れずに済んでよかったね、としか。
しかもそれで得られる速度の向上も微々たるもの。
390デフォルトの名無しさん
垢版 |
2015/12/27(日) 14:00:50.68ID:9aquywWv
>>389
再帰にしたらバグが減るってものでもないしなあ。
不変オブジェクトを使うから再帰がやりやすいのであって
可変オブジェクトでの再帰はループよりもややこしいところがあるよ。
2015/12/27(日) 14:27:20.76ID:+491JRRx
>>388
>赤黒木はループで実装してる
本当か?やればできるものなのか?証拠をみせてみろ

平衡ニ分木であるからスタックもむやみに深くならないし,
正直なところ,可能だとしてループ化するメリットがあるのかね
392デフォルトの名無しさん
垢版 |
2015/12/27(日) 14:37:53.35ID:9aquywWv
>>391
freebsd red black tree source
とかで検索すれば出てくるよ
2015/12/27(日) 14:44:37.25ID:BwztOoZh
>>390
バグ云々ではなくて、コード数や可読性だと思うが
そもそも再帰呼出を理解出来ない人は論外だが
2015/12/27(日) 14:47:35.86ID:kNkpHWWg
知らないうちにコードが再帰化してハマりました
のほうが多そう
395デフォルトの名無しさん
垢版 |
2015/12/27(日) 15:00:09.33ID:9aquywWv
>>393
主語がわからん
2015/12/27(日) 15:03:49.95ID:BwztOoZh
>>395
バグが増える要因はプログラミングソースのステップ数や可読性に左右されるのであって、アルゴリズムは特に関係ないということ
397デフォルトの名無しさん
垢版 |
2015/12/27(日) 15:06:51.61ID:9aquywWv
>>396
アルゴリズムによってステップ数や可読性は変わるよ
398デフォルトの名無しさん
垢版 |
2015/12/27(日) 16:29:32.45ID:hwv/tSGM
>>388
LinuxもFreeBSDも木全体に対して何らかの操作を行うインターフェースを実装してないからあたりまえ。

どっかで見たことある気がしたので探してみたらunbound
http://code.metager.de/source/xref/freebsd/contrib/unbound/util/rbtree.c

また一つ、再帰否定バカが無知のエビデンス(笑)を積み重ねていく
399デフォルトの名無しさん
垢版 |
2015/12/27(日) 16:32:53.51ID:9aquywWv
>>398
知らない人がいたから言っただけだよ。
ループで実装されてるんだよーって。
インターフェースを実装してないからとか理屈付けする意味あるのかな。
バカはお前。
400デフォルトの名無しさん
垢版 |
2015/12/27(日) 16:47:04.16ID:9aquywWv
インターフェース?
再帰と関係あるのかな?
わからん。この世はわからんことだらけだ。
2015/12/27(日) 17:00:20.74ID:GUkoCLfr
> LinuxもFreeBSDも木全体に対して何らかの操作を行うインターフェースを実装してない


OSが…インタフェースを…実装?
2015/12/27(日) 17:01:14.29ID:Zmrinoji
>>399
ねぇねぇ
そのループで実装されてる>>398のコードでも
自前でスタック管理してる訳じゃ無い。
とすると、>>379に対する突っ込みとしては>>388変じゃない?
403デフォルトの名無しさん
垢版 |
2015/12/27(日) 17:03:04.29ID:9aquywWv
>>402
スタック管理の解釈次第だね。>>388が変だと結論できる解釈もありだね。
404デフォルトの名無しさん
垢版 |
2015/12/27(日) 17:03:49.11ID:9aquywWv
>>401
わけわからんよね。
2015/12/27(日) 17:04:55.68ID:Zmrinoji
>>403
ほう、つまり君はただのループをスタック管理と解釈する訳だね?
2015/12/27(日) 17:05:12.17ID:X/TfzIFq
最近、書き込みが多くなって
このスレの勢いがすごい
2015/12/27(日) 17:07:35.61ID:Zmrinoji
>>406
確かに。
>>256から数えて、1日半で150も伸びてる。
408デフォルトの名無しさん
垢版 |
2015/12/27(日) 17:18:58.89ID:9aquywWv
>>405
再帰をループに置き換えるときには
再帰で暗黙的に管理されるスタック上の情報を
明示的に管理する必要がある。それをやるのは面倒だから
赤黒木は再帰で実装されているはずだというのが>>379に関する俺の解釈。
面倒なことないよ、現に赤黒木はループで実装されることが多いよっていうのが>>388
409デフォルトの名無しさん
垢版 |
2015/12/27(日) 17:21:03.25ID:9aquywWv
語句の解釈に文句つけるのはあまり建設的じゃないような・・・。
その先には何もないような・・・。
410デフォルトの名無しさん
垢版 |
2015/12/27(日) 17:24:39.80ID:9aquywWv
クイックソートについても再帰のスタックをそのまま
ループで再現するっていうのはどうかと思うなあ。
末尾再帰は単純なループに変換できる。ループで書くならループらしい書き方をするべき。
2015/12/27(日) 17:26:57.17ID:Zmrinoji
>>408
ふーむ。

複雑な再帰構造を持つ場合、例えば再帰下降構文解析器みたいに複雑な相互再帰をする場合には
クイックソートの時のように簡単に再帰をループで置き換えることは出来ない。
そして一般に再帰をループで置き換えるならスタックが必要で、
込み入った再帰をスタックを使ってでもループに置き換える奴は居ないだろう。
現に赤黒木をスタック管理をしてでも強引にループで書き直すようなアホは居ないんじゃないの?
というのが>>379に関するこっちの解釈。
それに対し、いやいや赤黒木はループで実装してるんだぜ!ってのが>>388の俺の解釈。
話が噛み合って無くね?ってのが>>402

日本語の問題な気も
412デフォルトの名無しさん
垢版 |
2015/12/27(日) 17:28:09.10ID:9aquywWv
>>411
解釈が違うのなら話が噛み合わないことについては筋が通るかと。
2015/12/27(日) 17:29:32.88ID:Zmrinoji
>>410
そもそもクイックソートは分割統治法の典型例だからなぁ。
自分を2度呼び出す時点で末尾再帰的じゃないし
ループらしい書き方をするとクイックソートとは呼べないシロモノになると思う
2015/12/27(日) 17:30:37.18ID:Zmrinoji
あ、勿論クイックソートをもっと単純なループで書き直せるってんなら歓迎するよ!
415デフォルトの名無しさん
垢版 |
2015/12/27(日) 17:33:05.31ID:9aquywWv
>>413
一方の再帰呼び出しは末尾再帰になるっしょ。ループに置換できる。
2015/12/27(日) 17:33:09.23ID:Zmrinoji
>>412
複数の解釈の仕方がありうるなら、
オレオレ解釈を元に相手をこき下ろす前にやることがあるだろうと
2015/12/27(日) 17:34:13.75ID:Zmrinoji
>>415
・・・・・・それは依然として再帰関数と呼ぶのでは?
418デフォルトの名無しさん
垢版 |
2015/12/27(日) 17:37:56.44ID:9aquywWv
>>416
僕とー君とーは解釈が違うよねってことだよ。
こき下ろすべきじゃないと思うのは君の勝手ー。
こき下ろすのも僕の勝手ー。
ヒューマニズム振りかざす人大嫌いー。←これ僕
419デフォルトの名無しさん
垢版 |
2015/12/27(日) 17:39:20.40ID:9aquywWv
>>417
ループを書く場合、一方の再帰呼び出しは末尾再帰だから
単純なループに置き換えられるよねってことだから、もはや再帰関数とは呼ばないよ。
2015/12/27(日) 17:42:10.80ID:Zmrinoji
>>418
いや、君が>>403で言ったのは「スタック管理」の解釈の違いだろ?
「赤黒木が再帰で書かれてる」等とは一言も言ってない>>379を読んだ君が>>408みたいな解釈をして、
人のことをテロリスト呼ばわりするのってどうなの?
2015/12/27(日) 17:43:59.16ID:Zmrinoji
>>419
https://ja.wikipedia.org/wiki/%E5%86%8D%E5%B8%B0
「再帰とは、あるものについて記述する際に、記述しているものそれ自身への参照が、その記述中にあらわれることをいう。」

ループを含む関数は再帰関数にはなれないの?
そんなことはないと思うんだけど。
2015/12/27(日) 17:46:46.63ID:YWwZOVBb
末尾再帰を勘違いしている人がいるので説明しておこう。

末尾再帰は「再帰を末尾再帰で書けば速くなる」というものではなくて
(単純な)ループを何らかの理由で再帰の形にしないといけない時、
末尾再帰の条件を満たすように、ループを再帰に変換すると
コンパイラが再帰をループに逆変換してくれる機能


なので、再帰を全て末尾再帰にできるわけではなく
(末尾再帰にできるのは、元が単純なループの場合のみ)
また、ループ ─(人間)→ 再帰 ─(コンパイラ) → ループ
というふうに、ループに戻しているだけなのでループより速くなることはない。
423デフォルトの名無しさん
垢版 |
2015/12/27(日) 17:47:27.00ID:hwv/tSGM
>>401,404
FreeBSDのrbtreeもLinuxのrbtreeもそういうインターフェースを実装していないって事だよ。
2015/12/27(日) 17:54:40.33ID:Zmrinoji
>>422
より正確には、「再帰全てをノーコストで末尾再帰にできるわけではなく」かな。
関数がファーストクラスならCPSに変換すれば末尾再帰の形にはなる。
・・・・・・ヒープガリゴリ使うし、スタックを自前で持つのと変わらんけど。
425デフォルトの名無しさん
垢版 |
2015/12/27(日) 17:56:45.58ID:9aquywWv
>>420
>>379は「赤黒木が再帰で書かれてる」とは一言も言ってないけれども、
「赤黒木の操作を自前でスタック管理するアホはいない」と言っているのだから
赤黒木の操作は、自前でスタック管理しないやり方、つまり再帰で実装される
と思っているという解釈は妥当だと思ってる。悪いけど、この解釈については譲歩するつもりはないよ。
120%君が間違っているし、再帰を使う人は120%テロリスト。それでいいね?
2015/12/27(日) 17:58:29.79ID:YWwZOVBb
>>424
速くするための末尾再帰なのに、
逆に遅くなったら本末転倒だよなw
427デフォルトの名無しさん
垢版 |
2015/12/27(日) 18:00:45.81ID:9aquywWv
>>421
無理。再帰を使うなら全部再帰で書くべき。
ループを使う処理では再帰を書かない。
再帰を使う処理ではループを書かない。
それで初めてループと再帰の決着がつけられる。
そしてループが勝利する。
2015/12/27(日) 18:01:48.21ID:Zmrinoji
>>425
確率が1を超えてるとか、幼稚園に迷い込んだ気分だよ。

「赤黒木の操作を自前でスタック管理するアホはいない」と言っている以上、
赤黒木の操作は、スタックなんてものをそもそも自分で触らないようなやり方、
つまり再帰か、又は上手なループで実装されているって話だろ?
フィボナッチ数を計算する関数をスタックを使わずに書いたって言った時、君は再帰の方しか思い浮かべられないのかい?
もしかして自閉症患者かい?
2015/12/27(日) 18:04:52.45ID:Zmrinoji
>>427
それじゃぁ各ノードに可変個の子要素を持つ多分木を列挙するコードは
どうやって書くつもり?
for (auto it : children) {
 if (it->is_leaf()) {
printf("%d ", it->value);
} else {
it->print_values();
}
}
430デフォルトの名無しさん
垢版 |
2015/12/27(日) 18:11:29.94ID:9aquywWv
>>428
>>389を見るに、そうじゃないと思うんだがなあ。
俺は自閉症患者だけれども、それとこれとは関係ない。
お前は全国の自閉症患者やそのご家族の方に謝罪するべき。
あとテロリストにも。
431デフォルトの名無しさん
垢版 |
2015/12/27(日) 18:15:49.41ID:9aquywWv
>>429
どうやってって何がだよ?
ループでか?再帰でか?
2015/12/27(日) 18:18:05.73ID:Zmrinoji
>>430
日本語って難しいよね。分かる分かる。
>>389の解釈は、
再帰でも書けるところをループで書いたんだ。へぇ。バグってなくて良かったね。ご苦労さん。
じゃないの?
>>379が再帰を仮定しているかどうかとは別問題。

俺も自閉症患者だけどね。自分に謝るのって変な感じがするよ。
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況