C++函数可以自己调用自己,与C语言不同的是,C++不允许main()调用自己,这种功能被称为递归。
如果递归函数调用自己,则被调用的函数也将调用自己,这将无限循环下去,除非代码中包含终止调用链的内容。例:
void recurs(argumentlist) { statements1; if (test) recurs(arguments) statements2; }在上面的例子中,只要if语句为true,每个recurs()调用都将执行statements1,然后再调用recurs(),而不会执行statements2。当if语句为false是,当前调用将执行statements2。当前调用结束后,程序控制前将返回给调用它的recurs(),而该recurs()将执行其statements2部分,然后结束,并将程序控制权返回给前一个调用,以此类推。用词,如果recurs()进行了5次递归调用,则statements1部分将按函数调用的顺序执行5次,statements2部分将以相反的顺序执行5次。
程序7.16
#include<iostream> void countdown(int n); int main() { countdown(4); system("pause"); return 0; } void countdown(int n) { using namespace std; cout << "Counting down ... " << n << endl; if (n > 0) countdown(n - 1); cout << n << ": Kaboom!\n"; }每个递归调用都创建自己的一套变量,因此当程序到达第5次调用时,将有5个独立的n变量,其中每个变量的值都不同。
在需要将一项工作不断分为两项较小的、类似的工作时,递归非常有用。 程序7.17
#include<iostream> const int Len = 66; const int Divs = 6; void subdivide(char ar[], int low, int high, int level); int main() { char ruler[Len]; int i; for (i = 1; i < Len - 2; i++) ruler[i] = ' '; ruler[Len - 1] = '\0'; int max = Len - 2; int min = 0; ruler[min] = ruler[max] = '|'; std::cout << ruler << std::endl; for (i = 1; i <= Divs; i++) { subdivide(ruler, min, max, i); std::cout << ruler << std::endl; for (int j = 1; j < Len - 2; j++) ruler[j] = ' '; } system("pause"); return 0; } void subdivide(char ar[], int low, int high, int level) { if (level == 0) return; int mid = (high + low) / 2; ar[mid] = '|'; subdivide(ar, low, mid, level - 1); subdivide(ar, mid, high, level - 1); }