通过实现字符串的正向输入逆向输出验证递归调用

虽然写出了代码,但一直没有明白其过程是如何实现的。

 1 program E_daoxu;
 2 procedure daoxu;
 3 var
 4   a:char;
 5 begin
 6      readln(a);
 7      if a<>'*' then
 8         daoxu;
 9      write(a);
10 end;
11 
12 begin
13   daoxu;
14   readln;
15 
16 end.      


后面再慢慢的分析,一步步的来吧。下面是在网上找到的一段代码,和我同样的问题:为什么不是到输入的a为‘*’时只输出‘*’,而是将所有的原来输入的字符全都输出,并且是倒序?

var    i,n:longint;   
 a:array[1..100]of longint;
procedure make(le:longint);
begin  
if le<n then make(le+1); 
 write(a[le],' ');
end;
BEGIN  
readln(n); 
 for i:=1 to n do read(a[i]);  
make(1);
END.

解释:不是这个样子的,if le<n then make(le+1) 因为是先有了这句话,所以在满足le<n的时候,这个程序会不断深入,直到le=n的时候,才会执行最里面的一个 write(a[le],' ');,然后在开始出归,出归的过程中会依次write(a[n]) write(a[n-1]).....

就好像你电脑里的某个盘里有一个write文件,一个make文件夹,make文件夹里还有一个make文件夹,一个make文件,这样子有n个文件夹,你依次打开,直到再也没有文件夹的时候,再打开里面的write文件,然后返回前一层文件夹,这样不断返回

这样子解释懂么= =

 

posted @ 2013-09-25 19:13  surfacetension  阅读(677)  评论(0编辑  收藏  举报