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 0567NAS6 ◆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 0568NAS6 ◆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
で、こんだけで済むのに、 ループにしたいからって スタックのユーザー定義なんて馬鹿だろう 0569NAS6 ◆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 0570uy ◆Qawu9.2l1E 2016/01/05(火) 02:57:13.31ID:/kPL7pQm プログラミング半年目くらいだろうかコイツは 多く見積もって1年半 それ以上なら今すぐPC捨てたほうが良いレベル 0571デフォルトの名無しさん2016/01/05(火) 02:58:35.02ID:3cj4CitF>>569
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 0574NAS6 ◆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 0575NAS6 ◆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
↑のループ等価が↓ 0576NAS6 ◆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 0577NAS6 ◆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 0578NAS6 ◆n3AmnVhjwc 2016/01/05(火) 07:34:06.45ID:FnNfbNzM 再帰関数を無理矢理ループで書くことが 正解だなんてとても思えないんだけど・・・ 0579NAS6 ◆n3AmnVhjwc 2016/01/05(火) 07:57:54.39ID:FnNfbNzM>>575-577 はdestにcolorが最初から使われていると、それ以上塗れないバグがあるな ま、いいか 0580NAS6 ◆n3AmnVhjwc 2016/01/05(火) 08:01:46.66ID:FnNfbNzM destはコピー先だからそういう条件でクリア済みってことで 0581NAS6 ◆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 0582NAS6 ◆n3AmnVhjwc 2016/01/05(火) 08:16:57.10ID:FnNfbNzM>>576-577 も同様に直してね 0583NAS6 ◆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()に飛ばすように考えるのもめんどくさい つまり、再帰関数の構造化の部分までなんでわざわざ コーディングする必要があるのか謎 0584デフォルトの名無しさん2016/01/05(火) 23:45:47.40ID:zRwuHMxA そうだね、グリーンだね。