为什么会失败?我已经用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)
,但使用较大的m
和n
值则不太多。
在代码方面,当使用无符号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;
}