-4

我正在用类编写递归方法。我根本没有得到我想要的输出。

public Result foo( cell, Result R )
{
    grid = createGrid( cell )
    if (grid.empty )
        return;
    else
    {
        // find best 2 cell.
        best_cells[] = findBestCell( grid );

        // saves best R found so far.
        R = updateResult( R );

        // call foo( best_cells[] );
        for ( every cell in best_cells[] )
            return foo( best_cells[i], R );
    }
    return R;
}

该方法在第一次条件if(grid.empty)下白蚁。true它不适用于其他细胞!这是为什么?我错过了退货吗?

更新 1:感谢 Thomas 的笔记。我将代码更改为:

public Result foo( cell, Result R )
{
    grid = createGrid( cell )
    if (grid.empty )
        return R;
    else
    {
        // find best 2 cell.
        best_cells[] = findBestCell( grid );

        // saves best R found so far.
        R = updateResult( R );

        // call foo( best_cells[] );
        for ( every cell in best_cells[] )
        {
            Result temp_R = foo( best_cells[i], R );
            if( temp_R.error < R.error )
                R = temp_R;
            }

    }
    return R;
}

我会测试它,然后再回复你们。

更新 2:以前的代码现在工作得很好。第一个输入 R 不能为 == null。否则会出现 NPE。

非常感谢托马斯!谢谢你们的评论:)

4

1 回答 1

0

如果没有更多信息和可编译代码,就很难判断错误出在哪里。但这里有一些提示:

if (grid.empty )
    return;

这里应该返回什么?作为R参数传递?

for ( every cell in best_cells[] )
   return foo( best_cells[i], R );

这将在第一次迭代后停止(best_cells[1]并且永远不会检查更高版本)。我猜你想以foo( best_cells[i], R )某种方式检查结果,然后决定是返回它还是继续迭代。

作为一般说明:如果您要求我们在您的代码中查找错误(而不仅仅是检查某些算法),您应该发布该代码而不是一些伪代码。否则几乎不可能发现任何实际错误。

另一个注意事项:你知道如何使用调试器吗?如果是这样,请启动一个检查您的代码做什么以及您期望它做什么。您很可能会很快找到出错的部分。

于 2013-08-27T07:39:51.697 回答