我正在尝试实施an algorithm that is specified using some C style pseudocode。
算法的大部分是for
循环:
for (i = 20;i > 0;i -= 2)
{
//...snip
}
声称循环十次次:
整个系列的修改是一系列10个相同的双轮。
我已将算法移植到我自己的语言中,我的结果与测试向量不匹配。因此,我试图挑选出C语言的细节,以便弄清楚我可能做错了什么。
也许我的代码与测试向量的结果不匹配的原因是它应该只运行 9 次:
| i | i -= 2 | i > 0 | Perform iteration |
|----|--------|-------|-------------------|
| 20 | 18 | Yes | Yes - 1 |
| 18 | 16 | Yes | Yes - 2 |
| 16 | 14 | Yes | Yes - 3 |
| 14 | 12 | Yes | Yes - 4 |
| 12 | 10 | Yes | Yes - 5 |
| 10 | 8 | Yes | Yes - 6 |
| 8 | 6 | Yes | Yes - 7 |
| 6 | 4 | Yes | Yes - 8 |
| 4 | 2 | Yes | Yes - 9 |
| 2 | 0 | No | No |
如果我在逻辑上阅读if
语句,它只会被执行九次。
为什么他们说它运行十次轮次仍然存在混淆,但是然后使用 20 作为初始值。
我尝试复制我看到的逻辑(执行次数少于记录的次数),但我的结果仍然不匹配。不幸的是,我无法访问任何功能代码来将我的结果与已知良好的实现进行比较。所以我可能会咆哮错误的树。
我吵了一棵错误的树吗?
答案 0 :(得分:2)
for循环进行"初始化,测试,身体,增量,测试,身体,增量,测试,身体等。"在第一次测试之前不会应用增量。
答案 1 :(得分:2)
{/ 1}}条件的第三部分在迭代后执行。
循环运行10次,for
为20,18,16,14,12,10,8,6,4,2为每次迭代的主体。
答案 2 :(得分:0)
顺便说一句,如果你想在 for 循环中从最后一个元素到第一个元素,但又不想要丑陋的:
for (let i = arr.length - 1; i >= 0; i--)
您可以使用:
for (let i = arr.length; i-- > 0;)
示例:
const arr = ['a', 'b', 'c'];
for (let i = arr.length; i-- > 0;) {
console.log(`arr[${i}] is: ${arr[i]}`);
}
如果您在这里使用了预递减,最后一次迭代(数组的第一个元素)就会丢失:
const arr = ['a', 'b', 'c'];
for (let i = arr.length; --i > 0;) {
console.log(`arr[${i}] is: ${arr[i]}`);
}