Не могу понять, почему параметр изменяется во время рекурсии в функции Фибоначчи JS - PullRequest
0 голосов
/ 12 января 2019

В настоящее время изучаю JS.

Не можете выяснить, в какой момент параметр этой функции "prev1" каким-то образом изменился во время рекурсии? Если «console.log (prev1)» на каждой итерации «prev1» фактически изменяется, хотя ни в одном из приведенных ниже кодов, похоже, этот параметр не изменяется. Пожалуйста, помогите мне понять это.

        function fibonacci(n, prev1, prev2){
          //console.log(prev1);
          var current = prev1 + prev2;
          var fibonacci_string = current + " ";

          if(n > 1)
              fibonacci_string += fibonacci(n - 1, current, prev1);
          return fibonacci_string;

        }
        console.log(fibonacci(10, 1, 0));

console.log (PREV1):

1
1
2
3
5
8
13
21
34
55

Ответы [ 5 ]

0 голосов
/ 12 января 2019

Это рекурсивная функция, в каждой итерации параметры имеют разные значения: В первой итерации prev1=1, prev2=0 Вторая итерация: prev1=prev1+prev2=1, prev2=prev1=1 Третья итерация: prev1=prev1+prev2=2, prev2=prev1=1 Четвертая итерация: prev1=prev1+prev2=3, prev2=prev1=2 Пятая итерация: prev1=prev1+prev2=5, prev2=prev1=3

0 голосов
/ 12 января 2019

prev1 - параметр рекурсивной функции. Каждый раз, когда вызывается функция, создается новый контекст выполнения с собственным набором идентификаторов. Регистрация идентификаторов подразумевает привязку значений, передаваемых вызову функции (аргументам), с параметрами функции. В приведенном примере вызов происходит по адресу:

fibonacci(n - 1, current, prev1);

prev1 является вторым параметром функции fibonacci, поэтому он связан со вторым аргументом, передаваемым вызову (значение переменной current).

0 голосов
/ 12 января 2019

Если вы посмотрите на рекурсивный вызов:

           fibonacci(n - 1, current, prev1)
  // calls:          ⬇️      ⬇️      ⬇️
  function fibonacci(n,     prev1,   prev2)

вы можете видеть, что prev1 получает значение предыдущего current.

0 голосов
/ 12 января 2019

Как вы можете видеть в вашем операторе if, есть еще один вызов fibonacci() со вторым параметром current, который является суммой prev1 и prev2. Таким образом, в основном в этом операторе if, когда вы вызываете fibonacci(), он снова входит в ту же функцию, поэтому код переходит к определению функции, которое function fibonacci(n, prev1, prev2), где prev1 обозначает 2-й переданный параметр, откуда бы вы его не вызывали функция: в этом случае второй передаваемый вами параметр был current.

0 голосов
/ 12 января 2019

prev1 - аргумент функции Фибоначчи. Когда линия

fibonacci_string += fibonacci(n - 1, current, prev1);

называется current, имеет место prev1 и предоставляется в качестве аргумента функции Фибоначчи. prev1 - не фактическая переменная, это просто заполнитель для значения, которое будет получено функцией. Если вместо prev1 вы зададите значение 5, то внутри функции prev1 будет иметь значение 5 и будет обрабатываться соответствующим образом. В приведенном выше коде значение current имеет место для prev1, когда оно вызывается рекурсивно, и как изменяется значение current, вы можете увидеть тот.

...