请问能够递归多少次?

sigh02 2003-08-23 07:09:36
请问c语言和linux最多支持多少次函数的递归?
跟哪些因素有关?
...全文
234 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨星 2003-08-26
  • 打赏
  • 举报
回复
指针嘛,本来就有这个好处,自己只占4个字节,但能指向一块很大的区域。:)
sigh02 2003-08-26
  • 打赏
  • 举报
回复
30000层倒是差不多,因为我上面的例子,非常简单,可以递归300000层左右
1M层和500K层都出现内存错误segment default.

steedhorse(晨星)
你的意思,没太明白,如果在out(){}里面char s[20],常量的话就没有出栈入栈,对吗?
如果改变他的值,比如说,定义一个指针,到处指,她就要压栈了,对吗?
如果用全局变量当然可以,我现在不太想用,因为那样程序可移植性就差了
canany1tellme 2003-08-26
  • 打赏
  • 举报
回复
我写过一个快速排序的递归,大约能够递归30000层就发生stack溢出
晨星 2003-08-26
  • 打赏
  • 举报
回复
比如说,定义一个在函数递归时,一直可以用的临时变量。
那就用全局变量呀。其实你原来用常量形式写的字符串“Game OK!”就不必每次出栈入栈,因为它保存在全局的静态存储区中。
sigh02 2003-08-26
  • 打赏
  • 举报
回复
lilachue(哦)
递归不到死机
yinzhaohui()
层数不要太多,多少不算多呢?能大致定量的说一下么?
yinzhaohui 2003-08-25
  • 打赏
  • 举报
回复
使用这个测试方法可能有问题,因为每调用一个函数时都要压栈而不同的递归每一次压栈的大小不一样.因些不能用上面的测试程序,一般递归的层数不要太多。
极速小王子 2003-08-25
  • 打赏
  • 举报
回复
可以一直第归到你死机!
sigh02 2003-08-25
  • 打赏
  • 举报
回复
如果char s[10]放在栈里
那如果我想做在函数里设一个变量,不想让他出栈入栈,怎么办?
比如说,定义一个在函数递归时,一直可以用的临时变量
每次出栈入栈,申请内存,太浪费了
那我应该怎么做呢?
晨星 2003-08-24
  • 打赏
  • 举报
回复
“我推测,溢出和栈的大小有关,而和内存的大小无关。”
不用推测,本来就是这样的。:)
不过我也不确定栈的大小是否可调。
晨星 2003-08-24
  • 打赏
  • 举报
回复
char s[10] = "Game Ok!";
肯定是在栈里的,因为这种跟
char* s = "Game Ok!";
不一样,后者只在栈里放了个指针,指向静态存储区的常量字符串"Game OK!",而前者却是个拥有10个元素的字符数组,只是用"Game OK!"初始化了一下。
sigh02 2003-08-24
  • 打赏
  • 举报
回复
哪位大哥再发表一下意见啊!
sigh02 2003-08-23
  • 打赏
  • 举报
回复
嗯,我推测,溢出和栈的大小有关,而和内存的大小无关
char s[10] = "Game Ok!";
不是放在栈里的吧?(不太确定)
我当初在同样机器上,一下子alloc 16M内存,没问题
所以就算s[10]内存分配应该没问题的
可是栈的大小怎么获知啊?
如何改变啊?
vc + windows下?
gcc + linux下呢?
晨星 2003-08-23
  • 打赏
  • 举报
回复
不过我不确定Windows中栈段(或VC6编译出的程序的默认栈段)的大小是否是1M。
晨星 2003-08-23
  • 打赏
  • 举报
回复
你这个用不了多少内存的,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);
}
test7979 2003-08-23
  • 打赏
  • 举报
回复
1M当然是栈的大小,是字节数

能调几层和你函数参数有关
sigh02 2003-08-23
  • 打赏
  • 举报
回复
在如下环境下
gcc version 3.2 20020903 (Red Hat Linux 8.0 3.2-7)
硬件配置:
曙光双CPU 1.0G 4G RAM
使用如下程序,进行测试,Game OK;
欢迎大家提意见!谢谢!

out(long i)
{
if (i==0)
printf("Game OK");
else
{ if(i%100 == 0)
printf("%d",i);
i--;
out(i);
}
}

main()
{
out(100000);
}

sigh02 2003-08-23
  • 打赏
  • 举报
回复
我的意思,也许是层吧
就是说执行一个函数,这个函数要反复调用自己10万次
那么请问,每一次递归都有哪些东西入栈?
MSDN的1M是层数,还是栈的大小?
那么请问,c语言有限制吗?在linux下,又有什么限制呢?
谢谢各位!
test7979 2003-08-23
  • 打赏
  • 举报
回复
所以说:GOTO_2002()()小小强()() 的答案是正确的 :)

据MSDN说默认是1M

这样结合你自己函数的参数定义就可以计算出大概能递归几次了
test7979 2003-08-23
  • 打赏
  • 举报
回复
看你栈大小设置多少大了
cl 编译的时候可以设置的 /F<num> set stack size
晨星 2003-08-23
  • 打赏
  • 举报
回复
是“10万层”还是“10万次”?递归关键是层数,比如说树的遍历,层数跟次数就不一样,因为中途就有回溯。
栈的大小我也不太清楚,而且不同的操作系统可能还不一样。如果是10万层,你还是自己试试吧。
加载更多回复(5)

1,649

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧