数字的分段错误对于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()

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...