2014-10-09 56 views
1

有人可以告訴我爲什麼這個Octave算法不執行最後一次迭代,其中i = 4和j = 2?它似乎受內部for循環中的中斷條件的影響,但這不應該影響最後一次迭代。八度算法循環迭代

x = [2, 3, 4]; 
h = [1, 2]; 
y = [0, 0, 0, 0]; 

for i = 1:4 
    for j = 1:2 
     printf("i = %d, j = %d\n", i, j); 
     if((i-j < 0) || (i-j > 2)) break; endif 
     y(i) = y(i) + h(j) * x(i-j+1); 
    endfor 
endfor 

我測試過它在我的Debian系統上,它停在我= 4和j = 1的輸出是:

i = 1, j = 1 
i = 1, j = 2 
i = 2, j = 1 
i = 2, j = 2 
i = 3, j = 1 
i = 3, j = 2 
i = 4, j = 1 

回答

2

你可能想要的是:

for i = 1:4 
    for j = 1:2 
     if ((0 <= i-j) && (i-j <= 2)) 
      printf("i = %d, j = %d\n", i, j); 
      y(i) = y(i) + h(j) * x(i-j+1); 
     endif 
    endfor 
endfor 

for i = 1:4 
    for j = 1:2 
     if ((i-j < 0) || (i-j > 2)) continue; endif 
     y(i) = y(i) + h(j) * x(i-j+1); 
     printf("i = %d, j = %d\n", i, j); 
    endfor 
endfor 

在你的代碼,當我== 4和j == 1的聲明

if((i-j < 0) || (i-j > 2)) break; endif 

跳躍走出最內層的循環。最外面的for循環已經完成(i == 4)並且程序結束。

參考文獻:

+0

這個答案非常明確和有幫助。偉大的工作和+1的替代方式做到這一點。先生,祝你好運!不幸的是,我沒有足夠的積分來投票。 – 2014-10-09 11:08:20

1

如果你所說的「破發」,這同樣是對在「endfor」之後跳躍。所以對於i = 4,j = 1(i-j)得到3,你稱之爲「break」,i = 4,j = 2永遠不會運行。看到「繼續」,因爲我認爲這是你想要的。

+0

啊,好極了!我的確打算執行繼續聲明。我猜我被它的工作情況i = 1,j = 2(其中i-j = -1)所迷惑,因爲它是在內部for循環迭代的末尾。非常感謝! – 2014-10-09 11:02:25

0

我用JavaScript運行了你的腳本。在這裏,我輸出了你的病情的結果。看起來像你寫的腳本按預期執行。

x = [2, 3, 4]; 
h = [1, 2]; 
y = [0, 0, 0, 0]; 
for(i=1; i<5;i++) { 
for(j=1;j<3;j++) { 
    console.log('i'+i+" j"+j); 
    console.log('i -j > 2 '+(i -j > 2)); 
    console.log('i-j < 0 '+(i-j < 0)); 
    if((i-j < 0) || (i -j > 2)) { break;} 
    y[i] = y[i] + h[j] * x[i-j+1]; 
} 
} 

在您的Chrome控制檯中執行它以驗證您的案例。

+0

是的,我打算使用continue語句而不是中斷。感謝您檢查,但! – 2014-10-09 11:09:55