函数可以调用自身,这种功能称为递归。递归可以有只包含一个递归的递归,也可以包含多个递归。也就是在运行一次函数时,调用一次自身或是多次。
1、包含一个递归调用的递归
通常的格式是将递归调用放在 if 语句中,这样递归才可以判断是否结束递归循环调用:
void recurs(arguments)
{
statements1
if (test)
recurs(arguments)
statements2
}
test 最终为 FALSE,调用链断开。
在以上程序格式中,递归调用将导致执行 n 次 statements1 后,程序沿进入的路径返回执行 n 次 statements2。
比如执行两次递归调用,第三次时,test 为 FALSE,程序将执行 statements2,执行完该语句后,程序实际上是在第二层的递归调用里,接下来将继续执行 statements2,然后程序进入到第一层的递归调用,再次执行 statements2,总共执行 3 次。与递归调用进入该递归循环执行 statements1 的次数一样,并且顺序相反。
下列程序将展示该特性:
#include <iostream>
void countdown(int n);
int main()
{
countdown(4);
return 0;
}
void countdown(int n)
{
using namespace std;
cout << "Counting down ... " << n << endl;
if (n > 0)
{
countdown(n - 1); // 递归调用,这里是调用 5 次
}
cout << n << ": kaboom!\n";
}
注意:每个递归调用都创建自己的一套变量,因此当程序到达第 5 次调用时,将有 5 个独立的 n 变量,其中每个变量的值不同,并且地址也不同。
2、包含多个递归调用的递归
参照《c++ premier plus 第六版》 p198。略。