在线编译器 C

#include <stdio.h> void print_odds(void) { int x; scanf("%d", &x); if (x == 0) return; // 先递归读取后面所有数字 print_odds(); // 当前数字是奇数才打印 if (x % 2 != 0) { printf("%d ", x); } }
这段代码的功能是:从标准输入读取一系列整数(以0作为结束标志),然后按输入顺序的逆序输出其中的所有奇数。

代码使用递归来实现逆序处理:先递归读取后续数字,等递归返回后再处理当前数字,这样就能实现后读入的数字先输出。

- 注意递归的终止条件是读取到0,此时直接返回,不再继续递归。
- 当前代码在读取到0时直接返回,但0本身不会被处理。如果输入中0是结束标志,这是正确的。
- 思考一下:如果输入序列中第一个数字就是0,程序会直接返回,不会输出任何内容,这是合理的。
- 但有一个潜在问题:递归调用 `print_odds()` 会不断读取新数字,直到遇到0。如果输入中没有0,程序会无限递归导致栈溢出。确保输入总是以0结尾。