问题描述
为什么会失败?我已经用C编写了Ackermann函数,并使用了很长时间来确保没有数字会太小。但是,当我在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函数,并花了很长时间来确保 没有数字会太小。
unsigned long long
的大小为2 ^ 6(64)位。 ackermann(4,2)
的结果大小大于2 ^ 16(65536)位。您可以计算ackermann(4,1)
和ackermann(5,0)
,但是对于较大的m
和n
,则计算不了。
在代码方面,当 unsigned long
可能会为您提供更好的服务并且您声明{{1} }函数本身返回不一致的long
。 (您的ackermann()
函数还具有第四个退出点,该点在编译器方面未正确定义。)这是使用signed int
对您的代码的重做,仍然无法达到目的:>
ackermann()