此代码有效:
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:超出了最大调用堆栈大小。'
答案 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));