我收到最大调用堆栈错误,但不知道为什么?

问题描述 投票:0回答:2
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 应该简单地返回小于或等于数字的最大素数。我知道我可以向后循环并在第一个素点处停止,但我什至无法让前进工作!

任何帮助将不胜感激,谢谢

javascript functional-programming
2个回答
0
投票

我不确定,但在操场上测试以下内容并且它有效:

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 会隐式地为您声明该变量。笔记, 然而,隐式声明的变量总是被创建为 全局变量,即使它们在函数体内使用。

摘自这里


0
投票

没错,深层递归会导致堆栈溢出,这是正常的,因为堆栈内存非常有限。 只需使用循环,如果您迭代数组,尽管您可能需要一个堆栈(数组)来保存数组、它们当前的迭代索引和每个数组的其他状态。

const isPrime = number => {
  let currNum = 2;
  while(true){
    if(currNum === number) return true;
    if(number % currNum === 0) return false;
    currNum++;
  }
}

console.log(isPrime(1231233));

© www.soinside.com 2019 - 2024. All rights reserved.