我必须创建函数以返回一个加到指数的数字。我用循环解决了这个问题:
function pow(x, n) {
let result = 1;
// multiply result by x n times in the loop
for (let i = 0; i < n; i++) {
result *= x;
}
return result;
}
我看到了另一个为此使用递归的函数。我知道递归可以包含一个调用自身的函数,但是在这种情况下,结果如何最终添加到“堆栈”中并返回正确的答案?不管我怎么想,我都无法理解这个小功能的工作原理。
一个简单的类比也许会有所帮助-有什么想法吗?当我尝试运行脑海中的函数时,这没有任何意义:/
function pow(x, n) {
if (n == 1) {
return x;
} else {
return x * pow(x, n - 1);
}
}
alert( pow(2, 3) ); // 8
答案 0 :(得分:2)
让我们介绍一些操作。
PUSH X
将X压入堆栈。
MULTIPLY
将从堆栈中弹出两件事,将它们相乘并将结果推回堆栈中。
调用我们将以缩进形式描述的函数。
我们将堆栈本身描述为像[ A, B, C ]
这样的数组,其中C
是最后被压入堆栈的内容(即:堆栈的“顶部”)。
我将在执行指令后编写指令,然后写出堆栈的状态:
要计算A * B
:
堆栈最初是空的[]
。
PUSH A [ A ]
PUSH B [ A, B ]
MULTIPLY [ A*B ]
这会将A和B的乘积留在堆栈中。
要计算A * (B * C)
PUSH A [A]
PUSH B [A, B]
PUSH C [A, B, C]
MULTIPLY [A, B*C]
MULTIPLY [A*B*C]
现在您知道了表示法,让我们看一下如何计算pow(2,3)
我将?
写为“我们尚不知道,因为我们尚未扩展函数调用的作用。”
PUSH 2 [2]
pow(2,2) [2, ?]
MULTIPLY [2*?]
尚未发生MULTIPLY。我们只是窥视未来。请注意有一个?结果。我们不知道调用pow(2,2)
时会发生什么,但是无论发生什么情况,我们都只会发出一条MULTIPLY
指令。
现在让我们用pow(2,2)
的实际用法来扩展时间表:
PUSH 2 [2]
PUSH 2 [2, 2]
pow(2,1) [2, 2, ?]
MULTIPLY [2, 2*?]
MULTIPLY [2*2*?]
请注意,我们尚未完成扩展工作。我们实际上并没有深入研究pow(2,1)
所做的事情,但是我们只推2,然后在调用完成后再次发出MULTIPLY
指令。
现在,最后让我们扩展pow(2,1)
的作用。它只是推送一个值-不再进行任何函数调用:
PUSH 2 [2]
PUSH 2 [2, 2]
PUSH 2 [2, 2, 2]
MULTIPLY [2, 2*2]
MULTIPLY [2*2*2]
如果您只是去除缩进并评估表达式,剩下的就是它是如何使用堆栈计算值的抄本。
PUSH 2 [2]
PUSH 2 [2, 2]
PUSH 2 [2, 2, 2]
MULTIPLY [2, 4]
MULTIPLY [8]
请注意,通常,对于pow(x,n)
,该机器将执行PUSH X
n 次,之后执行MULTIPLY
n-1 次。
答案 1 :(得分:1)
我将为您提供的功能提供一个非常简单的摘要,并提供一些注释,以帮助解释发生的情况:
function pow(x, n) {
// This is your terminating condition to stop the recursion and return
// your "result" since you are at the "end" of your calls
if (n == 1) {
return x;
} else {
// If you aren't going to end stop, then you need to multiply the value
// being raised to an exponent by itself (and and reduce the exponent)
// (this is the equivalent of decrementing your iterator in the loop function)
return x * pow(x, n - 1);
}
}
现在,如果您遍历正在发生的一系列呼叫,您会看到类似以下的内容:
pow(2, 3)
2 * pow(2, 2)
2 * 2 * pow(2, 1)
2 * 2 * 2
答案 2 :(得分:0)
pow(x,n)变成x*pow(x,n-1)
,当n-2 = 1时变成x*x*pow(x,n-2)
,变成x*x*x
。