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

#include <stdio.h> void print_times(int m, int times) { if (times == 0) { return; } printf("%d ", m); print_times(m, times - 1); } int current = 1; void print_sequence(int n) { if (n <= 0) { return; } if (n >= current) { print_times(current, current); current++; print_sequence(n - current+1); } else { print_times(current, n); } } int main() { int x; scanf("%d", &x); print_sequence(x); return 0; }
这段代码试图打印一个特殊的数字序列,但存在逻辑错误。代码使用递归函数 `print_sequence` 和全局变量 `current`,意图是:对于输入的数字 x,先打印 1 个 1,再打印 2 个 2,再打印 3 个 3,以此类推,直到打印的数字总数达到 x。

- 问题出在 `print_sequence` 函数中递归调用时的参数计算。当 `n >= current` 时,你打印了 `current` 个 `current`,然后递归调用 `print_sequence(n - current + 1)`。这里的 `+1` 是多余的,导致递归时传入的参数不正确,使得序列长度和数字对应关系出错。

- 另外,全局变量 `current` 在递归过程中被修改,但递归返回后 `current` 的值已经改变,这会影响后续的判断逻辑。你需要仔细考虑递归调用时如何正确更新剩余数量 `n`,以及何时增加 `current`。