javascript - JavaScript:使用递归检查数字是否为素数
问题描述
我对如何解决这个问题有点困惑。我需要所有素数才能返回真。如果不返回 false - 我看到我的逻辑包含 2 并且返回 0 所以它自动返回 false,因为 2 的余数为 0。
function isPrime(num, div = 2) {
// BASE CASE:
if(num <= div ) return false; // IF num less than OR equal to 2 RETURN false
// IF num MOD has a remainder of zero
if(num % 2 === 0) return false // RETURN false
return true; // RETURN true
// RECURSIVE CALL:
return isPrime(num)
}
console.log(isPrime(1)); //-> false
console.log(isPrime(2)); //-> true
console.log(isPrime(3)); //-> true
console.log(isPrime(4)); //-> false
解决方案
不需要递归。只需测试从 3 到数字平方根的所有奇数,作为获得最佳性能的可能因素。
function isPrime(num){
if(num === 2) return true;
if(num < 2 || num % 2 === 0) return false;
for(let i = 3; i * i <= num; i += 2)
if(num % i === 0) return false;
return true;
}
如果你真的需要使用递归,可以通过接受一个因子作为第二个参数并在递归时将其递增 2 来实现上述想法。
function isPrime(num, div = 3){
if(num === 2) return true;
if(num < 2 || num % 2 === 0) return false;
if(div * div > num) return true;
if(num % div === 0) return false;
return isPrime(num, div + 2);
}
推荐阅读
- api - PostMan 正在工作,但 http 在颤动中出现 404 错误
- class - 防止客户直接实例化我的具体类
- ios - 如何在 iOS 13+ 中获取对状态栏的引用?
- reactjs - Effective element movement on keystroke in React
- mysql - 使用 2 个计数功能连接三个表
- msbuild - 使用 cc.net 和 msbuild 设置程序集文件版本和程序集版本
- python - 运行 Python 和 tkinter 的最低系统要求
- linux - Visual Studio 的“Docker 调试”无法安装 linux 包,但是发布/发布解决并安装包
- java - 如何打印括号内的字符串列表?
- variables - Rust 服务器必须保存变量的更新值