2016-11-30 62 views
1

我很難說這個問題。所以我只是用一個例子來說明。嵌套for循環使用j = i + 1 vs j = 1?

說我有以下數組:A = {5,8,1,3,2,6},它的大小n = 6,索引在A [0 ... 5]。

我想運行某種掃描,以便在從左到右的遍歷中比較每個值與其相鄰的值。以下兩個運行嵌套for循環的代碼片段之間有什麼區別?

// snippet 1, using i to take the first and j to take whatever is next to i. 
for i <- 0 to n-2 do 
    for j <- i+1 to n-1 do 
     // do the scanning, comparing, etc.... 


//snippet 2 using i to take the first and j to take the second. 
for i <- 0 to n-2 do 
     for j <- 1 to n-1 do 
      // do the scanning, comparing, etc.... 

我認爲它們完全一樣,在筆/紙測試中我找不到任何區別。有一個嗎?

+2

'(I + 1)...(N-1)'應比'1產生不同的值..第(n-1)'。 –

+0

@ cricket_007請詳細說明。怎麼樣? – Callat

+1

在第一個循環中'i == j'從來沒有一個實例 –

回答

2

好吧,讓我們走過一個運行在那裏n = 3

// snippet 1, using i to take the first and j to take whatever is next to i. 
for i <- 0 to n-2 do 
    for j <- i+1 to n-1 do 
     // do the scanning, comparing, etc.... 

第一次迭代(的最外層循環):

i = 0j = 1

i = 0j = 2

第二次迭代:

i = 1 and j = 2

完成!

//snippet 2 using i to take the first and j to take the second. 
for i <- 0 to n-2 do 
     for j <- 1 to n-1 do 
      // do the scanning, comparing, etc.... 

第一次迭代:

i = 0j = 1

i = 0j = 2

第二次迭代:

i = 1j = 1

i = 1j = 2

請注意片段2的第二次迭代的區別?

+0

哇!我不敢相信我錯過了那個。用'j < - 1'。 j從1開始,每當循環重新開始添加額外的計算,比較等時,但是用'j < - i + 1'。我可以確保j在我之前不會開始,因爲我從左到右!非常感謝 !!!! – Callat

+1

@KazRodgers正確,很高興這有幫助。 – mascoj

+0

巨大。我在看兩個相關的算法,而j的值是將它們分開的唯一的東西。我盯着那一天半,無法理解這種差異。 – Callat

3

在第一個中,j從下一個值i開始計數。

例如:i = 1, j = 2 | i = 2, j = 3

在第二個,你將從1計數,不管i的值。換句話說,變量i對變量j沒有影響。

兩者都可以有它們的用途,但這一切都取決於你如何使用這些數組元素。

+0

因此它們是相同的,除了第一個構建對j的依賴關係而第二個允許j在它自己的功能上運行? – Callat

+0

是的,差不多吧。 – SenselessCoder

1

兩者都構建數組元素對。有兩種不同的想法來定義不同的配對:

1)一對只有在包含不同元素時纔是唯一的。 (A[i], A[j]) == (A[j], A[i])

2)如果元素的順序不同,一對是唯一的。 (A[i], A[j]) <> (A[j], A[i])

另外,片斷2也把(A[i], A[i])爲一對(當i == j),不包括(A[0], A[0])(A[n - 1], A[n - 1])

相關問題