关于C语言中递归语句的执行顺序,困惑! (20分)

娃娃

Unregistered / Unconfirmed
GUEST, unregistred user!
请先看如下代码:
void InOrder(BinTree T)
{ ① if(T) { // 如果二叉树非空
② InOrder(T->lchild);
③ printf("%c",T->data); // 访问结点
④ InOrder(T->rchild);
⑤ }
⑥ } // InOrder
这里执行到第②句的时候,程序的流程是如何的?
是直接中止当前的执行进入下一次递归,还是一边进入下次递归,一边继续执行下面的代码?第④句也是同样。
如果是中止当前运行,那这段程序好象是无解啊,可以想象,只要“二叉树非空”,那
printf("%c",T->data);
就总是执行不了?但是如果“二叉树空”又什么代码也不会执行?
如果是继续执行,那会是个什么情况呢?
到第②句的时候就开始了新的递归运行,而这个递归也还在继续,如何同步的?线程?!
 
是先序算法吧,执行2的时候进入本次递归,不执行下面的语句
把执行过程看成3个阶段,若整个二叉树空则跳出这个函数
若非空,则对左树进行先序,若空则输入这个节点,否则继续先序
楼主最重要的是将树堪称只有3个节点的二叉树,然后仔细分析。2001年我考中程的时候下午试题就是递归,头都大了。
 
和普通的调用过程一样 ,是暂停(中止,注意不是停止)当前函数,
转而去执行 子函数 ,等子函数执行完 ,才接着执行本函数下面的语句
而在子函数里面是相同的情况。。遵循一样的规律。。。
 
当 调用 一个 子函数 ,那个子函数没返回 的时候 ,
当前的 过程或函数 是停止的 , 一直到子函数返回, 才 接着 执行下面的语句。
递归 特殊的地方 就是 自己调用自己 , 但是 规则 与 往常一样 。
 
谢谢大家
 
版主不解决问题,我就要猛灌了,我也没办法。

楼主对不起,我不能提问,借用一下。

来自:lear_ner, 时间:2004-5-16 21:51:50, ID:2613149 | 编辑
我注册多天不见有回信(确认码)?也见很多同仁反应类似情况,不知大富翁的人(各位负责人)是吃什么饭的,怎么都不管呢? 像这样的破论坛不上也罢。

================================================================
游戏规则 免费注册 资料下载 关于本站
问题分类 问题列表 富翁列表 我的信息 提出问题 在线富翁 富翁日历 笔记列表 我的笔记 写作笔记 全文检索
请确认帐号
--------------------------------------------------------------------------------

富翁名称: lear_ner
专 家 分: 0
可用积分: 200
退出论坛

--------------------------------------------------------------------------------
友站直通车 !

管理我的信息
富翁之家模板
聊天室记事本
我的待答问题
我的已答问题
我收藏的问题
我参与的问题
查关键词
检索LID
--------------------------------------------------------------------------------
支持我们
--------------------------------------------------------------------------------
大富翁论坛版权所有
问题:给本论坛页面“/delphibbs/listq.asp”评论和建议。 ( 积分:0, 回复:28, 阅读:501 )
分类:建议和意见 ( 版主:g622, luyear )
来自:System, 时间:2004-1-18 12:53:00, ID:2418024 [显示:小字体 | 大字体]
大家好,请大家给这个页面(/delphibbs/listq.asp)一点建议和评价,我们会根据这些建议逐步改善系统。 谢谢大家的支持

来自:011101, 时间:2004-1-18 14:49:00, ID:2418198
字体在偶電腦上變大了.
如:
http://218.247.199.234/~photopub/user_3153ea34f8d7bae2d814f727f0b09843/bilder/photos_01/photo_0103.jpg

来自:帮帮我, 时间:2004-1-18 14:53:00, ID:2418209
评价不敢说,借此说个谢谢。
对我帮助很大

来自:app2001, 时间:2004-1-18 15:15:00, ID:2418241
如果在个人的待答、已答、收藏、参与问题及回答别人已结贴的贴子里都能使用上排序及查询功能,就太好了!

来自:恒子, 时间:2004-1-18 15:18:00, ID:2418249
评价不敢说,借此说个谢谢。
对我帮助很大

来自:纯粹新手, 时间:2004-1-18 15:30:00, ID:2418263
listq.asp,说页面有错误,不能搜索,真急人

来自:renyi, 时间:2004-1-18 21:33:00, ID:2418756
大富翁是我见过的最好的技术论坛,但主要讨论Delphi,我想,很多高手都转向Java 或.Net了
这怎么办?


来自:wind8bell, 时间:2004-1-18 22:51:00, ID:2418798
为什么我参与的贴子在结贴后就不见了?能不能方便的找到啊?

来自:jobsxy, 时间:2004-1-19 1:39:00, ID:2418864
分版主应负起责任来,清理各自辖区的未结帖子,有许多帖子,明明已经有了明确的答案,可提问者就是不结帖,而且相当多一部分并没有消失,还时不时地光临论坛,这样对回答者是很大的挫折。
建议:
1、规定每位提问者最多只能有15个待答帖,超过则只能浏览不能提问;凡提问帖最后回复期超过一年,则提问者登录后,将定时弹出对话框,提醒结帖。
2、对于超期注册用户,比如一年以上未登隶者,并给予删除,并将其下未结帖子由分坛主根据所答质量进行分配,暂无结果的,扣除一半的分数,其余分配给回答者。
3、专家分应翻倍给予回答者,以鼓励助人精神,同时给予初学者获得专家分的机会,比如转载优秀的文章、翻译作品、资源链接等等。
2、我们经常看到许多已答回题,其实提问者并没有得到正确答案,或答案的质量不高,这样的帖主往往对所有参与者平均分配,这对浏览的人来说是一种浪费和负担。所以我建议,应允许提问者对所解问题进行满意度打分,10分为最为满意,5分以下为不满意但因种种原因只好结帖,这样做,我们在做离线浏览器时,就可以在相同的N个问题中,挑选满意值最高的看,节省不少时间。

来自:mzr, 时间:2004-1-19 8:57:00, ID:2418940
最好能显示富翁的联系方式如Email

来自:archonwang, 时间:2004-1-19 9:07:00, ID:2418963
很想有个笔记搜索功能啊~免得我翻来覆去地找,挺好的。
对于超期注册用户,比如半年以上未登隶者(或非特殊情况),并给予删除,并将其下未结帖子由分坛主根据所答质量进行分配,暂无结果的,扣除一半的分数,其余分配给回答者。
这也是个办法。不过对版主不是什么好消息,如果每天都要清除这些个问题,工作量式非常巨大地。
另外,个人不太鼓励使用问题满意度分级,每个人有每个人看法和观点,一个问题地好坏不是由我们所能决定地。所以不推荐。

来自:mmzmagic, 时间:2004-1-19 9:32:00, ID:2419012
我想这里有大半人都喜欢游戏也想写游戏吧,坛主能不能加个游戏的讨论区呢?
评价不敢说,在此说个谢谢。
对我帮助非常大。

来自:yczjs, 时间:2004-1-20 10:29:00, ID:2420170
官方定期发布离线数据包,Access格式的
偶也来吼吼![:D]

来自:阿锋, 时间:2004-1-20 12:16:00, ID:2420282
查找功能有点问题

来自:njcliff, 时间:2004-1-26 21:35:00, ID:2423178
非常高兴有这样一个好的论坛。

来自:||||||||bbw||||||||, 时间:2004-1-27 13:45:00, ID:2423577
像以前一样可以删账号啦

来自:Dusy, 时间:2004-1-28 19:09:00, ID:2424733
全文检索功能总是出问题!!又不好使了!!!

来自:2days, 时间:2004-1-29 15:06:00, ID:2425624
全文搜索,还有,贴子列表处加搜索,笔记加搜索。。。

来自:htw, 时间:2004-1-30 8:57:00, ID:2426407
按阅读次数, 回复次数或积分值方式搜索功能不能用
好象不能用有很长一段时间了

来自:mdasky, 时间:2004-2-3 17:30:00, ID:2434091
[blue]头脑风暴MDA使你面临重大选择[/blue]

头脑风暴 ----- MDA 使你面临重大选择 ------ foxcrane谈MDA
今天我们谈谈MDA和企业应用
问: 请谈谈MDA真的能不用写一行代码么
答: 全部自动生成?可执行模型?是永远的梦?!是的,永远的梦,不要指望一行代码不写,MDA工具提供一个功能扩展脚本的编辑器是非常必要的, 为什么FLASH提供脚本语言支持?
可从另一个角度讲,企业应用更多时候是做的仅是一个DB的壳(shell)而已,所以还是很容易的实现MDA的
EJB部署?IDL?WEB SERIVCE?全部可以生成
问:据说现在的计算机人员很缺乏,随着计算机的发展和普及计算机人才会更抢手
答:
现在大量的DB加壳人员是一个非正常现象,MDA将使一切变的正常,而程序员们将面临者前所未有的选择,国内很多硕士在做编码工作,在给DB加壳,哈哈,很是有趣
问:你的意思是说,将来企业应用系统,将不用很多的计算机本科生,研究生了么
答: 使用MDA开发,将有领域专家(DOMAIN EXPERT)和模型分析(学院派的OOA专家)以及翻译人员(翻译人员的工作就是将领域专家做的东西描述成机器能理解的模型语言)
比如:原来是50万个职位,现在只需要10万计算机中级人才,甚至更少,你认为将会发生什么?
问:恩,技术要求会提高并且待遇降低, 那我们现在的程序员该做些什么呢?
答: MDA之前,有几个选择
一、深入了解业务,将来使用MDA做业务模型
二、学习MDA实现思想,将来开发MDA工具
三、转行, 做游戏,手机之类(不过也都有引擎啊,建模之类的工具)
问:有的人研究J2EE设计模式和各种FRameWORK,希望将来能成为架构设计师,在MDA时代,架构师将是一个什么样的角色?
答:MDA和具体的语言无关,无论你是J2EE还是。NET,还是什么,所有语言相关的东西,将成为编译器级的问题,也就是说,整个地球上有一两个专家搞好了架构,别的人只要选择一下就可以了
问:现在需要学习MDA么?
答: 工具只会使你的开发变的更简单,MDA工具非常简单,使用MDA技术含量极低,用的时候再学即可
如果你还想做技术,那么你的选择是开发MDA工具本身,或是研究中间件,或是架构设计,或是转行
即使是5年、8年后才能MDA,但我想你不希望在你工作了5年、8年后,以前的经验再没有用处,一切从头再来把
人生能够输几次?!?!
能有几次可以选择?!?
问:好,今天我们就到这里吧,谢谢foxcrane
mdasky的想法:
抛砖引玉,希望大家都发表一下自己的见解。
个人认为MDA其实就是倡导一种将创造性思维转化为精确的模型,让开发人员从繁琐的重复的低级劳动中解脱出来,去关注更多的业务逻辑层面。因此,提出软件蓝领失业的想法就不足为奇了。
但是这种提升程序员层次的想法早就提出来了,已经发展了一段时间,但是效果并不好。为什么?因为不可能要求所有的程序员都以软件架构师的战略性眼光去看....
来自:www.Mdasky.com



来自:qyxsd, 时间:2004-2-26 14:15:13, ID:2471984
为什么查询老是查不到东西?

来自:zjy2004, 时间:2004-2-26 15:12:31, ID:2472130
我怎么看不懂这个论坛怎么用呢,

来自:sql_my, 时间:2004-3-5 17:48:59, ID:2487074
大富翁论坛的好几项查询有问题,能不能维修一下,在此表示感谢;大富翁论坛可以说是
最好的论坛!

来自:unregister, 时间:2004-3-29 15:43:03, ID:2528132
我毕业就全靠这里了!谢谢


来自:wenkie, 时间:2004-4-7 11:49:26, ID:2544557
为什么我不能发表信息呢


来自:wenkie, 时间:2004-4-7 11:50:34, ID:2544561
我看不见问题的文字呀,叫我如何回答问题呢,哎,不知道是什么原因

来自:雨中飘, 时间:2004-4-15 8:34:51, ID:2559881
我想提问,但不知道在什么地方提问?

来自:xiexiebangmang, 时间:2004-5-13 11:01:20, ID:2607524
上午注册,可是现在还没有收到信,郁闷呢。

来自:lear_ner, 时间:2004-5-16 21:51:50, ID:2613149 | 编辑
我注册多天不见有回信(确认码)?也见很多同仁反应类似情况,不知大富翁的人(各位负责人)是吃什么饭的,怎么都不管呢? 像这样的破论坛不上也罢。
 
娃娃 以前您那个回查日报表的问题是怎么解决的啊?
 
其实到最后也没能解决。
最后就是日报表生成,月报表保存,年报表根据月报表生成。
不过把操作限制的很死(因为生成以往的月报表代价很大@_@)
 
正好一网友问我树的一些问题 我写了点示范代码 贴出来吧 参考。。其实很简单的
//数据结构
Type
node = record
name : string;
//名称,实际使用中是储存有用的数据
root : integer;
//父结点指针,0代表空
left : integer;
//左孩子结点,0代表空
right: integer;
//右孩子结点,0代表空
end;
//======简单起见 树的结构如下
A
/ /
B C
/ / /
D E F
//=================在node数组里面表示为
name root left right
A 0 2 3
B 1 4 5
C 1 0 6
D 2 0 0
E 2 0 0
F 3 0 0
//写成pascal代码
Tree : array[1..6] of Node;
Tree[1].name:='A';
Tree[1].root:=0;
//无
Tree[1].left:=2;
Tree[1].right:=3;
//========================
Tree[2].name:='B';
Tree[2].root:=1;
//无
Tree[2].left:=4;
Tree[2].right:=5;
//========================
Tree[3].name:='C';
Tree[3].root:=1;
//无
Tree[3].left:=0;
Tree[3].right:=6;
//========================
Tree[4].name:='D';
Tree[4].root:=2;
//无
Tree[4].left:=0;
Tree[4].right:=0;
//========================
Tree[5].name:='E';
Tree[5].root:=2;
//无
Tree[5].left:=0;
Tree[5].right:=0;
//========================
Tree[6].name:='F';
Tree[6].root:=3;
//无
Tree[6].left:=0;
Tree[6].right:=0;
//========================
//先根遍历
procedure fun(p:integer);
begin
showmessage(Tree[p].name);
if Tree[p].left<>0 then
fun(Tree[p].left);
if Tree[p].right<>0 then
fun(Tree[p].right);
end;

//求某结点在多少层
function fun2(P:integer):integer;
begin
Result:=1;
while Tree[p].root<>0do
begin
Result:=Result+1;
p:=Tree[p].root;
//上层
end;
end;
//====================
//demo for call
fun(1);
showmessage(inttostr(fun2(2)));
 
二叉树的中序遍历.
--这里执行到第②句的时候,程序的流程是如何的?
是直接中止当前的执行进入下一次递归,还是一边进入下次递归,一边继续执行下面的代码?第④句也是同样。
先进入下一次递归,执行完了后再返回往下执行3.(有返回是递归的必要条件)
--如果是继续执行,那会是个什么情况呢?
到第②句的时候就开始了新的递归运行,而这个递归也还在继续,如何同步的?线程?!
不存在同步,每一时刻只有一个函数在执行,返回后才会继续递归调用前的语句.这跟unix里的fork函数不是一回事.

--如果是中止当前运行,那这段程序好象是无解啊,可以想象,只要“二叉树非空”,那
printf("%c",T->data);
就总是执行不了?但是如果“二叉树空”又什么代码也不会执行?
树虽非空,但其左孩子总有到头的时候,那时候不就返回执行printf了嘛

 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部