对于阿克曼函数来说太大的数字分段错误
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)
,但如果 m
和 n
.
的值较大,则计算不多
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;
}
为什么会失败?我用 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)
,但如果 m
和 n
.
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;
}