递归之所以能够实现,是因为函数的每个执行过程在栈中都有自己的形参和局部变量的副本,这些副本和该函数的其他执行过程毫不相干。
关于递归:
假设某个调用函数调用了一个被调用函数,再假定被调用函数又反过来调用了调用函数,那么第二个调用就称之为调用函数的递归,因为他发生在调用函数的当前执行过程运行完毕之前。
而且,因为这个原先的调用函数,现在的被调用函数在栈中较低的位置有它独立的一组参数和自变量,原先的参数和变量将不受任何影响,所以递归能够正常工作。程序遍历执行这些函数的过程成为递归下降。
程序员需要保证递归函数不会随意改变静态变量和全局变量的值,以免在递归下降的过程中上层函数出错。程序员还必须确保有一个终止条件来结束递归下降的过程,并回溯到顶层。
先来看一个简单的例子:
运行结果:
再来看一个利用递归实现的计算器程序
运行的结果:
注意:
这个小程序还有一个小问题:数组expr的长度只有81个字符,而且程序采用cin来读入字符串。如果输入的表达式超过80个字符,输入流缓冲区就会溢出,程序的运行结果将会不可预料。另外,因为采用了cin的>>运算符,所以输入的表达式里不能有任何空白字符。