- ベストアンサー
再帰呼び出しになってしまうのをループの形にしたい
VBで繰り返して実行するプログラムを作ったのですが、 スタック領域をオーバーしてしまいます。 再帰呼び出しになっているのはわかったのですが、 改善ができません。 簡略したら下記のような状態でした。 Sub test1() test2 End Sub Sub test2() test1 End Sub このtest1を実行して、繰り返し作動するようにしたのですが、 当然スタックオーバーフローになります。 簡単にループに変形できるのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
DO WHILE(条件) CALL test1() LOOP Sub test1() CALL test2 End Sub Sub test2() 処理 End sub でよいのではないでしょうか?
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
文系(経理など)課題では余り出てこないことなので、自信はありませんが http://www2.cc.niigata-u.ac.jp/~takeuchi/tbasic/BackGround/Recursive.html を参考に言いますと 質問のTest2というような大雑束なプロシージャのことでなく、再帰をさせるコア処理のところに注目する必要が有ると思う。 下記は数の処理のようなことが多いので参考にしにくいかもしれないが Function Kaijyou(n) F = 1 For i = 1 To n F = F * i Next i Kaijyou = F End Function ーーーー Sub test01() MsgBox Kaijyou(5) End Sub ーーーー Function Fib(n) If ((n = 1) Or (n = 2)) Then Fib = 1 Else Fib = Fib(n - 1) + Fib(n - 2) End If End Function ーーーーー Sub test02() MsgBox Fib(8) End Sub ーーーーーー Function con(n) For i = 1 To n con = con & i Next i End Function ーーーー Sub test03() MsgBox con(8) End Sub のように (1)処理の中で、左辺に「代入される関数名が単独で」がありと、その右辺にも「関数名を使った加工式」がある。 これによって1段階前の状態と、現在の状態がつながる。 (2)無限ループにならないよう、合理的な終了条件が処理の中に かならず入っている。 この2条件を満たすように組めばよいと思う。 ただし上例のような1変数で数値を決める者でなく、文系の処理の場合は、どういう例なのか、何も言わないで質問者は>VBで繰り返して実行するプログラムを作ったのですが、といっていて良くわからない。 再帰にしないために下記にしてみた。 何かの参考になれば。 Public m Public m1, m2 を使って Function Kaijyou2(n) For i = 1 To n m = m * i Next i Kaijyou2 = m End Function ーーー Sub test011() m = 1 MsgBox Kaijyou2(6) End Sub ーーー Function Fib2(n) For i = 1 To n - 2 m = m1 + m2 m2 = m1 m1 = m Next i Fib2 = m End Function ーーー Sub test021() m1 = 1: m2 = 1 MsgBox Fib2(8) End Sub ーーー Function con2(n) For i = 1 To n m = m & i Next i con2 = m End Function ーーー Sub test031() MsgBox con2(8) End Sub
- D-Matsu
- ベストアンサー率45% (1080/2394)
スタックオーバーフローするほど再帰するのは離脱条件が間違ってて無限再帰してるんじゃないかという気がしますが。 ループに置き換えることを考えるより先にそちらをチェックしてみては?
- redfox63
- ベストアンサー率71% (1325/1856)
どのように実行したいのかを具体化しましょう お示しのソースではTest1/Test2をどのように実行したいのかが判断できません ある回数だけTest1/Test2を実行したい 条件が満たされるまでTest1もしくはTest2お実行したい ・・・ ある条件も提示 このTest1/Test2の他にMainループがあるのでしょうか
お礼
具体的なコードありがとうございます。 基本的に教えていただいたコードの流れで構築し、 Do untilで無限ループで実行することができました。