You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于数独验证示例理解箭头函数与.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:30:20