递归调用






在《数据结构与算法分析》一书中,举了一个简单的例子对递归做了解释。该例程可简述为:使用printOut(n)打印输出正整数,但是可用的I/O例程仅可处理打印单个数字,命名为printDigit,例如printDigit(4)输出4到终端。




各位亲 有时间可以去看看我的  “金骏家居淘宝店” http://jinjun1688.taobao.com/shop/view_shop.htm?tracelog=twddp 买时说明在我的博客看到有优惠哦 还有意外礼品赠送  真正的程序员淘宝店

打印整数的完整程序如下:

printOut( int n )
{
  if ( n>=10 )
    printOut( n/10 );

  printDigit( n%10 );

}

书中对为何使用递归有解释,此处不再赘述。

在此,仅对上述程序的整个调用流程做个大致描述。

以printOut(76234)为例,期望的结果应该是终端完整输出76234:

1. 递归过程。
调用printOut(76234),76234>=10,于是调用printOut(7623),同理printOut(7623)调用printOut(762),printOut(762)调用printOut(76),printOut(76)调用printOut(7)。当调用到printOut(7)时,if判断false,也就是说到达了基准条件,将不再递归。

2.返回过程。

当调用到printOut(7)时,不会再调用printOut递归,函数开始执行接下来的调用,即执行printDigit(7%10),终端将输出7,而此时printOut(7)也结束调用并返回给上层调用printOut(76)。如printOut(7)一样,printOut(76)也要执行printDigit(76%10),终端将输出6,printOut(76)则结束调用并返回给上层调用printOut(762)。这个返回过程将一直执行直到最初的调用者printOut(76234)执行完printDigit(76234%10),输出4,函数结束。

打印输出的完整的调用过程和递归过程相反,依次为:printDigit(7%10),printDigit(76%10),printDigit(762%10),printDigit(7623%10),printDigit(76234%10)。

至此,整个递归过程也完成了。

 

注意事项:

1. 递归的设计依赖于调用是否能够总是朝着基准不断推进。

2. n%10开销很大:n%10 = n - [n/10]*10。

在C++中,递归调用无基准情况是无意义的。且不能朝着基准情况推进也是无意义的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值