为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
繁花不似锦 2023-04-02 18:14:04
(一开始dep=1,y=1)procedure search(dep,y,tot:longint);beginif tot<0 then exit;if sum[dep,y]<tot then exit;if tot=0 thenbegincheck;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);beginif e[t]=0 then exitelsebeginwrite(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; ,谢谢了beginrepeatwrite('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.
查看完整描述

1 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

我对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),原理同上,当没有孩子时退出。
再说下我的感受,其实简单递归是很好理解的,也很好写,但是递归中有难题是非常繁琐的,递归的思想还是很重要的,建议先从简单的递归学起,抓住要害,再向高级递归前进


查看完整回答
反对 回复 2023-04-05
  • 1 回答
  • 0 关注
  • 136 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信