新手上路:递归调用怎么参数大了以后怎么计算不出结果

zhang99092 2005-04-24 11:07:16
#include <iostream.h>
#include <iomanip.h>
int acm(int m,int n)
{
if(m<0||n<0)return 0;
if(m==0)return n+1;
if(n==0)return acm(m-1,1);
return acm(m-1,acm(m,n-1));
}
void main()
{
int m,n;
cout<<"请输入m,n的值:";
cin>>m>>n;
cout<<acm(m,n)<<endl;
}
m,n小一些还行,稍微大些就计算不出结果了。怎么办??
...全文
187 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
flying_dancing 2005-04-25
  • 打赏
  • 举报
回复
弓手说了大家应该没意见吧////////////-_-
lipotee 2005-04-25
  • 打赏
  • 举报
回复
想问一下楼上的,你这样改写对堆栈的要求有何改良?没看明白。
du51 2005-04-25
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;
long Acmfunc(long m,long n)
{
if(!m)return n+1;
if(!n)return Acmfunc(m-1,n);
if(m>0&&n>0)return Acmfunc(m-1,Acmfunc(m,n-1));
else return 0;
}
int main()
{
cout<<"input M and N"<<endl;
long m,n;
cin>>m>>n;
cout<<Acmfunc(m,n)<<endl;
system("PAUSE");
return 0;
}
//Acm函数
du51 2005-04-25
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;
long Acmfunc(long m,long n)
{
if(!m)return n+1;
if(!n)return Acmfunc(m-1,n);
if(m>0&&n>0)return Acmfunc(m-1,Acmfunc(m,n-1));
else return 0;
}
int main()
{
cout<<"input M and N"<<endl;
long m,n;
cin>>m>>n;
cout<<Acmfunc(m,n)<<endl;
system("PAUSE");
return 0;
}
这个是ACM函数 很吃内存.
少大就不行了.刚学C++的时候,课后习题.
alaiyeshi 2005-04-25
  • 打赏
  • 举报
回复
堆栈溢出,要尽可能的控制递归的规模,如果实在是要递归的很深的时候,你可以尝试用循环来消除递归
zhousqy 2005-04-25
  • 打赏
  • 举报
回复
mark
lipotee 2005-04-25
  • 打赏
  • 举报
回复
楼上的,你没搞错吧?这条件有什么夸张的?
楼主是要计算这玩艺:
f(x,y) = 0 (x<0 || y<0)
f(0,y) = 1+1;
f(x,0) = f(x-1,1);

f(x,y) = f(x-1,f(x,y-1))
只要有合法的终止递归条件,怎么夸张了?
合理的还是要增加本程序的堆栈大小,因为递归程序对堆栈大小要求很高,
你这函数每次调用至少要压栈3x8 = 24个字节(int作4字节),多调用几次就完蛋了。
如果在vc里,把project settings里Link页里stack allocations里的Reserve调多点。
调多少你自己试验一下吧。
Cnwanglin 2005-04-25
  • 打赏
  • 举报
回复
公式我没仔细看
但是作为递归的结束条件太夸张了
if(n == 0)return acm(m-1,1);

所以会报错:Stack Overflow

顺便问下 这个递归在不停的以Step -1 减少m,n的值

并没有什么实际的意义

使用递归函数 要注意函数本身是否正确
bing_huo 2005-04-25
  • 打赏
  • 举报
回复
讨厌递归。。。宁可用循环代替 哈哈~~
lipotee 2005-04-25
  • 打赏
  • 举报
回复
把堆栈大小调整一下。递归调用对程序堆栈使用极其厉害的。
xjp6688 2005-04-25
  • 打赏
  • 举报
回复
出栈了吧,哈哈?
qhfu 2005-04-25
  • 打赏
  • 举报
回复
至于怎么改进也忘了,去年上软件自动化课的时候老师出过这道题。
不过当时也没有去做他。
你去网上看看有没有人发表的一些改进的论文吧!
qhfu 2005-04-25
  • 打赏
  • 举报
回复
我没记错的话,这个是著名的acm 函数 acm(4,2)的话用现在好点的pc机大概5分钟能得出来,如果acm(4,3)的话,现在任何计算机都算不出来的。
zhang99092 2005-04-25
  • 打赏
  • 举报
回复
这是书上的一道题。多谢 右手 指教
请问怎么用循环来改良这个程序阿。
horisly 2005-04-24
  • 打赏
  • 举报
回复
等久一点,看看.
arrowcy 2005-04-24
  • 打赏
  • 举报
回复
刚才调了一下
觉得应该是递归公式本身的问题
你应该先检查一下递归公式是不是搞错了
arrowcy 2005-04-24
  • 打赏
  • 举报
回复
是不是大很了以后递归调用深度太深了阿

64,648

社区成员

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

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