递归以打印矩阵中的所有路径

时间:2015-02-23 15:28:23

标签: java algorithm recursion

我遇到了解决方案HERE。有人可以解释这是如何工作的。特别是,我无法理解的一件事是递归调用。其中一个new ArrayList<>(path)被传递,而在其他传递中只传递path。为什么?解决方案之间的工作正常。

public class Main {

    public static void getPaths(int[][]A, int i, int j, ArrayList<Integer> path, ArrayList<ArrayList<Integer>> allPaths) {
        int n = A.length;
        if (i>=n || j>=n) return;

        path.add(A[i][j]);

        if (i==n-1 && j==n-1) {
            allPaths.add(path);
            return;
        }
        getPaths(A, i, j+1, new ArrayList<>(path), allPaths);
        getPaths(A, i+1, j, path, allPaths);
    }

    public static void main(String[] args) {
        ArrayList<ArrayList<Integer>> allPaths = new ArrayList<>();
        getPaths(new int[][] { {1,2,3},{4,5,6},{7,8,9}}, 0,0, new ArrayList<Integer>(), allPaths );
        System.out.println(allPaths);
    }
}

2 个答案:

答案 0 :(得分:3)

创建到目前为止的路径副本并在第一个递归调用中传递,以便可以将更多条目添加到路径中。我们不需要在第二次调用中传递它,因为第二次调用将添加的任何条目都是第一个调用路径的一部分。

答案 1 :(得分:1)

它们代表了与当前路径不同的两条路径。因此,新的ArrayList&lt;&gt;(路径)用于在一个方向上创建当前路径的副本,只传递路径以完成另一个方向上的当前路径。

基本上因为你想要完成两个不同的pahts,你不能使用当前的一个在同一个数组中插入两个不同的路径。因此,您在其中一个调用中传递副本,以将该路径放在不同的内存区域中,以便可以独立计算当前点上分离的两个路径。