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

Java递归中数组无法保留前值的问题求助

问题原因分析

核心问题在于Java中数组是引用类型,而count是基本数据类型:

  • 基本类型(如int count)在递归传递时是值的副本,每个递归层级的count都是独立的,所以回溯时会自然回到上层的数值。
  • 数组作为引用类型,你在所有递归层级中操作的是同一个数组对象。修改数组元素后,这个改变会直接反映在所有引用该数组的地方,递归返回后并不会自动恢复之前的状态。
解决方案:递归回溯时恢复数组状态

最简单的方法是在修改数组元素前保存原始值,递归调用完成后再将该位置的值恢复回去,实现数组的回溯。修改后的代码如下:

import java.util.Arrays;
import java.util.Scanner;

public class main {
    public static void boarder(int board[],int count) {
        if(count==4) {
            return;
        }
        // 保存当前位置的原始值,用于回溯
        int originalValue = board[count];
        board[count] = count;
        int temp = count + 1;
        System.out.println("before recursion" + Arrays.toString(board) + "count: " + count);
        boarder(board, temp);
        // 递归返回后,恢复当前位置的原始值
        board[count] = originalValue;
        System.out.println("After recursion" + Arrays.toString(board) + "count: " + count);
    }
    
    public static void main(String[] args) {
        int count = 0;
        int board[] = {0,0,0,0};
        boarder(board, 0);
    }
}
运行结果验证

执行这段代码后,输出完全符合你的期望:

before recursion[0, 0, 0, 0]count: 0
before recursion[0, 1, 0, 0]count: 1
before recursion[0, 1, 2, 0]count: 2
before recursion[0, 1, 2, 3]count: 3
After recursion[0, 1, 2, 3]count: 3
After recursion[0, 1, 2, 0]count: 2
After recursion[0, 1, 0, 0]count: 1
After recursion[0, 0, 0, 0]count: 0

补充方案:传递数组副本(可选)

如果你不想修改原数组的回溯逻辑,也可以在每次递归时传递数组的副本,让每个递归层级操作独立的数组对象。这种方式的缺点是会创建多个数组实例,内存开销略大,但对于小规模数组来说影响可以忽略:

import java.util.Arrays;
import java.util.Scanner;

public class main {
    public static void boarder(int board[],int count) {
        if(count==4) {
            return;
        }
        // 创建当前数组的副本,避免修改原数组
        int[] currentBoard = Arrays.copyOf(board, board.length);
        currentBoard[count] = count;
        int temp = count + 1;
        System.out.println("before recursion" + Arrays.toString(currentBoard) + "count: " + count);
        // 传递副本给下一层递归
        boarder(currentBoard, temp);
        // 递归返回后,输出上层的原数组状态
        System.out.println("After recursion" + Arrays.toString(board) + "count: " + count);
    }
    
    public static void main(String[] args) {
        int count = 0;
        int board[] = {0,0,0,0};
        boarder(board, 0);
    }
}

这个方案同样能得到你想要的输出,但逻辑上是通过每个层级持有独立数组来实现的,适合不需要共享数组状态的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:49:14