打印整数的完整程序如下:
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++中,递归调用无基准情况是无意义的。且不能朝着基准情况推进也是无意义的