c语言 - 对于阿克曼函数来说太大的数字的分割错误



为什么会失败?我已经用C编写了Ackermann的函数,并使用longs来确保任何数字都不会太小。然而,当我对m和n超过(包括(4时,它会给我一个segmentation fault: 11。有人知道为什么吗?

#include <stdio.h>
int ackermann(long m, long n) {
if (m == 0)
return n + 1;
else if (m > 0 && n == 0)
return ackermann(m - 1, 1);
else if (m > 0 && n > 0)
return ackermann(m - 1, ackermann(m, n - 1));
}
int main() {
long result = ackermann(4, 4);
printf("%lu", result);
}

我已经用C编写了Ackermann的函数,并使用longs来确保任何数字都不会太小。

unsigned long long的大小为2^6(64(位。ackermann(4, 2)的结果大小大于2^16(65536(位。您可以计算ackermann(4, 1)ackermann(5, 0),但使用较大的mn值则不太多。

在代码方面,当使用无符号long可能会更好时,您可以使用signedlong,并且您声明ackermann()函数本身以返回不一致的signed int。(您的ackermann()函数还有一个第四个出口点,在编译器方面没有正确定义。(以下是使用unsigned long long对代码的返工,它仍然不会让您走得很远:

#include <stdio.h>
unsigned long long ackermann(unsigned long long m, unsigned long long n) {
if (m == 0) {
return n + 1;
}
if (m > 0 && n == 0) {
return ackermann(m - 1, 1);
}
return ackermann(m - 1, ackermann(m, n - 1));
}
int main() {
unsigned long long result = ackermann(5, 0);
printf("%llun", result);
return 0;
}

相关内容

  • 没有找到相关文章

最新更新