在Java中递归打印Pascal的三角形

时间:2015-11-09 10:13:31

标签: java recursion pascals-triangle

我需要制作两个递归Java方法来计算二项式(n,k),并打印出n行Pascal三角形。递归地计算二项式是没有问题的,它工作正常。但是我如何制作一个递归方法来打印出来呢?不允许/ while循环。

使用两个for循环打印三角形没有问题,但我甚至不知道从哪里开始递归。有什么提示吗?

2 个答案:

答案 0 :(得分:0)

提示:如果你有一行整数,比如

1 3 3 1

你可以通过将两个列表按元素相加来生成下一行:一个是前置0的,另一个是附加0的。

0 1 3 3 1

1 3 3 1 0 +

1 4 6 4 1

所以,尝试使用,例如一个ArrayList来存储一行,并根据这个想法在每个递归调用中修改这个ArrayList。

答案 1 :(得分:0)

以下是如何在没有递归或迭代的情况下打印单行:

private void printRow(List<Integer> row) {
    System.out.println(row);
}    

除了打印行之外,还需要一个函数来根据当前行构造下一行。您可以通过将当前行上的迭代器传递到递归方法L:

来完成此操作
// previous is the previous value we iterated over, initially null.
void constructRow(Integer previous, Iterator<Integer> currentRow, List<Integer> nextRow) {
    if (nextRow.isEmpty()) { 
        // each row must start with a 1
        nextRow.add(1);
        // if there are no more elements in the current row then we are done
        if (!currentRow.hasNext()) {
            return;
        }
    }
    if (currentRow.hasNext()) {
        Integer current = currentRow.next();
        // the first time previous == null, skip the row.add and recurse
        if (previous != null) {
            // add the previous and current value to get the next value
            nextRow.add(previous + current);
        }
        constructRow(current, currentRow, nextRow);
    }
    else {
        // the iteration is done, just add a 1 to the end
        nextRow.add(1);
    }
}

您可以这样称呼:

List<Integer> nextRow = new ArrayList<>();
constructRow(null, row.iterator(), nextRow);

现在你必须想出另一个递归方法来重复调用这个方法并每次打印行。