基于数独验证示例理解箭头函数与.every()方法
数独验证代码逻辑拆解:箭头函数与.every()的妙用
嘿,我完全懂你盯着这段数独验证代码卡壳的感觉——尤其是看到那个乘积判断和后续的.every()部分的时候,我来给你掰扯得明明白白!
先搞懂那个核心判断函数p
先看这段代码:
p = a => eval(a.join("*")) == (1*2*3*4*5*6*7*8*9);
这是个箭头函数,作用是判断传入的数组a是不是包含了1-9的所有数字且没有重复。这里的核心逻辑是利用阶乘的唯一性:
- 右边的
1*2*3*...*9其实就是9的阶乘,结果是362880。 - 左边的
a.join("*")会把数组里的元素用*拼接成一个字符串(比如数组[1,2,3]会变成"1*2*3"),再用eval()执行这个字符串,得到数组所有元素的乘积。
为什么用乘积判断?因为数独的行/列/3x3宫格必须是1-9不重复的集合:
- 如果数组刚好是1-9各出现一次,乘积就等于9!;
- 如果有重复数字(比如出现两次2),乘积会是9!的2倍;
- 如果缺了某个数字(比如少了3),乘积会是9!除以3;
- 只要不符合“1-9不重复”的规则,乘积肯定不等于362880,函数就会返回
false。
再看.every()的作用
数独要有效,必须同时满足三个条件:
- 每一行都符合“1-9不重复”;
- 每一列都符合“1-9不重复”;
- 每一个3x3宫格都符合“1-9不重复”。
所以代码里应该是把所有的行、所有的列、所有的宫格都整理成一个大数组,然后调用.every(p)。这里的.every()方法会遍历大数组里的每一个元素(也就是每一行/列/宫格),逐个用函数p检验:
- 只有当每一个元素都通过
p的检验(返回true),整个.every()才会返回true,说明这是一个有效的数独; - 只要有任何一个行/列/宫格不满足,
.every()就会直接返回false,数独无效。
举个简单例子:如果某一行是[1,1,2,3,4,5,6,7,8],它的乘积是40320,不等于362880,p返回false,那.every()就会立刻判定整个数独无效,不用再检查其他行/列/宫格了。
小补充:这个方法的局限性
当然,这个逻辑有个前提——数独里的数字只能是1-9,要是出现0或者大于9的数字,乘积也会不对,但数独规则本来就限定了数字范围,所以这个判断是成立的。
内容的提问来源于stack exchange,提问作者Joe Lee
相关产品推荐
相关产品推荐

