运行如下代码:
/* Example of deep recursion */
#include <stdio.h>
#include <stdlib.h>
int recurse(int x) {
int a[1<<15]; /* 4 * 2^15 = 64 KiB */
printf("x = %d. a at %p\n", x, a);
a[0] = (1<<14)-1;
a[a[0]] = x-1;
if (a[a[0]] == 0)
return -1;
return recurse(a[a[0]]) - 1;
}
int main(int argc, char *argv[]) {
int x = 100;
if (argc > 1)
x = atoi(argv[1]);
int v = recurse(x);
printf("x = %d. recurse(x) = %d\n", x, v);
return 0;
}
结果如下:
从上述结果来看:递归需要做许多函数调用,每个函数调用都需要设置有一个栈帧,并传递参数,这些都增加了时间开销以及空间开销,每个栈帧都有一定的存储空间,所以不能无限递归,或者递归到一定程度就无法继续递归下去,如果所执行的递归调用过多,就会产生空间不够,或者反映时间过长,从而导致不能达到所需的效果。使用递归,就不得不考虑以上问题,如何判断是否使用递归,需要从系统的性能方面(程序的易用性、易测试性以及性能开销等方面)综合加以考虑。