Онлайн компилятор C

#include <stdio.h> int akkerman(int m, int n) { if (m == 0) { return n + 1; } if (m > 0 && n == 0) { return akkerman(m - 1, 1); } if (m > 0 && n > 0) { return akkerman(m - 1, akkerman(m, n - 1)); } } int main() { printf("%d", akkerman(2, 1)); return 0; }
这段代码实现了阿克曼函数(Ackermann function),这是一个经典的递归函数,用于测试递归深度和计算能力。程序从main函数调用akkerman(2,1)并打印结果。

代码逻辑基本正确,但存在一个潜在问题:当m和n都大于0时,递归调用akkerman(m, n-1)作为参数传递给akkerman(m-1, ...),这会导致非常深的递归嵌套。

- 注意阿克曼函数增长极快,即使很小的输入值(如m=3, n=1)也可能导致栈溢出或长时间运行。你当前测试的(2,1)结果应该是5,可以验证输出是否正确。

- 检查递归终止条件:你的代码中缺少一个else分支,虽然逻辑上所有情况都已覆盖,但编译器可能会警告“控制流到达非void函数末尾”。建议确保所有路径都有返回值。