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