计算的“状态”必须通过参数传递。所以,你需要更多的参数,而不仅仅是int[] previous
行。
通常情况下,您希望使用2种方法,一种是具有更简单接口的公共方法,另一种是实际执行计算的私有方法。
在你的榜样,这两种方法会是这样的:
public int[] pascal(int[] previous) { ... call the next overload ... }
private int[] pascal(... all the state needed ...) { ... recursive call or return the value ... }
一个最简单的方法是通过正在计算新的行应作为计算的下一个位置的指数递归函数中的参数。所以,你应该有:
private int[] pascal(int[] previous, int currentIndex, int[] row) { ... }
现在,你的递归函数通常有2个(或更多)的情况。对于这一点,你将有两种情况:
- 如果“CURRENTINDEX”是过去,你需要计算,我们已经完成了最后一个索引 - 只返回该行,因为它是现在;
- 否则,计算当前索引的值,将其放入行中,并进行递归调用,以继续计算(通过决定是否已完成,或者再次计算并再次调用,... )
让我们这些代码两种情况:
private int[] pascal(int[] previous, int currentIndex, int[] row) {
if (currentIndex == previous.length) {
return row;
} else {
// do some part of the calculation
// and make a recursive call that would continue the calculation:
return pascal(previous, ????, row);
}
}
你看这是为什么递归函数的结构?
好了,到真正的计算:
private int[] pascal(int[] previous, int currentIndex, int[] row) {
if (currentIndex == previous.length) {
return row;
} else {
int currentValue = previous[currentIndex - 1] + previous[currentIndex];
row[currentIndex] = currentValue;
return pascal(previous, currentIndex, row);
}
}
计算完成。现在你只需要让你的“简单”函数用适当的参数调用你的递归函数:
public int[] pascal(int[] previous) {
int rowSize = previous.length + 1;
int[] row = new int[rowSize];
row[0] = 1;
row[rowSize - 1] = 1;
return pascal(previous, 1, row);
}
就是这样。如你所见,“诀窍”就是在参数中保留“状态”。在这里,currentIndex
就像您原来的for
循环中的int i
一样。
是否递归某种作业需求?似乎迭代更简单很多。 – Ryan 2013-02-26 04:21:31