多条if条件优化

时间:2016-11-13 18:16:28

标签: c algorithm arduino

我正在构建一个简单的C项目(对于arduino),我遇到过这个问题。实际上并不是那种语言特定的,它更像是算法优化。

所以,我需要检查传感器读数的X值。

If X <5 ...
else if x<10...
else if x<15...
else if x<20...

然后在每个子句中我都有相同的for循环,但迭代会根据X的值而改变。

从一般意义上讲,这些条件如何被统一的东西取代?我记得这些&#34;渐变&#34;或者&#34;练级&#34;高中的问题,但我们仍然使用if条款。

2 个答案:

答案 0 :(得分:2)

在下面的评论中,您已经说过(参考使用数组的条形下的第二个解决方案):

  

我实际上不需要第二个维度,因为值范围是在第一个维度/列中定义的(5 10 15 20等)

在这种情况下,它比下面的解决方案简单得多:

int loops = ((X / 5) + 1) * 5;

...假设Xint。这使用整数除法,它截断(例如,4 / 50),加1,然后将结果乘以5.这里只是对于现场示例,JavaScript中的相同内容(在JavaScript中,由于数字总是浮点数,我们必须添加一个地板方法,但你不需要在Java中使用它):

&#13;
&#13;
var X;
for (X = 0; X < 25; ++X) {
  var loops = (Math.floor(X / 5) + 1) * 5;
  console.log("X = " + X + ", loops = " + loops);
}
&#13;
&#13;
&#13;

  

然后在每个子句中我都有相同的for循环,但迭代会根据X的值而改变。

我将变量设置为迭代次数,然后将for循环放在if / else序列之后。

int loops;
if (X < 5) {
    loops = /*whatever*/;
} else if (X < 10) {
    loops = /*whatever*/;
} else if (X < 15) {
    loops = /*whatever*/;
// ...and so on...
} else {
    loops = /*whatever for the catch-all case*/;
}
for (int i = 0; i < loops; ++i) {
    // ...
}

如果您试图避开if / else,如果只有少量可能的传感器值,则可以使用switch代替if有些语言编译成跳转表,效率很高。

如果您希望将范围保留为数据而不是else / int[][] values = { {5, 500}, {10, 700}, {15, 800}, {20, 1200}, {0, 1500} // 0 is a flag value }; 序列,则可以使用值数组:

int[]

(我使用X < entry[0]数组,但它可能是一个很好的干净类实例。)

然后循环遍历数组,查找entry[0]为真的第一个条目(或0int loops = 0; // 0 will never be used, but the compiler doesn't know that for (int[] entry : values) { if (entry[0] == 0 || X < entry[0]) { loops = entry[1]; break; } } 的位置),以标记最后一个条目。

for

...后跟loop循环使用{{1}} s。

答案 1 :(得分:0)

由于您的间隔是5的乘积,因此可以将X除以5并将结果用作数组中的索引。

const size_t loops[] = {someval, anotherval, ..., lastval};
size_t i,  nloops = loops[X / 5];
for (i = 0; i < nloops; i++) {
    ...
}