【发布时间】:2020-12-29 13:41:00
【问题描述】:
为什么会失败?我用 C 语言编写了 Ackermann 的函数,并使用 long 来确保数字不会太小。然而,当我为 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);
}
【问题讨论】:
-
在许多系统上
long的大小与int相同。试试long long或int64_t? -
en.wikipedia.org/wiki/Ackermann_function#Table_of_values。 Ackermann(4, 4) 是一个数以千计的数字。没有任何 C 类型可以接近存储该数字。
-
分段错误...现在“堆栈溢出”的名称从何而来...
标签: c recursion segmentation-fault long-integer ackermann