怎么用javascript正则表达式判断质数
导读:本文共1775.5字符,通常情况下阅读需要6分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 示例perl-wle'print"Prime"if(1xshift)!~/^1?$|^(11+?)\1+$/'[number]翻译成JS代码如下functionisPrime(n){return!/^1?$|^(11+?)\1+$/.test("1".repeat(n))}代码逻辑非常简单,生成&quo... ...
目录
(为您整理了一些要点),点击可以直达。翻译成JS代码如下
代码逻辑非常简单,生成"1" * n
长度的字符串,通过/^1?$|^(11+?)\1+$/
正则表达式进行判断,再将结果取反
上面正则表达式有2个分支,分别是
/^1?$
^(11+?)\1+$
分支1 逻辑很简单,就是匹配0或者1个 "1"
,因为要排除数字1
(非质数)
分支2 就有意思了,可以拆成2块来看
^(11+?)
\1+$
表达式1,非贪婪模式下匹配 "11" "111" "1111"....
,作为一个分组
表达式2,\1
代表将表达式1匹配的结果赋值给\1
,判断是否结尾,否的话会触发回溯(因为表达式1可能匹配多种情况)
举个例子就更清晰了,比如传入n = 9,分支1不满足可以直接忽略^(11+?)\1+$
经过上述的分析,不难发现,其实回溯就是将数字不断除于2、3、4....,最后检查是否有余数,没有的话就匹配成功(非质数),非常简单粗暴的穷举法
仔细看正则匹配的过程分析,其实step 3 ~ step 4
的回溯完全没有必要,那么正则可以改写成这样/^1?$|^(11+?)\1+?$/
,将\1+
改成非贪婪模式\1+?
,那么就放弃step 4回溯
耗时上减少了接近一半
怎么用javascript正则表达式判断质数的详细内容,希望对您有所帮助,信息来源于网络。