You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
        }
    }
}

问题分析

  1. 多if无互斥,递归后代码仍执行:第一个if调用递归后,后续if语句会继续执行,导致同一层递归多次输出和调用递归,产生冗余。
  2. 布尔变量控制失效:Java是值传递,修改durum不会影响上层递归的变量值,无法正确切换递减/递增阶段。
  3. 数值处理逻辑错误: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);
    }
}

修复说明

  1. 拆分阶段逻辑:把递减和递增拆成两个独立的递归方法,避免流程混乱,每个方法只处理单一阶段的逻辑。
  2. 明确终止条件:递减阶段到-4停止,递增阶段到初始值停止,避免不必要的递归调用。
  3. 避免冗余执行:每个递归调用后通过return终止当前方法,不会触发后续冗余代码。

内容的提问来源于stack exchange,提问作者TERSNOKTA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 23:53:25