很久以前我在CSDN上看到一篇文章,是講在C下實作面向對象的,寫的很經典,但是當時我還沒有能力看懂那篇文章。但是它依然給了我很多啟發-----真正的高手是不會也不應該受一門語言的限制的!高手可以在C下實作類,當然也應該在BASIC下實作遞歸----(是在誇我自己呢)。這個程式是在GVBASIC下運作的。這是我最開始學習的一門程式設計語言--在這之前學校裡教過QBASIC,可惜我沒有認真學---後來突然對在文曲星上寫程式産生了興趣,又把那本QBASIC書拿出來看~~~
後來我用GVBASIC在文曲星上寫一個遊戲,那個時候就讓我感受到:一門語言好的文法能夠決定你寫程式的難易程度---這是對初學者而言,對于高手,這些就根本不存在~~~當我學了C以後,我再在文曲星上用GVBASIC的時候,我發現我開始遵循結構化的程式設計,它使的我非常輕松!
對于遞歸,一直以來我都會用循環去代替它--也許是因為我是從BASIC開始的,是以感覺上對于遞歸不怎麼喜歡。但是當我接觸到越來越多的算法的時候,我發現遞歸是如此的重要!
于是我利用棧資料結構以及在C下函數調用的原理,在BASIC下實作了模拟遞歸!這個過程花費了我一個小時的時間!除此以外,由于在BASIC下沒有指針的概念(在GVBASIC下也沒有配置設定記憶體的一些函數--在VB下可以用一些API函數來配置設定記憶體而實作指針),是以連結清單也無法使用,但是我們也可以模拟出來~---當然對于這個例子而言,這個模拟過程又要複雜一些!
以下是代碼:
PRINTT "在BASIC下實作遞歸"
PRINTT "一個求階乘的例子"
PRINT "Kevin Lynx 2006.1.3"
REM int GetN(int n)
REM {
REM if(n==1) return 1;
REM return n*GetN(n-1);
REM }
P=-1
SIZE=255
DIME S(SIZE)
GOTO 250
REM push stack sub
P=P+1
IF P>254 THEN PRINT "棧溢出":END
S(P)=PARAM
RETURN
REM pop stack sub
IF P<0 THEN 230
PARAM=S(P)
P=P-1
230:
RETURN
250:
PRINT "輸入一個正整數";
INPUT "";N
IF N<1 THEN 250
GOUSB 310
GOTO 440
300:
REM GetN
310:
IF N=1 THEN 390
REM before call itself ,push stack first
PARAM=N
GOSUB 140
REM and now can call itself
N=N-1
GOSUB 310
REM pop stack now
GOSUB 200
N=N*PARAM
PARAM=1
REM return now
RETURN
440:
PRINT "Result=";N