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

1デフォルトの名無しさん
垢版 |
2015/11/28(土) 18:51:38.86ID:Rc2MJzM/
なあ、再帰関数好きな人いる?
2015/12/29(火) 05:16:02.68ID:GnldGbIR
>>423
インターフェースとか抽象データ型ってことを理解できてないから、
そう言っただけでは理解できないんだと思うよ。
487デフォルトの名無しさん
垢版 |
2015/12/29(火) 16:41:59.31ID:+ubDtqOv
>>429
でけたやでー
https://ideone.com/hykdXg
2015/12/29(火) 20:37:04.28ID:mZCjkrMY
>>485
お前のほうが分かっていないような気がするが‥
2015/12/29(火) 22:38:58.43ID:tgd/4Yaw
>>422の「なので、再帰を全て末尾再帰にできるわけではなく」とか恥ずかしいよなw
2015/12/30(水) 07:30:40.60ID:hgJXqSbV
>>489
>422 「再帰を全て末尾再帰にできるわけではな」いのは当然だが,どうしてはずかしいんだ?
491デフォルトの名無しさん
垢版 |
2015/12/30(水) 16:36:10.59ID:GbTfiPvb
> コンパイラが再帰をループに逆変換してくれる機能
恥ずかしい発言はこれだね。
2015/12/30(水) 17:06:15.23ID:JfqdTNxj
>>491
その理由を言わないとw
493デフォルトの名無しさん
垢版 |
2015/12/30(水) 17:07:27.17ID:WCUOMmTt
掲示板ではレベルのミスマッチがよくあるんだよな。

たとえば、アセンブリと機械語は一対一で対応していると純粋に信じてる人は世の中に結構多い。
そういう人たちとプロセッサのデザイナが掲示板で議論すると当然ミスマッチが起こる。
こういう場合、当然勢力の面でデザイナの方が分が悪くなるね。
世の中、知ったかぶりのバカの方が多いから。
2015/12/30(水) 17:08:24.47ID:JfqdTNxj
手動で末尾最適化をしてみればいいんだよ。

そうすれば、なるほど、
これが最適化されたコードなんだな!って
ループになったコードを目の当たりにすることになる。
2015/12/30(水) 17:28:38.17ID:hD2EQx+W
そういう周りくどい事やってるうちは三流
uyの領域に到達すると文章読むだけで理解する
2015/12/30(水) 17:39:40.10ID:hgJXqSbV
>>491
コンパイラが再帰をループにしてくれる機能はあるよ,恥ずかしいのはどちら?
497デフォルトの名無しさん
垢版 |
2015/12/30(水) 18:05:13.50ID:WCUOMmTt
再帰の方が有利なら、わざわざループに変換するなよ。
むしろ、ループを自動的に再帰に変換しろよ。
2015/12/30(水) 18:08:15.81ID:Y9esFwyM
>>492
逆変換が意味不明
単に変換なら同意するけど
499デフォルトの名無しさん
垢版 |
2015/12/30(水) 18:35:57.34ID:WCUOMmTt
テロリストは逮捕されろよ。
2015/12/30(水) 18:45:12.16ID:o3pJDHAa
再帰が実用的でなく
ループの方が有利だから
変換しないといけない。
2015/12/30(水) 18:47:59.10ID:hgJXqSbV
>>498
それは文脈による,よく逆電圧っていうが実は順電圧だったりすることはあるし
2015/12/30(水) 19:10:36.15ID:Y9esFwyM
>>501
> それは文脈による,

だからこの文脈だと意味不明って言ってるんだが

> よく逆電圧っていうが実は順電圧だったりすることはあるし

ますます意味不明
503デフォルトの名無しさん
垢版 |
2015/12/30(水) 19:20:03.93ID:pyiqU+eC
>>502
この分からず屋!!
2015/12/30(水) 21:43:44.03ID:c5JPL3VW
分かるように説明できないんじゃ周りは皆分からず屋に見えてしまうね
505デフォルトの名無しさん
垢版 |
2015/12/30(水) 21:56:06.02ID:WCUOMmTt
我々市民はテロリストを納得させるような言葉を持たない。
従って、テロリスト自ら変わらない限り、テロリストは永遠に市民の敵である。
506デフォルトの名無しさん
垢版 |
2015/12/31(木) 01:15:35.98ID:+JFM0ZYm
>>496
キミの方だとおもうよ。ぷぷぷ。
「末尾再帰は... コンパイラが再帰をループに変換してくれる機能」

> 末尾再帰は「再帰を末尾再帰で書けば速くなる」というものではなくて
> (単純な)ループを何らかの理由で再帰の形にしないといけない時、
> 末尾再帰の条件を満たすように、ループを再帰に変換すると
> コンパイラが再帰をループに逆変換してくれる機能
507デフォルトの名無しさん
垢版 |
2015/12/31(木) 01:18:23.37ID:+JFM0ZYm
>>496
それは、「末尾再帰最適化」というコンパイラの機能だね。
508デフォルトの名無しさん
垢版 |
2015/12/31(木) 01:21:18.07ID:+JFM0ZYm
「ループを再帰に変換すると、コンパイラが再帰をループに逆変換してくれる」
頭沸いてるだろ。ぷぷぷ。最初からループで書いとけよ。
509デフォルトの名無しさん
垢版 |
2015/12/31(木) 02:10:00.81ID:RPyreEna
そんなんじゃ小説なんか読めないだろう。
読解力なさすぎだよ。
510デフォルトの名無しさん
垢版 |
2015/12/31(木) 02:17:21.09ID:+JFM0ZYm
読解力が足りないとか言いだしたぞ。このバカ。

> ループを再帰に変換すると、コンパイラが再帰をループに逆変換してくれる機能
2015/12/31(木) 02:26:21.16ID:Rb2meO2K
>>490
再帰はすべて機械的に末尾再帰に変換できる。
そんな基本的なことも知らないのは恥ずかしいだろう?
512デフォルトの名無しさん
垢版 |
2015/12/31(木) 02:32:06.38ID:+JFM0ZYm
おー、すげー。天才現る。
これで、スタックオーバーフロー完全克服だ。
513デフォルトの名無しさん
垢版 |
2015/12/31(木) 02:52:07.07ID:cXVC2Dha
末尾再帰に変換できるとは言ったが,スタックオーバーフローを回避できるとは言ってない(キリッ
514デフォルトの名無しさん
垢版 |
2015/12/31(木) 03:04:20.45ID:+JFM0ZYm
クイックソート10000倍高速化とか再帰→末尾再帰の自動変換とか、このスレには天才が多いな。
2015/12/31(木) 07:33:29.73ID:Rb2meO2K
CPS変換も知らんのか…
516デフォルトの名無しさん
垢版 |
2015/12/31(木) 09:52:41.50ID:tmojp+ig
>>510
俺は第三者だ。
俺は書き込んだ奴の言いたいことが容易に把握できている。
それがキミにはできないという。

再帰についてのスレで再帰について書かれているのだから、バックボーンの違いではないだろう。
知識ではなく読解力の問題だ。
こんなもん小学生でも意味をくみ取るぞ。
517デフォルトの名無しさん
垢版 |
2016/01/01(金) 00:50:07.33ID:PlqvFYu0
>>516
>>422を理解出来てるのか? こりゃすげーわ。
ループを再帰の形にするときに、ループを再帰に変換すると、再帰をループに逆変換してくれるコンパイラの機能が末尾再帰?

>>422が末尾再帰を理解してない事が読み取れるだけだ。
それをお前が読み取れるという事は、同一人物以外あり得ない。
518デフォルトの名無しさん
垢版 |
2016/01/01(金) 00:56:33.12ID:XLbYQ9mF
そんなんじゃ小説も読めないだろう。

末尾再帰とは、本来ループで書くべきものを再帰で書いた時にコンパイラが
自動でループに直す機能・・・という主張なのだろう。
519デフォルトの名無しさん
垢版 |
2016/01/01(金) 00:57:41.99ID:PlqvFYu0
>>515
よくいるんだわ。より難解な前提が必要なのに、出来るよって言い出す奴。
520デフォルトの名無しさん
垢版 |
2016/01/01(金) 00:57:43.20ID:XLbYQ9mF
逆変換という言葉は、そういった前提があって出てくる言葉だと思うぞ。
2016/01/01(金) 02:37:45.56ID:mIgzxpKK
コンパイラが最適化してくれるならコンパイラにやらせるのが普通の話だよね
2016/01/01(金) 08:22:45.99ID:xWjlSole
>>521
ループの方が最適化効きやすいしな。
523デフォルトの名無しさん
垢版 |
2016/01/01(金) 08:28:26.90ID:PlqvFYu0
>>520
末尾再帰の説明に「逆変換」を使うってどういう前提だよ www
524デフォルトの名無しさん
垢版 |
2016/01/01(金) 10:18:04.79ID:TPZeTHW+
>>523
本来ループであるべきものをプログラマが再帰に変換しているので、
コンパイラがループに逆変換するという主張なのだろう。

お前、本当にこの程度の文章が読めないの?
そんなんじゃ小説どころか論文も読めないだろう。

俺は元の文すら読んでいなく、引用されてるのを見てそこまで理解できてるぞ。
もう一度聞くけど、お前本当にこの程度の文が読めないの?
2016/01/01(金) 11:36:06.33ID:wTuRpENh
> インバータ(Inverter)とは、
> 直流電力から交流電力を電気的に生成する(逆変換する)電源回路、
> またはその回路を持つ電力変換装置のことである。
> 逆変換回路(ぎゃくへんかんかいろ)、逆変換装置(ぎゃくへんかんそうち)などとも呼ばれる。

逆変換w
2016/01/01(金) 12:12:39.23ID:D046Nv8F
>>519
>よくいるんだわ。より難解な前提が必要なのに、出来るよって言い出す奴。

何言ってんだこいつ
527デフォルトの名無しさん
垢版 |
2016/01/01(金) 15:45:58.36ID:PlqvFYu0
>>524
おおー、スゲー
その調子で>>422を解説してくれや。
528デフォルトの名無しさん
垢版 |
2016/01/01(金) 15:48:40.55ID:PlqvFYu0
>>526
読解力が、足りない。

半端な知識を振り回す知ったかぶりが沢山いるという事だよ。
529デフォルトの名無しさん
垢版 |
2016/01/01(金) 16:18:10.88ID:TPZeTHW+
>>528
それは読解力関係ないだろう。
俺にも全く意味が分からなかった。
何言ってんだコイツ?というのが素直な感想。
2016/01/01(金) 19:46:32.52ID:FqzQpFZg
http://athos.hatenablog.com/entry/20110119/p1

ここまでこれの話題ないって相当終わったレベルの奴らしかこのスレにいないんだな

さっさと死ねよ
2016/01/01(金) 19:53:29.38ID:BqDq7bML
>>530
そりゃrubyだからさ
532デフォルトの名無しさん
垢版 |
2016/01/01(金) 20:37:19.16ID:KnWw4/o3
今年もrubyのオワコン芸w
2016/01/02(土) 03:28:12.35ID:cdXNgg3P
>>531-532
本当に頭悪いカスだな
rubyに限定せず実装出来ると思うけど技量的に理解すら無理な感じ?
再帰とループの変換や末尾再帰の話題には触れてもここはTCOという単語が今まで一回も出てこないという事実

「知ってる側」からすると嘘をついてるのがすぐにわかってしまう
知ったかぶりのクズ
2016/01/02(土) 03:30:31.88ID:cqMsfgi2
>>531-532
さっさと死ねよ
2016/01/02(土) 09:53:52.00ID:QH+c5K8j
>>533
だって末尾再帰なんてlisp/schemeでは当たり前だもの,今はgccでも当たり前だし
いまさらrubyですかね‥
2016/01/02(土) 13:32:29.04ID:3O/U03ws
むしろ自分でやんないと末尾呼び最適化が利かない処理系って(ry
2016/01/02(土) 15:04:15.58ID:QH+c5K8j
なんだか遅れてるんだよねruby屋さんって
2016/01/02(土) 15:39:39.87ID:TZBdz3NA
rubyだからね。仕方ないね。
539デフォルトの名無しさん
垢版 |
2016/01/03(日) 22:30:43.03ID:F57MRPO3
>>533
何度も出てるし「末尾再帰」といった時点でジャンプへの変換という意味を持っていってるんだよ。
最適化が無ければ「末尾」と特別な扱いをする意味が無い。
runyって最近言い出したのか。30年遅れてるな。
2016/01/04(月) 03:42:45.74ID:XM/1Dr6r
理解度が低すぎる
このアルゴリズムはこのスレでは初出だと認識してるけど
読めなくてわけわかんない状態か

さっさと死ねゴミ
2016/01/04(月) 03:51:45.48ID:wtRTZBq6
妥協点でPythonだからね
それ以下の言語でアルゴリズム語ってるスレ見ると
そこで話してる内容とか読む前に
まずはスレ民を学習させる事から初めて
レベルを上げてやらないと話にならない
2016/01/04(月) 04:13:44.75ID:u97FRQbx
>>540
末尾再帰のループ最適化は >>5>>507 ですでに出てきているよ

>>541
最適化の話題なら python や ruby のようなインタプリタではなく
コンパイラで比較するのが適切だね,インタプリタ上で速くなっても
だれもうれしくない.C/C++一択だよ
ま,fortran でもいいが
2016/01/04(月) 04:55:36.62ID:WY8liDeA
再帰好きの人をサイキッカーと呼びたい
544デフォルトの名無しさん
垢版 |
2016/01/04(月) 10:03:14.86ID:hsfrcHKj
いいなそれ
545デフォルトの名無しさん
垢版 |
2016/01/04(月) 12:27:00.00ID:U406TFbL
再帰好きの人のを中二コーダーと呼びたい
2016/01/04(月) 15:06:50.79ID:KNqXLa56
>>542
理解力なさすぎだな
お前の学校の担任はさぞかし苦労したことだろう
2016/01/04(月) 16:24:41.19ID:u97FRQbx
>>546
どんな点をみて「理解力がない」と判断したのか?
説明できますかね,それとも吼えるだけ?
548NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/04(月) 17:38:28.00ID:7uWOp/tU
つか、末尾再帰ってループそのまんまで再帰の利点ないし

recHoge1(a,n,arg...){
 dobefore()...
 if(a<n)recHoge1(a,n,arg...);
}
loopHoge1(a,n,arg...){
while(a<n){
 dobefore()...
 }
}
再帰は無意味、使う必要なし

recHoge2(a,n,arg...){
 dobefore()...
 recHoge2(a,n,arg...);
 doafter()...
}
loopHoge2(a,n,arg...){
 while(a<n){
  pushargstack();
  dobefore()...
  popargstack();
  doafter()...
 }
}
再帰で有意味、この場合使える
549NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/04(月) 17:44:32.72ID:7uWOp/tU
pop,push逆だった
loopHoge2(a,n,arg...){
 while(a<n){
  popargstack();
  dobefore()...
  pushargstack();
  doafter()...
 }
}
550NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/04(月) 18:00:09.14ID:7uWOp/tU
pushargstack();
popargstack();
ユーザー定義のこれらはめんどくさいから
再帰関数使ってコンパイラ任せにするよ
2016/01/04(月) 18:13:29.66ID:zTvWipKl
またゴミカス初心者が来たけど
また1から説明して教育しなきゃいけないの?
552NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/04(月) 18:16:50.81ID:7uWOp/tU
recHoge1(term,arg...){
 dobefore()...
 if(term)recHoge1(term,arg...);
}
loopHoge1(term,arg...){
 while(term){
  dobefore()...
 }
}
再帰は無意味、使う必要なし
recHoge2(term,arg...){
 dobefore()...
 if(term)recHoge2(term,arg...);
 doafter()...
}
loopHoge2(term,arg...){
 while(term){
  popargstack();
  dobefore()...
  if(term)continue;
  pushargstack();
  doafter()...
 }
}
再帰で有意味、この場合使える
pushargstack(); popargstack();
ユーザー定義のこれらはめんどくさいから、再帰関数使ってコンパイラ任せにするよ
たったこれだけの内容
553NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/04(月) 18:19:28.48ID:7uWOp/tU
>>551
>>552
以上のことの何があるか説明してみてよ
554NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/04(月) 18:42:48.29ID:7uWOp/tU
ttp://nas6.main.jp/Maze.cpp

再帰、ループ、等価迷路
555NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/04(月) 18:55:15.40ID:7uWOp/tU
recHoge1(term,arg...){
 dobefore()...
 if(term)recHoge1(term,arg...);
}
loopHoge1(term,arg...){
 while(term){
  dobefore()...
 }
}
再帰は無意味、使う必要なし
recHoge2(term,arg...){
 dobefore()...
 if(term)recHoge2(term,arg...);
 doafter()...
}
loopHoge2(term,arg...){
 while(term){
  pushargstack();
  dobefore()...
  if(term)continue;
  popargstack();
  doafter()...
 }
}
再帰で有意味、この場合使える
pushargstack(); popargstack();
ユーザー定義のこれらはめんどくさいから、再帰関数使ってコンパイラ任せにするよ
たったこれだけの内容 、勘違い訂正
556NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/04(月) 19:03:49.25ID:7uWOp/tU
>>554で、
ループ実装が好きなやつはいないと思うんだけどな
2016/01/04(月) 21:13:17.67ID:KNqXLa56
RubyかPythonで書き直して
C++とかいうゴミいらねーから
558NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/04(月) 21:51:32.16ID:7uWOp/tU
「{C++規則をかなり抑えてCライク}で書かれたソースコード」
のクロスランゲッジなんて、ほぼ、ライブラリの関数名を書き換えるだけだろ
559NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/04(月) 21:54:46.92ID:7uWOp/tU
あ、あと制御構文もちゃっちゃっと書き換えれば出来上がり
2016/01/04(月) 22:07:47.26ID:mZvmD2Em
それをなぜ最初から簡潔な言語で書かないで
わざわざ冗長したC++・C言語といった言語でドヤァとソースコード貼りつけてくるのか、理解しがたいんだけど
カスレベルの初心者である事を数レスに渡る自己紹介でもしにきたのかね?
アルゴリズムの抽象化でC++とか使う奴はその時点で初心者だって一瞬で分かるって言ってるのに
自分が知恵遅れだと分かってないままの奴が続々現れるからこういう場所は話題がループする
2016/01/04(月) 22:08:20.17ID:HCl/OTCR
>>559
死ね
562デフォルトの名無しさん
垢版 |
2016/01/04(月) 22:23:59.40ID:JpzJLk3f
熱烈なC++アンチって速度要求される場面に出会ったことがないんだろな
もしくはフォートラン信者なんだろな
563デフォルトの名無しさん
垢版 |
2016/01/04(月) 22:31:14.13ID:OFaVtQHO
オッパイソンはベーシックみたいなもんで非プログラマが使うのに適してるけど、
プログラマが使うには色々しょぼすぎ。
ペイントショッププロのマクロにオッパイソンが採用されたときは、来るかと思ったけど、
それを機に没落していった。
イヌックスの呪いは有名だけど、オッパイソンの呪いもあるのかもしれん。
564デフォルトの名無しさん
垢版 |
2016/01/04(月) 22:35:24.75ID:OFaVtQHO
しかし、エクセルのマクロ使いはザラにいるのに、他のアプリはマクロ使いが
ほとんどいないんだよな。
イーマックソとか言うウンコは置いといて。
CADなんかマクロの使いであると思うのだが。
Autocadなんかウンコ使いが泣いて喜ぶLisp搭載してるのにな。
なんでだ。
2016/01/04(月) 22:55:58.31ID:8iRyCi7U
とりあえずuyがほんとになにもわかってないことだけわかった
566NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/04(月) 23:00:49.51ID:7uWOp/tU
ruby知らんがこんな感じだろ

def recHoge2(term,arg...)
  dobefore(arg...)
  if term
   recHoge2(term,arg...)
  end
  doafter(arg...)
end
end

def loopHoge2(term,arg...)
 while term
  pushargstack(arg...)
  dobefore(arg...)
  if term
   next
  end
  popargstack(arg...)
  doafter(arg...)
end
end
567NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/04(月) 23:01:55.35ID:7uWOp/tU
class stack
 def initialize
  @ret = -1
  @crnt = 0
  @MAX_STACK = 32768
  @stk[MAX_STACK]
 end
def pop_stk()
  if -1 < crnt
   ret = stk[crnt]
   crnt = crnt - 1
  end 
 end 
def push_stk(v)
  if crnt < MAX_STACK - 1
   crnt = crnt + 1
   stk[crnt] = v
  end
 end
end
stk = stack
def pushargstack(arg1...argn)
 stk.push_stk(arg1)
 ...
 stk.push_stk(argn)
end
def popargstack(arg1...argn)
 argn = stk.pop_stk()
 ...
 arg1 = stk.pop_stk()
end
568NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/04(月) 23:07:46.09ID:7uWOp/tU
def recHoge2(term,arg...)
 dobefore(arg...)
 if term
  recHoge2(term,arg...)
 end
 doafter(arg...)
end

で、こんだけで済むのに、
ループにしたいからって
スタックのユーザー定義なんて馬鹿だろう
569NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/04(月) 23:22:49.68ID:7uWOp/tU
再帰をループにしたかったら
こういうのをいちいち作らなきゃだめだよ
class stack
 def initialize
  @crnt = 0
  @MAX_STACK = 32768
  @stk[MAX_STACK]
 end
def pop_stk()
  if -1 < crnt
   ret = stk[crnt]
   crnt = crnt - 1
   return ret
  end 
 end 
def push_stk(v)
  if crnt < MAX_STACK - 1
   crnt = crnt + 1
   stk[crnt] = v
  end
 end
end
2016/01/05(火) 02:57:13.31ID:/kPL7pQm
プログラミング半年目くらいだろうかコイツは
多く見積もって1年半
それ以上なら今すぐPC捨てたほうが良いレベル
571デフォルトの名無しさん
垢版 |
2016/01/05(火) 02:58:35.02ID:3cj4CitF
>>569

http://www.rubylife.jp/ini/

http://www.tohoho-web.com/python/index.html

http://qiita.com/ozw_sei/items/b45e316fced8aec9a97e
572デフォルトの名無しさん
垢版 |
2016/01/05(火) 02:59:25.81ID:CnA8UQLB
 
 
  
死ねカス
573NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/05(火) 06:30:43.49ID:FnNfbNzM
Array.push()、Array.pop()があるんね
>>568で済む内容を、ループで書きたかったら↓しなければならない

def loopHoge2(term,arg...)
 while term
  pushargstack(arg...)
  dobefore(arg...)
  if term
   next
  end
  popargstack(arg...)
  doafter(arg...)
 end
end

stk = Array.new()

def pushargstack(arg1...argn)
 stk.push(arg1)
 ...
 stk.push(argn)
end
def popargstack(arg1...argn)
 argn = stk.pop()
 ...
 arg1 = stk.pop()
end
574NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/05(火) 06:44:29.17ID:FnNfbNzM
def recHoge2(term,arg1...argn)
 dobefore(arg1...argn)
 if term
  recHoge2(term,arg1...argn)
 end
 doafter(arg1...argn)
end
↑は、こう↓書き換えられる
def loopHoge2(term,arg1...argn)
 while term
  pushargstack(arg1...argn)
  dobefore(arg1...argn)
  if term
   next
  end
  popargstack(arg1...argn)
  doafter(arg1...argn)
end
end
stk = Array.new()
def pushargstack(arg1...argn)
 stk.push(arg1)
 ...
 stk.push(argn)
end
def popargstack(arg1...argn)
 argn = stk.pop()
 ...
 arg1 = stk.pop()
end
575NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/05(火) 07:30:28.12ID:FnNfbNzM
#同色上書き塗りつぶし
def refill(dest,src,x,y,color,minx,miny,maxx,maxy)
 if (x < minx) || (maxx < x) ||(y < miny) || (maxy < y)
  return
 end
 dest[y][x] = color
 #上
 if (src[y-1][x] == color) && (dest[y-1][x] != color)
  refill(dest,src,x,y-1,color,minx,miny,maxx,maxy)
 end
 #左
 if (src[y][x-1] == color) && (dest[y][x-1] != color)
  refill(dest,src,x-1,y,color,minx,miny,maxx,maxy)
 end
 #下
 if (src[y+1][x] == color) && (dest[y+1][x] != color)
  refill(dest,src,x,y+1,color,minx,miny,maxx,maxy)
 end
 #右
 if (src[y][x+1] == color) && (dest[y][x+1] != color)
  refill(dest,src,x+1,y,color,minx,miny,maxx,maxy)
 end
end

↑のループ等価が↓
576NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/05(火) 07:31:25.96ID:FnNfbNzM
stk =Array.new()
#同色上書き塗りつぶし
def loop_refill(dest,src,x,y,color,minx,miny,maxx,maxy)
 term = 0
 while !((x < minx) || (maxx < x) ||(y < miny) || (maxy < y))
  dest[y][x] = color
  #上
  if (term < 1) && (src[y-1][x] == color) && (dest[y-1][x] != color)
   term = 0
   stk.push(x)
   stk.push(y)
   stk.push(term)
   y = y - 1
   term = 0
   next
  end
  #左
  if (term < 2) && (src[y][x-1] == color) && (dest[y][x-1] != color)
   term = 1
   stk.push(x)
   stk.push(y)
   stk.push(term)
   x = x - 1
   term = 0
   next
  end
577NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/05(火) 07:31:53.09ID:FnNfbNzM
  #下
  if (term < 3) && (src[y+1][x] == color) && (dest[y+1][x] != color)
   term = 2
   stk.push(x)
   stk.push(y)
   stk.push(term)
   y = y + 1
   term = 0
   next
  end
  #右
  if (term < 4) && (src[y][x+1] == color) && (dest[y][x+1] != color)
   term = 3
   stk.push(x)
   stk.push(y)
   stk.push(term)
   x = x + 1
   term = 0
   next
  end
  term = stk.pop()
  y = stk.pop()
  x = stk.pop()
 end
end
578NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/05(火) 07:34:06.45ID:FnNfbNzM
再帰関数を無理矢理ループで書くことが
正解だなんてとても思えないんだけど・・・
579NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/05(火) 07:57:54.39ID:FnNfbNzM
>>575-577
はdestにcolorが最初から使われていると、それ以上塗れないバグがあるな
ま、いいか
580NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/05(火) 08:01:46.66ID:FnNfbNzM
destはコピー先だからそういう条件でクリア済みってことで
581NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/05(火) 08:14:57.62ID:FnNfbNzM
2色必要だった・・・
srcのx,yからcolor2の連続部分をdestにcolor1で塗りつぶし
#同色上書き塗りつぶし
def refill(dest,src,x,y,color1,color2,minx,miny,maxx,maxy)
 if (x < minx) || (maxx < x) ||(y < miny) || (maxy < y)
  return
 end
 dest[y][x] = color1
 #上
 if (src[y-1][x] == color2) && (dest[y-1][x] != color1)
  refill(dest,src,x,y-1,color1,color2,minx,miny,maxx,maxy)
 end
 #左
 if (src[y][x-1] == color2) && (dest[y][x-1] != color1)
  refill(dest,src,x-1,y,color1,color2,minx,miny,maxx,maxy)
 end
 #下
 if (src[y+1][x] == color2) && (dest[y+1][x] != color1)
  refill(dest,src,x,y+1,color1,color2,minx,miny,maxx,maxy)
 end
 #右
 if (src[y][x+1] == color2) && (dest[y][x+1] != color1)
  refill(dest,src,x+1,y,color1,color2,minx,miny,maxx,maxy)
 end
end
582NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/05(火) 08:16:57.10ID:FnNfbNzM
>>576-577
も同様に直してね
583NAS6 ◆n3AmnVhjwc
垢版 |
2016/01/05(火) 08:48:45.20ID:FnNfbNzM
recHoge2(term,arg1...argn){
 dobefore(arg1...argn);
 if(term)recHoge2(term,arg1...argn);
 doafter(arg1...argn);
}
この↑再帰関数を無理矢理
loopHoge2(term,arg1...argn){
 while(term){
  pushargstack(arg1...argn);
  dobefore(arg1...argn);
  if(term){continue;}
  popargstack(arg1...argn);
  doafter(arg1...argn);
 }
}
ループで書くのはpushargstack()popargstack()書くのもだし
再帰関数でreturnされた時の箇所で
制御をdoafter()に飛ばすように考えるのもめんどくさい
つまり、再帰関数の構造化の部分までなんでわざわざ
コーディングする必要があるのか謎
2016/01/05(火) 23:45:47.40ID:zRwuHMxA
そうだね、グリーンだね。

任意の再帰はスタックを使えばループに書き直せるし、任意のループは末尾再帰で書き表せるけど
書きやすい方で書いたら良いんじゃない?
配列を舐めるだけのループをわざわざ再帰で書く必要はないし、
二分木を舐めるだけの再帰をわざわざループで書く必要はない。
勿論例外は幾つもあるけどね。
2016/01/06(水) 01:13:15.45ID:kZN9AhFE
死ね → NAS6 ◆n3AmnVhjw
レスを投稿する

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

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