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
相关产品推荐
相关产品推荐

