猿问

我是学PASCAL的,关于递归,很多时候看到就比较晕,如下所示的情况

(一开始dep=1,y=1)
procedure search(dep,y,tot:longint);
begin
if tot<0 then exit;
if sum[dep,y]<tot then exit;
if tot=0 then
begin
check;
exit;
end;
if dep>5 then exit;
if y=5 then search(dep+1,1,tot)
else search(dep,y+1,tot);
map[dep,y]:=true;
if y=5 then search(dep+1,1,tot-1)
else search(dep,y+1,tot-1);
map[dep,y]:=false;
end;
这里的第一个递归:
if y=5 then search(dep+1,1,tot)
else search(dep,y+1,tot);
map[dep,y]:=true;
当你开始search(dep,y+1,tot)后,后面的
map[dep,y]:=true;
还要执行么,如果要,这是执行的dep和y的值会是原来的值(dep,y),还是现在的值(dep,y+1),如果是(dep,y+1)话,是每递归一次就执行一次map[dep,y]:=true;还是等到y=5再执行这一步呢,我希望得到详细的解释,谢谢了!最好是每一步是什么样,都能做出具体的解和解释,谢谢了!
如果不行的话,可以解释一下这个程序,这个会比较完整例1.用顺序存储方式建立一棵有31个结点的满二叉树,并对其进行先序遍历。
program erchashu1;
var b:array[1..31] of char;
e:array[1..63] of byte;
n,h,i,k:integer;
procedure tree(t:integer);
begin
if e[t]=0 then exit
else
begin
write(b[t]);e[t]:=0;
t:=2*t;tree(t);(也是在这里出问题,不太懂,当t=2是,tree(t)是不是
t:=t+1;tree(t); 会一直递归下去,然后再执行t:=t+1,但这时肯定会过
end; ,我知道我说的不太对,请您以当N=3时一步一步解释
end; ,谢谢了
begin
repeat
write('n=');readln(n);
until (n>0) and (n<6);
fillchar(e,sizeof(e),0);
k:=trunc(exp(n*ln(2)))-1;
for i:=1 to k do e[i]:=1;
for i:=1 to 26 do b[i]:=chr(64+i);
for i:=1 to 5 do b[26+i]:=chr(48+i);
h:=1 ;tree(h);
writeln;
end.

繁花不似锦
浏览 157回答 1
1回答

ABOUTYOU

我对PASCAL语言了解不太多,所以回答的可能有点问题,凑合着看吧,呵呵第一题:map[dep,y]:=true;是执行原来的y值,因为search()的参数为形参,是传值的,所以函数结束后不会改变参数的值,第二题:二叉树的PASCAL语言表示我没看过,就浅浅的分析一下吧,当t=2时,执行t=t*2,就是就是寻找左孩子,执行tree(t),这时当然不会一直递归下去,因为tree()函数中有这样一条语句if e[t]=0 then exit;当t达到上限时,就没有节点了,这就保证了递归会及时的退出(当没有孩子时)。找完左孩子,再找右孩子,t:=t+1;tree(t),原理同上,当没有孩子时退出。再说下我的感受,其实简单递归是很好理解的,也很好写,但是递归中有难题是非常繁琐的,递归的思想还是很重要的,建议先从简单的递归学起,抓住要害,再向高级递归前进
随时随地看视频慕课网APP
我要回答