簡體   English   中英

這個斐波那契實例中的原始 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 個索引。

謝謝!

PS這是我第一次在stackoverflow上發帖,如果有人對如何改進這篇文章有任何提示。 我會很感激的。

參數 num2 如何不斷更新到下一個數字。

實際上num2永遠不會更新。 然而,每次遞歸執行fib都會引入一個同名的變量。 它從調用者那里獲得它的價值。 一旦它具有該值,它就永遠不會改變。 但是,您獲得的具有該名稱num2的變量與對fib的調用一樣多。

現在注意如何進行遞歸調用:

fib(num2, num3, stop - 1);

然后檢查這些 arguments 是如何收到的:

function fib(num1, num2, stop) {

請注意,調用者的num3成為被調用者的num2的初始值。 這給人的印象是num2在整個程序中都在變化,但實際上每次“變化”發生時它都是一個新變量,並且初始值始終是num3在調用執行上下文中的值。

可視化

下圖中的每個“框”代表fib的單個執行上下文。 它是一組局部變量的容器。 這些保持不變,但對 function 進行了更深入的調用,因為將導致一組新變量的另一個上下文(容器):

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 |||||||
|     |     |     |     |     |     +----------------------------------+||||||
|     |     |     |     |     +-----------------------------------------+|||||
|     |     |     |     +------------------------------------------------+||||
|     |     |     +-------------------------------------------------------+|||
|     |     +--------------------------------------------------------------+||
|     +---------------------------------------------------------------------+|
+----------------------------------------------------------------------------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM