如何优雅地判断 N 个布尔值是否全部相等?

795 阅读1分钟
原文链接: zhuanlan.zhihu.com
原问题:www.zhihu.com/question/52…,原来是指定 JavaScript 的。

原答案:

return arr.indexOf(!arr[0])<0;

(题图 Photo by Jessica Ruscello

在这里尝试用逻辑说明原理。


假设数组定义为 \{a_i:0\le i < n\}

Array.prototype.indexOf()可以搜寻 x是否存在于数组,即判断 \exists i(a_i=x)。如果 x 存在,返回该索引( i >= 0),如果不存在,该函数在返回 -1。

然后我们需要检查所有元素是否相等,那么等价于检查所有元素是否等于第一个元素,取反一下:

\forall i (a_i=a_0) \\
\Leftrightarrow \neg \neg \forall i (a_i=a_0)\\
\Leftrightarrow \neg \exists i(a_i \ne a_0)

由于问题需求刚好是布尔数组,所以 a_i \ne a_0 \Leftrightarrow a_i=\neg a_0,那么就可变换为:

\neg \exists i (a_i=\neg a_0)

Array.prototype.indexOf() 的好处是原生提供的,而且是很直接的做最多 n 次相等测试,所以应该比以脚本自行实现快。但这个解答仅限于布尔数组才能使用。