嵌入式之二分法
二分法
代码实现
以下是一个简单的例子:根据ADC值查找对应温度值
1 | unsigned short ADC_Table[101] = { |
问题
- 二分法为什么会陷入死循环?
判断条件选取的不对,多一个 =
就有可能陷入死循环;另外数组最好为单数,双数极可能陷入死循环
- 为什么
while (left <= right)
用<=
不用<
?
因为 right
的值为 数组元素个数 - 1
,这时 left
与 right
是可以相等的
- 为什么取中间数要写成
int mid = left + (right - left) / 2;
这样?
因为若 left + right
很大的时候会发生整形溢出,这样写可以尽量避免
- 为什么判断条件写成
if (arr[mid] >= x && arr[mid + 1] <= x)
这样?
因为数组元素为 unsigned short
型,不会出现浮点数,且数组元素不是等差为1的等差数列,不是非此即彼,可能会出现 arr[mid] >= x && arr[mid + 1] <= x
这种情况
- 建议:遇到死循环将
left
right
mid
打印出来看看,以判断死循环原因
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 龙猫知识库!