数字的分段错误对于Ackermann函数来说太大

问题描述

为什么会失败?我已经用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),但是对于较大的mn,则计算不了。

在代码方面,当 unsigned long可能会为您提供更好的服务并且您声明{{1} }函数本身返回不一致的long。 (您的ackermann()函数还具有第四个退出点,该点在编译器方面未正确定义。)这是使用signed int对您的代码的重做,仍然无法达到目的:>

ackermann()