我正在了解我的系统计算Ackermann算法的两个和三个参数版本的能力。对于非常小的m和n值,我的系统将计算并打印从A0和A1方法调用返回的结果。然而,高于3或4的任何东西都不会返回并冻结我使用atm的终端。我的问题是,我确定我的机器可以计算出m和n的值。如何在计算Ackermann时检查堆栈使用情况
我已经尝试了一些事情来捕捉堆栈溢出,对于我所知的C++没有可以捕获的stackoverflowexception。 try-catch块不起作用。在下面的代码中,我使用getrlimit()来查找堆栈限制,在主gStackRef中创建一个地址位置。我调用checkStack递归检查局部变量指针gStackLimit。
有没有更好的方法来检查我的堆栈使用与递归方法有关?我还要检查段故障吗?我会让你知道我在unix终端上运行。
#include <cstdlib>
#include <iostream>
#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlp);
using namespace std;
int * gStackRef;
int gStackLimit;
void checkStack(void);
int main(int argc, char *argv[])
{
int temp = 0;
gStackRef = &temp;
rlimit myl;
getrlimit(RLIMIT_STACK, &myl);
gStackLimit = (myl.rlim_cur/3 * 8/10) ;/* modified for segment fault */
cout << gStackLimit << "\n";
checkStack();
}
void checkStack()
{
int temp = 0;
int* pVariableHere = &temp;
size_t stackUsage = gStackRef - pVariableHere;
printf("Stack usage: %d/%d \n", stackUsage, gStackLimit);
if(stackUsage > gStackLimit) return;
else checkStack();
}
1.固定标题的拼写错误。 2.重新标记的C++ - > C;这里没有C++。 3.用POSIX标记,因为这是你明显建立在其上的API。 –
通过动态规划(对于它的价值,使用某种形式的动态规划,而不是递归的可能是最好的计算阿克曼),你是说我尽量节省A0和A1的返回的值的表?这样我可以在进行另一次递归调用之前检查表格并节省一些空间。 – ASLilly
是的,动态规划是一种表驱动算法求解方法。有关更多详细信息,请参阅我的答案中链接的wikipedia文章。 AFAIK你不需要超过'm * n'的空间和时间来使用表格来计算。 (尽管我可能是错的;我自己也没有实现)考虑一个类似的情况,即斐波那契数列,它按照递归计算指数时间,但只使用动态规划计算线性时间。 –