我正在读一些算法的代码,然后它有这个for循环,我不明白,
for (v = destination; v != source; v = parent[v])
{
u = parent[v];
residualGraph[u][v] -= pathFlow;
residualGraph[v][u] += pathFlow;
}
它与我见过的常规for循环不同(抱歉noob问题),但是当我用下面的代码测试代码时,它给了我ArrayIndexOutOfBoundsException
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8};
for (int v = 8; v != 1; v = arr[v])
{
System.out.println(v);
}
有人可以解释这个for循环的作用吗?
答案 0 :(得分:1)
将它重构为while循环,可能会让你更容易理解:
v = destination; //for loop initialization
while (v != source){ //for loop termination condition
//for loop body
u = parent[v];
residualGraph[u][v] -= pathFlow;
residualGraph[v][u] += pathFlow;
v = parent[v]; //for loop "increment"
}
答案 1 :(得分:1)
This tutorial可能会帮助您了解for循环的每个部分代表什么:
for语句的一般形式可表示如下:
for (initialization; termination; increment) { statement(s) }
使用此版本的for语句时,请记住:
- 初始化表达式初始化循环;当循环开始时,它被执行一次。
- 当终止表达式的计算结果为false时,循环终止。
- 每次迭代循环后调用increment表达式;这个表达式增加或减少一个值是完全可以接受的。
对于ArrayIndexOutOfBoundsException
,您会看到在System.out.println(v);
打印v
的初始值后,v = arr[v]
会尝试将v
设置为{ {1}}(在“增量”步骤中)。但是,Java数组是零索引的,因此在8个元素的数组中,第8个元素的数组将为7,任何更大的索引(例如8)将导致arr[8]
。
我不认为原始的for循环意味着在你解释它时迭代一个数组,所以你应该重新检查原始代码的预期用途和上下文。