为什么在此代码中使用“ n--”运算符会引发错误?

时间:2019-04-16 01:55:20

标签: javascript recursion operators decrement

此代码有效:

function factorial(n){
  if(n==0){
   return 1;
  }else{
   return n* factorial(n-1);
  }
};

console.log(factorial(5));

这不是:

function factorial(n){
  if(n==0){
   return 1;
  }else{
   return n* factorial(n--);
  }
};

console.log(factorial(5));

我正在使用递归来进行简单的挑战“阶乘”。有人可以向我解释为什么我必须使用'n-1',而当我使用'n--'时却给我'RangeError:超出了最大调用堆栈大小。'

2 个答案:

答案 0 :(得分:2)

如果您使用过

return n* factorial(n--);

这样做是将n减1,而n--表达式的计算结果是在减之前 n的值。这称为递减。

let n = 3;
console.log(n--);

虽然可以使用

return n* factorial(--n);

称为pre-decrecrement,它将递减n并使表达式的计算结果为n的值 递减后,重新分配{{1} }到这里-毕竟,您在递归调用之后就无法访问它。 (已经评估了递归调用之前的n,但是在调用递归函数时更改n* 看起来很容易引起混淆。)调用{{1 }}与n配合使用可使代码的意图更加清晰,因此应首选:

factorial

答案 1 :(得分:-1)

您需要在变量前面加上'-',否则代码将在变量传递后执行它

function factorial(n){
  if(n==0){
   return 1;
  }else{
   return n* factorial(--n);
  }
};

console.log(factorial(5));