Project Euler 15(破坏者):
我通过意识到它是central binomial coefficients的序列来解决这个问题。另一个好方法是通过dynamic programming。尽管如此,以递归的方式表现得如此自然,无论如何我都是这样做的。
这是我的解决方案:
public long getNumberOfPaths()
{
getPaths(board[0][0]); //2D array of Positions
return count; //instance member (long)
}
private void getPaths(Position p)
{
if (p.hasDown())
{
getPaths(p.getDown());
}
if (p.hasRight())
{
getPaths(p.getRight());
}
if ((p.getRow() == board.length - 1) && (p.getColumn() == board.length -1))
{
count++;
}
}
注意:电路板尺寸为:1 + inputSize,因此在这种情况下为21,因为我们有20x20网格。这是因为解决上述2x2问题等同于解决3x3问题,而是通过正方形而不是在其边界上行进。
getPaths(Position p)
的逻辑是:尽可能长时间地走下去,然后尽可能地向右走。一旦你点到右下方Position
,在路径数量(count
)上加1,回到你上次下台的地方,而不是往下走,转而去(如果你不能走吧,再次回溯,等等)。重复过程。当然,递归本身就是跟踪所有这些。如果不清楚,或者有人想要使用工作代码,那么有两个小类here。向getPaths(Position p)
添加一些打印语句应该会让事情变得非常明显。
无论如何,这一切都正常,我的问题是如何在不使用count
的情况下实现这一点。再次,正如我上面所说,我知道有更好的方法来解决这个问题,这不是我的问题。我的问题是尝试获得与上面相同的功能,但不使用辅助变量。这意味着将getPaths(Position p)
从void
更改为使其返回long
。这可能是一个简单的修复,但我现在还没有看到它。提前谢谢。
基本上我希望递归调用它们自己来跟踪计数,而不是任何实际的计数器。
答案 0 :(得分:1)
我相信这应该有用
private long getPaths(Position p) {
return (p.hasDown() ? getPaths(p.getDown()) : 0) +
(p.hasRight() ? getPaths(p.getRight()) : 0) +
((p.getRow() == board.length - 1) && (p.getColumn() == board.length -1) ? 1 : 0);
}
答案 1 :(得分:1)
不使用辅助变量:
public long getNumberOfPaths()
{
return getPaths(new Position(0,0)); //2D array of Positions
}
private long getPaths(Position p)
{
long result= 0;
if (p.hasDown())
{
result+= getPaths(p.getDown());
}
if (p.hasRight())
{
result+= getPaths(p.getRight());
}
if ((p.getRow() == board.length - 1) && (p.getColumn() == board.length -1))
{
result+= 1;
}
return result;
}
然后试试这个:
private long getPaths(Position p)
{
return (p.hasDown() ? getPaths(p.getDown()) : 0) +
(p.hasRight() ? getPaths(p.getRight()) : 0) +
((p.getRow() == board.length - 1) &&
(p.getColumn() == board.length -1) ? 1 : 0);
}
答案 2 :(得分:0)
您只需更改方法签名即可将计数作为参数:
private long getPaths(Position p, long count) {
if (p.hasDown()) {
getPaths(p.getDown(), count);
}
if (p.hasRight()) {
getPaths(p.getRight(), count);
}
if ((p.getRow() == board.length - 1) && (p.getColumn() == board.length - 1)) {
count++;
}
return count;
}