我需要制作两个递归Java方法来计算二项式(n,k),并打印出n行Pascal三角形。递归地计算二项式是没有问题的,它工作正常。但是我如何制作一个递归方法来打印出来呢?不允许/ while循环。
使用两个for循环打印三角形没有问题,但我甚至不知道从哪里开始递归。有什么提示吗?
答案 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);
现在你必须想出另一个递归方法来重复调用这个方法并每次打印行。