请问c语言和linux最多支持多少次函数的递归?
跟哪些因素有关?
跟栈的大小有关。
不一定递归多少次,这要看递归函数的空间复杂度,总之一旦栈溢出,就完蛋了。
不懂,帮你up一下,不过我干肯定,这件事一定和机器的内存有关~~~^^
其实系统根本不知道你是在递归,因此也就无法规定递归的层数。
也就是说,系统只知道你在调用某个函数,根本没注意调用者和被调用者其实是同一个函数。系统只是随着调用深度的增加,老老实实地不断帮你完成栈内存的分配,也就是栈增长,等增长到溢出,也就玩完了。
是“10万层”还是“10万次”?递归关键是层数,比如说树的遍历,层数跟次数就不一样,因为中途就有回溯。
栈的大小我也不太清楚,而且不同的操作系统可能还不一样。如果是10万层,你还是自己试试吧。
看你栈大小设置多少大了
cl 编译的时候可以设置的 /F<num> set stack size
所以说:GOTO_2002()()小小强()() 的答案是正确的 :)
据MSDN说默认是1M
这样结合你自己函数的参数定义就可以计算出大概能递归几次了
1M当然是栈的大小,是字节数
能调几层和你函数参数有关
你这个用不了多少内存的,out函数只有一个参数:i。局部变量一个都没有。字符串"Game OK"和"%d"都放在静态存储区中,加上函数压栈的必要信息,应该也就是10几个字节吧,因此10万层应该也就在1兆左右。
你的程序在VC6的Release版本中也没有问题,但想溢出,也很简单,比如下面的程序每一层递归只比你原来的多用了10个字节,就溢出了。不过你可以在Linux里再试试。
#include <stdio.h>
out(long i)
{
char s[10] = "Game Ok!";
if (i==0)
printf(s);
else
{ if(i%100 == 0)
printf("%d",i);
i--;
out(i);
}
}
main()
{
out(100000);
}
不过我不确定Windows中栈段的大小是否是1M。
char s[10] = "Game Ok!";
肯定是在栈里的,因为这种跟
char* s = "Game Ok!";
不一样,后者只在栈里放了个指针,指向静态存储区的常量字符串"Game OK!",而前者却是个拥有10个元素的字符数组,只是用"Game OK!"初始化了一下。
“我推测,溢出和栈的大小有关,而和内存的大小无关。”
不用推测,本来就是这样的。:)
不过我也不确定栈的大小是否可调。
比如说,定义一个在函数递归时,一直可以用的临时变量。
那就用全局变量呀。其实你原来用常量形式写的字符串“Game OK!”就不必每次出栈入栈,因为它保存在全局的静态存储区中。
我写过一个快速排序的递归,大约能够递归30000层就发生stack溢出
指针嘛,本来就有这个好处,自己只占4个字节,但能指向一块很大的区域。:)