天天看點

在BASIC下實作遞歸

 很久以前我在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

繼續閱讀