Java递归函数return语句问题:输出冗余不符合预期
Java递归函数冗余输出问题修复
需求逻辑
从输入值开始,每次减5直到得到-4,之后每次加5回到初始值:
- 16 → 11 → 6 → 1 → -4
- -4 → 1 → 6 → 11 → 16
预期与实际输出
- 预期输出:
16 11 6 1 -4 1 6 11 16 - 实际输出:
16 11 6 1 -4 1 6 11 16 6 11 16 1 6 11 16 6 11 16 11 16 16
原代码
import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner input = new Scanner(System.in); int a = input.nextInt(); int tempA = a; boolean durum = true; dondur(a, tempA, durum); } public static void dondur(int a, int tempA, boolean durum) { if (a >= -5 && durum == true) { System.out.println(a); dondur(a - 5, tempA, durum); } if (a < 0) { a = a + 10; } if (a <= tempA) { durum = false; System.out.println(a); dondur(a + 5, tempA, durum); } if (a > tempA) { return; } } }
问题分析
- 多if无互斥,递归后代码仍执行:第一个if调用递归后,后续if语句会继续执行,导致同一层递归多次输出和调用递归,产生冗余。
- 布尔变量控制失效:Java是值传递,修改
durum不会影响上层递归的变量值,无法正确切换递减/递增阶段。 - 数值处理逻辑错误:
a < 0时加10的操作打乱了递增阶段的数值序列,导致后续递归的数值混乱。
修复后的代码
import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner input = new Scanner(System.in); int initial = input.nextInt(); // 先执行递减阶段 decrement(initial); // 再执行递增阶段(从-4开始,到初始值结束) increment(-4, initial); } // 递减阶段:从当前值减5,直到-4 private static void decrement(int num) { System.out.println(num); if (num == -4) { return; } decrement(num - 5); } // 递增阶段:从当前值加5,直到等于初始值 private static void increment(int num, int initial) { if (num == initial) { System.out.println(num); return; } System.out.println(num); increment(num + 5, initial); } }
修复说明
- 拆分阶段逻辑:把递减和递增拆成两个独立的递归方法,避免流程混乱,每个方法只处理单一阶段的逻辑。
- 明确终止条件:递减阶段到-4停止,递增阶段到初始值停止,避免不必要的递归调用。
- 避免冗余执行:每个递归调用后通过return终止当前方法,不会触发后续冗余代码。
内容的提问来源于stack exchange,提问作者TERSNOKTA
相关产品推荐
相关产品推荐

