汉塔执行过程详解及执行流程动态演示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汉塔执行过程详解及执行流程动态演示
作者:郭亚庆赵源
来源:《硅谷》2013年第02期
摘要:递归调用的实质是返回地址及参数不断进栈过程,分析时注意形参与实参的结合,若是变参不在重新分配内存单元,若是值参重新分配内存单元,登记该变量在本层的实际值,返回时应使用本层原来保留的参数值。
关键词:递归;堆栈;动态演示
1 递归的基本思想
递归是在调用一个函数的过程中又出现直接或间接调用该函数的本身,或者说递归是从需求函数的本身出发,逐次上溯到调用其本身的求解过程,一直达到递归的边界条件。
递归算法清晰简练、易读,但要讲清楚递归的执行过程,让学生能够掌握递归的实质以及揭示递归与堆栈的内在联系,却不是一件很容易的事。
3 执行流程图分析
为了讲清执行过程,依据上述算法在屏幕上画出执行流程图,因屏幕关系,以园盘个数3为例,在设计时,我们分层画出每层的语句图。
把首次调用递归程序的语句设为0层,由它进入递归子程序,并设为第一层,在递归子程序内由30,50语句各调用自身两次,分别设为第二层和第三层。
并画出每层的语句图,屏幕从左到右,分别为0层、1层、2层、3层,在0层仅有一个hanoi N, 1, 2, 3语句框图,执行过程详细框图见图1。
图中的h(n,a,c,b)为hanoi N- 1, A, C B的缩写。
4 递归程序执行前分析
递归过程的实质是循环执行递归过程中递归调用语句前的几个语句,每次执行递归调用语句时将返回地址及实参的值进栈保留,调用时注意形参与实参的结合。
若是变参不在重新分配内存单元,若是值参(如本例中的N,A,B,C)每调用一次都给N,A,B,C变量重新分配内存单元,登记该变量在本层的实际值,当我们单击调用递归按钮时,0层便开始调用递归程序,实参N(设N=3),1,2,3分别分别传送给形参N,A,B,C。
这时返回地址FH及N,A,B,C对应的实参值进栈,当N不为1时,在第一层用30语句hanoi N - 1, A, C, B (实际用2,1,3,2)再调用,进入第二层,N又不为1,再用30语句hanoi N - 1, A, C,B(实际用1,1,2,3)调用,进入第三层满足N=1时,则执行20:A->C,这时对初学者来说往往找不到A,C的实际值,而无法写出源柱和目标柱。
有了流程图,我们只看上层调用时的A,C的实际值,便一目了然。
执行完20语句后,遇到60 END SUB 语句,返回第二层,又执行40 A->C,这时的A,C值仍然只看上层调用时的A,C值。
5 汉诺塔问题执行祥解动态演示
为了验证分析结果,本人开发了汉诺塔问题执行详解动态演示程序,执行该程序,首先在屏幕上显示上面的图1,然后点击图1中的第0层“调用递归按钮”时,便执行第0层中的“H (3,1,2,3)”,此时该语句便涂上黄色,同时屏幕中央显示对话框,提示是否继续,单击“是”,这时图1中第0层与图1中第1层之间的调用箭头便涂上红色,表示程序即将转入第1层,这时屏幕中央又显示对话框,提示是否继续,单击“是”,我们将看到图1中第1层“10 IF N=3 1直接调用自身”标签框涂上绿色,当我们继续,单击对话框中提示是否继续中的“是”时,程序会按照图1调用次序依序执行。
它生动而直观显示了执行步骤,调用层次及每层参数的变化和返回时的路径,当遇到执行A->C语句时,根据上层调用的参数,很方便地写出执行结果。
动态演示程序是在上述屏幕流程图的基础上依次按递归算法单步执行各语句,并以不同颜色显示出执行结果。
参考文献:
[1]龚沛曾,VISUAL BASIC程序设计简明教程,高教出版社.
[2]刘炳文,精通VISUAL BASIC6.0中文版,电子工业出版社.。