有人可以告诉我为什么这个Octave算法不执行i = 4和j = 2的最后一次迭代?它似乎受到内部for循环中的break条件的影响,但这不应该影响最后一次迭代。
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系统上对它进行了测试,它在i = 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
答案 0 :(得分: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
在你的代码中,当i == 4且j == 1时,语句
if((i-j < 0) || (i-j > 2)) break; endif
会跳出最里面的for循环。最外层的for循环已经完成(i == 4),程序结束。
参考文献:
答案 1 :(得分:1)
如果你打电话给“休息”,这同样是在“endfor”之后跳跃。因此,对于i = 4,j = 1(i-j)得到3,你称之为“break”而i = 4,j = 2永远不会运行。请参阅“继续”,因为我认为这就是您想要的。
答案 2 :(得分: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控制台中执行它以验证您的案例。