对于阿克曼函数来说太大的数字分段错误

Segmentation fault for numbers too big for Ackermann's function

为什么会失败?我用 C 语言编写了 Ackermann 函数,并使用 longs 来确保没有数字会太小。然而,当我超过(包括)4 的 m 和 n 时,它给了我 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);
  }

I have written Ackermann's function in C and used longs to make sure that no number will be too small.

unsigned long long 的大小是 2^6 (64) 位。 ackermann(4, 2) 的结果大小大于 2^16 (65536) 位。您可以计算 ackermann(4, 1)ackermann(5, 0),但如果 mn.

的值较大,则计算不多

Code-wise,当 unsigned long 可能投放时,您使用 signed long你最好将 ackermann() 函数本身声明为 return a signed int 这是不一致的。 (您的 ackermann() 函数还有第四个未正确定义的退出点,compiler-wise。)这是使用 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("%llu\n", result);

    return 0;
}