子程序调用子程序被称为子程序的嵌套。由于子程序实现机理的不同,不同的编程语言对于子程序嵌套的层数有着不同的规定。汇编语言并不硬性限制子程序嵌套的层数,但是,由于子程序的调用和参数的传递一般都要消耗堆栈空间,子程序嵌套的层数受限于堆栈空间的大小,所以在设计程序的时候,子程序嵌套的层数不宜过多。
嵌套子程序在设计上没有什么特别的要求,需要注意的是各层子程序对寄存器和堆栈的使用。一方面最好在子程序入口处使用PUSH指令保存子程序中需要用到的寄存器,在子程序出口处再用POP语句将其恢复,以避免子程序之间在寄存器使用上的冲突。另一方面要注意堆栈的使用,PUSH指令和POP指令要成对出现,使用堆栈传递参数后子程序退出时一定要清理堆栈等。
嵌套子程序中还有一种特殊情况,就是一个子程序直接或间接地调用该子程序自身,被称作递归子程序。由于自然数本身的递归特性,很多函数的定义都采用的递归的形式,比如阶乘n!、Fibnacci数列F(n)、Hanoi塔H(n)等。解决这些问题时使用递归子程序可以使程序的设计简洁易读,是一种常用的程序设计方法。(www.xing528.com)
递归子程序又可以分成直接递归和间接递归两种。直接递归指的是一个子程序直接调用自身的递归子程序,前面介绍的FIBNACCI子程序就是直接递归。如果子程序A调用子程序B,子程序B再调用子程序A(或者更多的子程序参与这种递归调用过程),这种递归被称为间接递归。无论直接递归还是间接递归,递归子程序的参数传递一般都采用通过堆栈传递的方法,因而堆栈的使用是递归子程序设计需要特别注意的。另外,递归子程序设计时一定要注意递归边界的设计,以免无穷递归造成的逻辑错误和程序崩溃。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。