社区
非技术类
帖子详情
请问能够递归多少次?
sigh02
2003-08-23 07:09:36
请问c语言和linux最多支持多少次函数的递归?
跟哪些因素有关?
...全文
234
25
打赏
收藏
请问能够递归多少次?
请问c语言和linux最多支持多少次函数的递归? 跟哪些因素有关?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
递归
入门、
递归
遍历、
递归
穷举算法
本课程带你从
递归
算法基础入手,课程是精讲大量实际项目中常用到的案例,课程深入浅出,包括
递归
入门,
递归
遍历、弟归穷举算法及各种项目,适合算法爱好者一起学习,后附每堂课项目源码,感兴趣可以观注博客,不定期...
递归
超时怎么办?
递归
与递推的区别?
递归
的优化之道
递归
超时怎么办?
递归
的优化之道 平时在做题的时候,我们经常都要用到
递归
来解题,因为
递归
能最快速的让计算机知道我们想让他做什么,解放了我们的思维量(但在一定程度上加重了计算机的计算量,这也是可能超时的原因所在),方便我们阅读理解和修改。 这里我想再引用一下Leigh Caldwell在Stack Overflow上说的一句话: “如果使用循环,程序的性能可能会更高,如果使用
递归
,程序可能更容易理解,如何选择要看什么对你来说更重要。” 如果你还不太理解
递归
,可以看我之前写过的一篇文章 再
次
深入理解
递归
——总
java实现尾
递归
优化,你们都知道
递归
,尾
递归
呢?什么又是尾
递归
优化?
你们都知道
递归
,尾
递归
呢?什么又是尾
递归
优化?码农唐磊 程序猿石头今天,咱们来聊聊
递归
函数。为啥忽然想到
递归
?其实就从电影名字《恐怖游轮》《盗梦空间》想到了。图片java
递归
是啥?
递归
函数你们确定写过,学校上课的时候,估计最开始的例子就是斐波拉契数列了吧。例如:面试int Fibonacci(n) {if (n < 2) return n;return Fibonacci(n - 1) + ...
大家都知道
递归
,尾
递归
呢?什么又是尾
递归
优化?
点击上方蓝色字体,关注我 ——一个在阿里云打工的清华学渣!今天,我们来聊聊
递归
函数。为啥突然想到
递归
?其实就从电影名字《恐怖游轮》《盗梦空间》想到了。
递归
是啥?
递归
函数大家肯定写过,...
计算机中
递归
的概念,
递归
是什么?关于
递归
的详细介绍
递归
,又译为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。
递归
一词还较常用于描述以自相似方法重复事物的过程。例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限
递归
的形式出现的。也可以理解为自我复制的过程。正式的定义在数学和计算机科学中,当一类对象或方法可以由两个属性定义时,它们表现出
递归
行为:简单的基线条件---不使用
递归
产生答案的终止情况一组规则将所有其他情形缩减到基...
非技术类
1,649
社区成员
58,980
社区内容
发帖
与我相关
我的任务
非技术类
VC/MFC 非技术类
复制链接
扫一扫
分享
社区描述
VC/MFC 非技术类
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章