试图从递归方法中删除辅助计数器变量

时间:2013-06-27 16:30:55

标签: java recursion

Project Euler 15(破坏者): enter image description here

我通过意识到它是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。这可能是一个简单的修复,但我现在还没有看到它。提前谢谢。

基本上我希望递归调用它们自己来跟踪计数,而不是任何实际的计数器。

3 个答案:

答案 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;
}