我试图让自己习惯于在c ++中使用动态数组,现在却像今天的第十次一样陷入困境。该程序编译正常,但在输入后它给出了堆栈溢出错误,并且我已经提供了在我的构造函数中删除堆的功能,我假设我有一个未启动的变量,但我真的找不到它。我希望你们能帮我看看。这是代码:
#include<string>
#include<cmath>
#include<sstream>
using namespace std;
#include"Calc.h"
#include<iostream>
using namespace std;
Calc::Calc(int a, int*b){
length=a;
ar=b;
AR =new int*[length];
for (int i=0; i<length;i++){
AR[i] = new int [ar[i]]();
}
for (int i = 0; i < length; i++)
delete[] AR[i];
};
Calc::~Calc(){};
int Calc::solveFor(int m0, int n0){
int ans=0;
if (m0=0) {ans =n0+1; AR[m0][n0]=ans; return n0+1;}
if (n0=0) {ans= solveFor(m0-1,1); AR[m0][n0]=ans;return ans;}
else {ans=solveFor(m0-1, solveFor(m0, n0-1));AR[m0][n0]=ans; return ans;}
};
void Calc::getSolved(){
for(int i=0; i<=length; i++){cout<<endl;
for (int j=0; j<ar[i]; j++)
cout<<"ACK ["<<i<<","<<j<<"]="<<AR[i][j]<<" ";}
cout<<endl;
};
Run.cpp:
#include<iostream>
#include<string>
#include "Calc.h"
using namespace std;
int main() {
int m;
int n;
int v[6]= {7, 7, 7, 7, 7, 7};
Calc XXX(6, v);
cin>>m;
cin>>n;
XXX.solveFor(m,n);
XXX.getSolved();
return 0;
}
提前感谢。
答案 0 :(得分:3)
我在Calc::solveFor
中可以看到的一个问题是你使用赋值运算符代替了相等:
if (m0=0)
应该是
if (m0==0)
答案 1 :(得分:1)
除了上面提到的= / ==问题之外,看起来你正在递归地计算Ackermann function。这个函数的递归深度增长速度太快,不能这样做:“A(4,2)不可能通过在任何易处理的时间内简单递归地应用Ackermann函数来计算。”
尝试使用迭代方法,或者查看memoization。
答案 2 :(得分:0)
Ackermann函数的值增长非常快,对于m>3
,它会溢出int
,您将用于结果。这可能是无限递归的原因。