原始 num2 如何在此斐波那契实例中更新?
How is the original num2 updated in this fibonacci instance?
我得到了一个代码实例,希望我能对其进行解释。
function fib(num1, num2, stop) {
var num3 = num1 + num2;
console.log(num3);
if(stop === 0) {
return;
}
fib(num2, num3, stop - 1);
}
fib(0, 1, 6)
虽然我似乎明白了所有这些,但我似乎无法理解参数 num2 是如何不断更新到下一个数字的。
- 在这个代码实例中,我们假设根据斐波那契序列记录数字,直到并包括第 6 个索引。
谢谢!
P.S。这是我第一次 post 在 Whosebug 上,如果有人有任何关于如何改进这个 post 的提示。非常感谢。
how does the parameter num2 keeps being updated to the next number.
实际上 num2
永远不会更新。但是,fib
的每次递归执行都会引入一个具有相同名称的 new 变量。它从调用者那里获得它的价值。一旦它具有该值,它就永远不会改变。但是你得到的变量名称 num2
与对 fib
.
的调用一样多
现在注意递归调用是如何进行的:
fib(num2, num3, stop - 1);
然后检查这些参数是如何收到的:
function fib(num1, num2, stop) {
注意调用者的num3
,成为调用的num2
的初始值。这样在整个程序中给人的感觉是num2
变化,但实际上每次发生“变化”时都是一个新变量,初始值总是[=17] =] 在调用执行上下文中。
可视化
下图中的每个“框”代表 fib
的单个执行上下文。它是一组局部变量的容器。在对函数进行更深入的调用时,这些保持不变,因为 that 将为一组新变量生成另一个上下文(容器):
fib(0, 1, 6)
+-------- new execution context ---------------------------------------------+
| // num1 = 0, num2 = 1, stop = 6 |
| var num3 = num1 + num2; // = 1 |
| fib(num2, num3, stop - 1); |
| +------ new execution context ----------------------------------------+|
| | // num1 = 1, num2 = 1, stop = 5 ||
| | var num3 = num1 + num2; // = 2 ||
| | fib(num2, num3, stop - 1); ||
| | +------ new execution context ---------------------------------+||
| | | // num1 = 1, num2 = 2, stop = 4 |||
| | | var num3 = num1 + num2; // = 3 |||
| | | fib(num2, num3, stop - 1); |||
| | | +------ new execution context --------------------------+|||
| | | | // num1 = 2, num2 = 3, stop = 3 ||||
| | | | var num3 = num1 + num2; // = 5 ||||
| | | | fib(num2, num3, stop - 1); ||||
| | | | +------ new execution context -------------------+||||
| | | | | // num1 = 3, num2 = 5, stop = 2 |||||
| | | | | var num3 = num1 + num2; // = 8 |||||
| | | | | fib(num2, num3, stop - 1); |||||
| | | | | +------ new execution context ------------+|||||
| | | | | | // num1 = 5, num2 = 8, stop = 1 ||||||
| | | | | | var num3 = num1 + num2; // = 13 ||||||
| | | | | | fib(num2, num3, stop - 1); ||||||
| | | | | | +------ new execution context -----+||||||
| | | | | | | // num1 = 8, num2 = 13, stop = 0 |||||||
| | | | | | +----------------------------------+||||||
| | | | | +-----------------------------------------+|||||
| | | | +------------------------------------------------+||||
| | | +-------------------------------------------------------+|||
| | +--------------------------------------------------------------+||
| +---------------------------------------------------------------------+|
+----------------------------------------------------------------------------+
我得到了一个代码实例,希望我能对其进行解释。
function fib(num1, num2, stop) {
var num3 = num1 + num2;
console.log(num3);
if(stop === 0) {
return;
}
fib(num2, num3, stop - 1);
}
fib(0, 1, 6)
虽然我似乎明白了所有这些,但我似乎无法理解参数 num2 是如何不断更新到下一个数字的。
- 在这个代码实例中,我们假设根据斐波那契序列记录数字,直到并包括第 6 个索引。
谢谢!
P.S。这是我第一次 post 在 Whosebug 上,如果有人有任何关于如何改进这个 post 的提示。非常感谢。
how does the parameter num2 keeps being updated to the next number.
实际上 num2
永远不会更新。但是,fib
的每次递归执行都会引入一个具有相同名称的 new 变量。它从调用者那里获得它的价值。一旦它具有该值,它就永远不会改变。但是你得到的变量名称 num2
与对 fib
.
现在注意递归调用是如何进行的:
fib(num2, num3, stop - 1);
然后检查这些参数是如何收到的:
function fib(num1, num2, stop) {
注意调用者的num3
,成为调用的num2
的初始值。这样在整个程序中给人的感觉是num2
变化,但实际上每次发生“变化”时都是一个新变量,初始值总是[=17] =] 在调用执行上下文中。
可视化
下图中的每个“框”代表 fib
的单个执行上下文。它是一组局部变量的容器。在对函数进行更深入的调用时,这些保持不变,因为 that 将为一组新变量生成另一个上下文(容器):
fib(0, 1, 6)
+-------- new execution context ---------------------------------------------+
| // num1 = 0, num2 = 1, stop = 6 |
| var num3 = num1 + num2; // = 1 |
| fib(num2, num3, stop - 1); |
| +------ new execution context ----------------------------------------+|
| | // num1 = 1, num2 = 1, stop = 5 ||
| | var num3 = num1 + num2; // = 2 ||
| | fib(num2, num3, stop - 1); ||
| | +------ new execution context ---------------------------------+||
| | | // num1 = 1, num2 = 2, stop = 4 |||
| | | var num3 = num1 + num2; // = 3 |||
| | | fib(num2, num3, stop - 1); |||
| | | +------ new execution context --------------------------+|||
| | | | // num1 = 2, num2 = 3, stop = 3 ||||
| | | | var num3 = num1 + num2; // = 5 ||||
| | | | fib(num2, num3, stop - 1); ||||
| | | | +------ new execution context -------------------+||||
| | | | | // num1 = 3, num2 = 5, stop = 2 |||||
| | | | | var num3 = num1 + num2; // = 8 |||||
| | | | | fib(num2, num3, stop - 1); |||||
| | | | | +------ new execution context ------------+|||||
| | | | | | // num1 = 5, num2 = 8, stop = 1 ||||||
| | | | | | var num3 = num1 + num2; // = 13 ||||||
| | | | | | fib(num2, num3, stop - 1); ||||||
| | | | | | +------ new execution context -----+||||||
| | | | | | | // num1 = 8, num2 = 13, stop = 0 |||||||
| | | | | | +----------------------------------+||||||
| | | | | +-----------------------------------------+|||||
| | | | +------------------------------------------------+||||
| | | +-------------------------------------------------------+|||
| | +--------------------------------------------------------------+||
| +---------------------------------------------------------------------+|
+----------------------------------------------------------------------------+