递归函数是不是只能把局部变量放在栈里???

sioyn 2008-11-28 11:36:53
用递归遍历注册表时,内存占用很大。原因就是每递归一次就要给变量分配一次栈空间。
能不能在递归函数内部动态分配内存呢?放在堆上自己管???请教高手
...全文
277 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
就呆在云上 2008-11-28
  • 打赏
  • 举报
回复
想怎么用就能怎么用,程序是人控制的。
你想分配空间那么就这样:
void f(int n) {
if (n <= 0)
{
return;
}
else {
char *p = new char[10];
f(n-1);
delete[]p;
}

}
int main()
{
f(10);
return 0;
}


只是在函数返回的时候你要释放内存就是了
呵呵
toadzw 2008-11-28
  • 打赏
  • 举报
回复
高手,你不管用什么空间,那么多空间都是不能变的,主要原因出在递规上面了,你要考虑改变一下程序设计方法了;
tianma2005123 2008-11-28
  • 打赏
  • 举报
回复
恩,放堆里的话更慢。。。
nullah 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pengxn 的回复:]
可以。

使用NEW方法 ,动态的分配出来的空间,就是放在堆里的了。
[/Quote]
UP
sioyn 2008-11-28
  • 打赏
  • 举报
回复
关键是内存占用的问题,new出来的虽然在堆上,但是不能在递归时释放,也就是内存一样会随着递归的每次调用增加。
hai040 2008-11-28
  • 打赏
  • 举报
回复
注册表的层数也不会很深吧
pengxn 2008-11-28
  • 打赏
  • 举报
回复
可以。

使用NEW方法 ,动态的分配出来的空间,就是放在堆里的了。
xxweilw 2008-11-28
  • 打赏
  • 举报
回复
动态分配的速度会更慢的.
xxgamexx 2008-11-28
  • 打赏
  • 举报
回复
第一个方法不具有广泛性





void * fun(void *data,int n)

//do something
return n<0?return:fun(data,--n);
};
int main()
{
data=(char *)new char[100];

fun(data,10);
return 0;
}

taodm 2008-11-28
  • 打赏
  • 举报
回复
“递归函数是不是只能把局部变量放在栈里??? ”
楼主,你能不能给出你的“局部变量”的定义?
xxgamexx 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ztz0223 的回复:]
想怎么用就能怎么用,程序是人控制的。
你想分配空间那么就这样:
C/C++ codevoidf(intn) {if(n<=0)
{return;
}else{char*p=newchar[10];
f(n-1);
delete[]p;
}

}intmain()
{
f(10);return0;
}

只是在函数返回的时候你要释放内存就是了
呵呵
[/Quote]

这样用是有问题的。

这样分配和栈分配应该是一样的,而且比栈分配应该还慢 ~

想想,都是先N次 new 出的内存,然后进栈(递归),只有达到最底层的时候才释放内存,(栈变量同样是在最后一层释放掉了变量,或者说最后一次递归函数结束时释放掉的)。



个人觉得:

1,在递归函数外申请数据,把数据的地址传进去。
2,递推
zhanshen2891 2008-11-28
  • 打赏
  • 举报
回复
递归的时候可以把内存放在堆上,释放也没问题。这样做的效率怎么样我没有实际测试过,但是肯定有一点很明显的好处:

那就是极大的节省了栈空间,一般不提倡用递归都是因为栈的空间很有限,放在堆上就好了
sagegz 2008-11-28
  • 打赏
  • 举报
回复
换个算法!

64,684

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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