我正在学习动态编程,我在创建递归代码时观察到,有时我们先检查越界条件,然后检查其他基本情况,有时我们先检查其他基本情况,然后再检查越界情况- 约束条件。我如何知道选择哪个订单?
例如,问题的条件可能如下排序:
if (i < 0 || j < 0 || i >= matrix.length || j >= matrix[0].length)
{
return Integer.MAX_VALUE;
}
if (i == matrix.length - 1)
{
return matrix[i][j];
}
而在其他情况下,首先进行
i == matrix.length - 1
检查:
if (i == matrix.length - 1)
{
return matrix[i][j];
}
if (i < 0 || j < 0 || i >= matrix.length || j >= matrix[0].length)
{
return Integer.MAX_VALUE;
}
在解决递归问题时,我很困惑何时选择使用哪种条件顺序。
在这种特定情况下,这没有什么区别,因为它们检查的值不重叠。
i == matrix.length - 1
检查 i
是否是矩阵中的最后一个元素i < 0 || j < 0 || i >= matrix.length || j >= matrix[0].length
检查以确保 i/j 在矩阵的限制内。例如,4x4 矩阵的
i
和 j
的长度均为 4
if (i == matrix.length - 1)
将是 if (i == 3)
if (i < 0 || j < 0 || i >= matrix.length || j >= matrix[0].length)
将是 if (i < 0 || j < 0 || i >= 4 || j >= 4)
注意第一个 if 语句仅检查索引 3,而另一个 if 语句检查除 0-3 之外的所有索引。
仅当基本情况可能包含越界值时,这些 if 语句的顺序才重要。例如,如果将
i == matrix.length - 1
检查写为 i >= matrix.length - 1
,那么首先对其进行排序将导致程序对 matrix
进行索引越界。
我个人会把越界检查放在第一位,因为我更清楚这只是一个安全检查,但这只是意见。