在线编译器 C

#include <stdio.h> void print_a_to_b(int a, int b){ if(a>=b){ if(a==b){ printf("%d",a); return; }printf("%d",a); return print_a_to_b(a-1,b); } if(a<b){ if(a==b){ printf("%d",a); return; }printf("%d",a); return print_a_to_b(a+1,b); } } int main() { int m,n; scanf("%d%d",&m,&n); print_a_to_b(m,n); return 0; }
这段代码定义了一个递归函数 `print_a_to_b`,它的目标是从整数 a 打印到整数 b。函数内部根据 a 和 b 的大小关系,分别处理递减(a >= b)和递增(a < b)两种情况。每次递归调用前会先打印当前的 a 值,然后向 b 靠近一步。主函数读取两个整数并调用该函数。

代码存在一个问题:当 a 和 b 相等时,函数会打印一次数字并返回,但递归终止条件被重复检查了两次(分别在 a>=b 和 a<b 的分支里),导致逻辑冗余。另外,在 a>=b 的分支中,如果 a 不等于 b,打印后递归调用 `print_a_to_b(a-1,b)`,但这里没有处理 a 和 b 相等的情况,实际上相等的情况已经在前面处理了,所以逻辑上可行,但代码不够简洁。

- 检查递归终止条件:当 a 和 b 相等时,只需要打印一次并返回,不需要再进入递归。当前代码在两个分支中都检查了 a==b,但可以简化。
- 注意递归调用的方向:在 a>=b 时,每次 a 减 1;在 a<b 时,每次 a 加 1。确保递归能最终到达 a==b 的情况,避免无限递归。