递归时Return(1)的作用是什么?
What does Returning (1) during recursion accomplish?
所以我很难理解递归,我不明白 returning 1 作为最后一步如何结束以下代码。为什么 returning 1 作为最后一步不将“1”分配给 return 值而不是“27”?
我试着自己写出伪代码来解释它,但尝试让我意识到我真的不知道发生了什么。如果除了解释之外,还提供了一些伪代码,那就太棒了。谢谢。
function solveExponent(num, exp) {
if (exp === 0) {
// this causes the stack to well you know exceed the limit
// letsReturnOne();
return 1; // so i don't understand how this is any different
}
return num * solveExponent(num, exp - 1);
}
alert(solveExponent(3, 3));
function letsReturnOne() {
return 1;
}
alert(letsReturnOne());
当你有这样的代码时
if (exp === 0) {
letsReturnOne();
}
从letsReturnOne
编辑的值return将return编辑为solveExponent
,但由于该值被忽略,solveExponent
继续执行它会调用 solveExponent
和 exp
作为 -1
的下一个语句。从此exp
永远为负,永远达不到0
。这就是为什么你的递归永远不会结束。
相反,return 由 letsReturnOne()
编辑的值 return 像这样
if (exp === 0) {
return letsReturnOne();
}
由于letsReturnOne
编辑的值return立即被return编辑,solveExponent
将不会执行其中的其余语句,当exp
等于 0.
函数计算输入的实际递归方式是这样的,
solveExponent(3, 3)
3 * solveExponent(3, 2)
3 * (3 * solveExponent(3, 1))
3 * (3 * (3 * solveExponent(3, 0)))
此时,exp
为0
,所以我们return1
,这称为递归的基本情况。
3 * (3 * (3 * 1))
3 * (3 * 3)
3 * 9
27
letsReturnOne
中的 return
只有 return 来自 letsReturnOne
的一个值。它不会隐含地影响 solveExponent
内部的流程,因此如果没有额外的 return,solveExponent
只会继续 运行 直到它再次调用自身的最后一行。
对letsReturnOne
的调用只是一个计算结果为1
的表达式,所以
if (exp === 0) {
letsReturnOne();
}
等同于
if (exp === 0) {
1;
}
这就是调用 return 1;
或只调用 1;
的区别。
所以我很难理解递归,我不明白 returning 1 作为最后一步如何结束以下代码。为什么 returning 1 作为最后一步不将“1”分配给 return 值而不是“27”?
我试着自己写出伪代码来解释它,但尝试让我意识到我真的不知道发生了什么。如果除了解释之外,还提供了一些伪代码,那就太棒了。谢谢。
function solveExponent(num, exp) {
if (exp === 0) {
// this causes the stack to well you know exceed the limit
// letsReturnOne();
return 1; // so i don't understand how this is any different
}
return num * solveExponent(num, exp - 1);
}
alert(solveExponent(3, 3));
function letsReturnOne() {
return 1;
}
alert(letsReturnOne());
当你有这样的代码时
if (exp === 0) {
letsReturnOne();
}
从letsReturnOne
编辑的值return将return编辑为solveExponent
,但由于该值被忽略,solveExponent
继续执行它会调用 solveExponent
和 exp
作为 -1
的下一个语句。从此exp
永远为负,永远达不到0
。这就是为什么你的递归永远不会结束。
相反,return 由 letsReturnOne()
编辑的值 return 像这样
if (exp === 0) {
return letsReturnOne();
}
由于letsReturnOne
编辑的值return立即被return编辑,solveExponent
将不会执行其中的其余语句,当exp
等于 0.
函数计算输入的实际递归方式是这样的,
solveExponent(3, 3)
3 * solveExponent(3, 2)
3 * (3 * solveExponent(3, 1))
3 * (3 * (3 * solveExponent(3, 0)))
此时,exp
为0
,所以我们return1
,这称为递归的基本情况。
3 * (3 * (3 * 1))
3 * (3 * 3)
3 * 9
27
letsReturnOne
中的 return
只有 return 来自 letsReturnOne
的一个值。它不会隐含地影响 solveExponent
内部的流程,因此如果没有额外的 return,solveExponent
只会继续 运行 直到它再次调用自身的最后一行。
对letsReturnOne
的调用只是一个计算结果为1
的表达式,所以
if (exp === 0) {
letsReturnOne();
}
等同于
if (exp === 0) {
1;
}
这就是调用 return 1;
或只调用 1;
的区别。