パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)

BASICで再帰呼び出しもどきをやってみる (準備中)

昔の旧BASICでは変数は大域変数だけだし、再帰呼び出しもできなかったわけですが、
GOSUBルーチンの多重化(GOSUBルーチンからGOSUBルーチンを呼び出す)は許されています。
RETRNで戻る番地(アドレス)はスタック領域に積まれていくようなので、
GOSUBルーチンの中からまた自分のルーチンをコールすることも一応OKなわけです。

ということで、BASICにおける再帰呼び出しもどきのプログラムを作ってみました。

やっていることは、与えられたnに対してn!を計算するというやつ(再帰プログラムの定番)です。

100〜120行がサブルーチンです。
n>1の時は110行でまた自分のサブルーチンを呼び出します(GOSUB100)


10 fact=1
20 input n
30 gosub 100
40 print n;":";fact
50 end
100 if n=1 then fact=fact*1:return
110 if n>1 then fact=n*fact:n=n-1:gosub 100
120 return

まあ、ちゃんと動いているようです。




ちなみに、C言語での再帰呼び出しについては、姉妹サイトに「再帰呼び出し」というページがありますので
ご参照下さい。

n!の計算を再帰呼び出しで計算するCのコードは以下の通りです。

unsigned long fact(n)
int n;
{
if (n == 0) return(1);
else return(n*fact(n-1));
}

BASICでは、n-1: GOSUB 行番号 としているところを
Cなら fact(n-1) と書けちゃうわけです。
再帰のコードで書くと洗練された感じがします。


実のところ、変数のスコープの違いもあり、上記のBASICとCのプログラムはかなり似て非なるもの
と言えます。
Cの場合は、計算はどんどん再帰コール(呼び出)していく過程ではなく、returnで戻ってくるときに行われます。
そんああたりをもう少し似せると次のようになります。gosubのコールから戻ってきた後に計算をしています。
それでも、再帰もどきには変わりありませんが
10 fact=1
20 input n
30 gosub 100
40 print n;":";fact
50 end
100 if n=1 then fact=fact*1:return
110 if n>1 then f(n)=n:n=n-1:gosub 100:n=n+1:fact=fact*f(n)
120 return


BASICには DEF FN() というユーザ定義関数を書く機能もありますが、
これはDEF FN() = 式
という形で1行の式しかかけないので、ちょっと再帰呼び出しには使えません。

10 DEF FNADD(n)=FNADD(n-1)+1
15 print FNADD(1)


こういうプログラムを走らせると、
当然のことながら永遠に自分を呼び出し続けてそのうち落ちます。




TOP PAGE >Basic活用研究目次