2014-10-06 56 views
-1

我讀了一些代碼,一些算法,那麼它有這樣的循環,我不明白,這對於循環在java中做什麼?

for (v = destination; v != source; v = parent[v]) 
{ 
    u = parent[v]; 
    residualGraph[u][v] -= pathFlow; 
    residualGraph[v][u] += pathFlow; 
} 

從正常的循環,我已經看到了(抱歉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開始,所以您正在獲取數組超出範圍的異常。從0開始,以7結尾,並且它將被編譯。 – Compass 2014-10-06 15:54:57

+1

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/for.html – 2014-10-06 15:55:16

+0

那麼你關心哪個循環?後面的一個被認爲是中斷的,因爲它開始於'v [8]',但是v的索引只從'0..7' – Alnitak 2014-10-06 15:55:26

回答

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

This tutorial可能會幫助您瞭解的,對於循環的每個部分代表:

的一般形式for語句可表示如下:

for (initialization; termination; increment) { 
    statement(s) 
} 

當使用此版本for for sta請記住:

  • 初始化表達式初始化循環;它會在循環開始時執行一次。
  • 當終止表達式計算結果爲false時,循環終止。
  • 增量表達式在循環的每次迭代之後被調用;這個表達式增加或減少一個值是完全可以接受的。

至於ArrayIndexOutOfBoundsException,你會看到,經過System.out.println(v);打印v初始值,v = arr[v]將嘗試設置varr[8](在「增量」步驟)。然而,Java數組是零索引的,所以在一個8元素的數組中,第八元素的數組將是7,並且任何更大的索引(例如8)都將導致ArrayIndexOutOfBoundsException

我不認爲原始for循環意味着迭代數組,因爲您已經解釋了它,所以您應該重新檢查原始代碼的預期用途和上下文。