なあ、再帰関数好きな人いる? パート3 [転載禁止]©2ch.net (914レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
548: NAS6 ◆n3AmnVhjwc [] 2016/01/04(月) 17:38:28.00 ID:7uWOp/tU(1/14) AAS
つか、末尾再帰ってループそのまんまで再帰の利点ないし

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()...
 }
}
再帰で有意味、この場合使える
549: NAS6 ◆n3AmnVhjwc [] 2016/01/04(月) 17:44:32.72 ID:7uWOp/tU(2/14) AAS
pop,push逆だった
loopHoge2(a,n,arg...){
 while(a<n){
  popargstack();
  dobefore()...
  pushargstack();
  doafter()...
 }
}
550: NAS6 ◆n3AmnVhjwc [] 2016/01/04(月) 18:00:09.14 ID:7uWOp/tU(3/14) AAS
pushargstack();
popargstack();
ユーザー定義のこれらはめんどくさいから
再帰関数使ってコンパイラ任せにするよ
552
(1): NAS6 ◆n3AmnVhjwc [] 2016/01/04(月) 18:16:50.81 ID:7uWOp/tU(4/14) AAS
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();
ユーザー定義のこれらはめんどくさいから、再帰関数使ってコンパイラ任せにするよ
たったこれだけの内容
553: NAS6 ◆n3AmnVhjwc [] 2016/01/04(月) 18:19:28.48 ID:7uWOp/tU(5/14) AAS
>>551
>>552
以上のことの何があるか説明してみてよ
554
(1): NAS6 ◆n3AmnVhjwc [] 2016/01/04(月) 18:42:48.29 ID:7uWOp/tU(6/14) AAS
http://nas6.main.jp/Maze.cpp

再帰、ループ、等価迷路
555: NAS6 ◆n3AmnVhjwc [] 2016/01/04(月) 18:55:15.40 ID:7uWOp/tU(7/14) AAS
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();
ユーザー定義のこれらはめんどくさいから、再帰関数使ってコンパイラ任せにするよ
たったこれだけの内容 、勘違い訂正
556: NAS6 ◆n3AmnVhjwc [] 2016/01/04(月) 19:03:49.25 ID:7uWOp/tU(8/14) AAS
>>554で、
ループ実装が好きなやつはいないと思うんだけどな
558: NAS6 ◆n3AmnVhjwc [] 2016/01/04(月) 21:51:32.16 ID:7uWOp/tU(9/14) AAS
「{C++規則をかなり抑えてCライク}で書かれたソースコード」
のクロスランゲッジなんて、ほぼ、ライブラリの関数名を書き換えるだけだろ
559
(1): NAS6 ◆n3AmnVhjwc [] 2016/01/04(月) 21:54:46.92 ID:7uWOp/tU(10/14) AAS
あ、あと制御構文もちゃっちゃっと書き換えれば出来上がり
566: NAS6 ◆n3AmnVhjwc [] 2016/01/04(月) 23:00:49.51 ID:7uWOp/tU(11/14) AAS
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
567: NAS6 ◆n3AmnVhjwc [] 2016/01/04(月) 23:01:55.35 ID:7uWOp/tU(12/14) AAS
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
568
(1): NAS6 ◆n3AmnVhjwc [] 2016/01/04(月) 23:07:46.09 ID:7uWOp/tU(13/14) AAS
def recHoge2(term,arg...)
 dobefore(arg...)
 if term
  recHoge2(term,arg...)
 end
 doafter(arg...)
end

で、こんだけで済むのに、
ループにしたいからって
スタックのユーザー定義なんて馬鹿だろう
569
(1): NAS6 ◆n3AmnVhjwc [] 2016/01/04(月) 23:22:49.68 ID:7uWOp/tU(14/14) AAS
再帰をループにしたかったら
こういうのをいちいち作らなきゃだめだよ
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
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.032s