Online Compiler C

#include <stdio.h> void print_a_to_b(int a, int b) { if (a < b) { if (a == b) { printf("%d ", a); } else { printf("%d", a); print_a_to_b(a + 1); } } if (a > b) { if (a == b) { printf("%d ", a); } else { printf("%d", a); print_a_to_b(a - 1); } } int main() { int x, y; scanf("%d%d", &x, &y); print_n_to_1(x, y); return 0; }
这段代码试图用递归打印从a到b的所有整数,但存在几个问题。

首先,函数定义中 `print_a_to_b` 接受两个参数,但在递归调用时只传了一个参数 `print_a_to_b(a + 1)` 和 `print_a_to_b(a - 1)`,这会导致编译错误。递归调用需要同时传递更新后的a和不变的b。

其次,条件判断的逻辑有冗余。当 `a < b` 时,内部又检查 `a == b`,但既然已经进入 `a < b` 的分支,`a == b` 永远不可能为真。同样的问题也出现在 `a > b` 的分支中。递归的终止条件应该单独处理,而不是嵌套在大小比较内部。

- 检查递归调用时是否传递了正确的参数数量。递归函数需要两个参数,但你的调用只给了一个。
- 思考递归的终止条件应该放在哪里。通常先判断是否应该停止递归(比如 a 和 b 相等时),然后再处理递归步骤。