const isPrime = (number) => {
return count = (currNum = 2) => {
if(currNum === number) {
return true;
}
if(number%currNum === 0) {
return false;
} else {
return count(currNum+1);
}
}
}
const largestPrime = (number) => {
let currLargest = 0;
return count = (currNum = 2) => {
if(currNum > number) {
return currLargest;
} else {
if(isPrime(currNum)()){
currLargest = currNum;
}
console.log(currLargest);
return count(currNum+1);
}
}
}
学习函数式编程并练习递归、柯里化和闭包。
isPrime(5)()
返回 true,isPrime(6)()
返回 false
然而,当我运行largestPrime时,我遇到了调用堆栈错误。
2 未捕获的范围错误:超出最大调用堆栈大小 计数 (REPL13:2:18) 计数时 (REPL13:9:14) 计数时 (REPL13:9:14) 计数时 (REPL13:9:14) 计数时 (REPL13:9:14) 计数时 (REPL13:9:14) 计数时 (REPL13:9:14) 计数时 (REPL13:9:14) 计数时 (REPL13:9:14) 计数时 (REPL13:9:14)
currLargest 按预期显示,这意味着它命中的第二秒 return count(currNum+1); 它陷入错误。我的代码有什么问题导致无限循环吗?我已经检查了一会儿,但我看不出有什么问题。它特别令人困惑,因为 isPrime 的结构与largestPrime 类似,并且 isPrime 正在按预期工作。
largestPrime 应该简单地返回小于或等于数字的最大素数。我知道我可以向后循环并在第一个素点处停止,但我什至无法让前进工作!
任何帮助将不胜感激,谢谢
我不确定,但在操场上测试以下内容并且它有效:
const isPrime = (number) => {
return count = (currNum = 2) => {
if(currNum === number) {
return true;
}
if(number%currNum === 0) {
return false;
} else {
return count(currNum+1);
}
}
}
const largestPrime = (number) => {
let currLargest = 0;
return count2 = (currNum = 2) => {
if(currNum > number) {
return currLargest;
} else {
if(isPrime(currNum)()){
currLargest = currNum;
}
return count2(currNum+1);
}
}
}
console.log(largestPrime(555)())
基本上,用与第一个不同的另一个名称重命名内部函数。
我已经开发 JS 8 年以上了,现在会搜索一下发生了什么。
你能检查一下吗?等待有人给出正确的解释。
更新
解释如下:
如果您为未声明的变量赋值 var ,JavaScript 会隐式地为您声明该变量。笔记, 然而,隐式声明的变量总是被创建为 全局变量,即使它们在函数体内使用。
摘自这里
没错,深层递归会导致堆栈溢出,这是正常的,因为堆栈内存非常有限。 只需使用循环,如果您迭代数组,尽管您可能需要一个堆栈(数组)来保存数组、它们当前的迭代索引和每个数组的其他状态。
const isPrime = number => {
let currNum = 2;
while(true){
if(currNum === number) return true;
if(number % currNum === 0) return false;
currNum++;
}
}
console.log(isPrime(1231233));