JavaScript: попытка понять утверждение Else рекурсивной функции, вычисляющей значение экспоненты - PullRequest
2 голосов
/ 15 июня 2019

Я хочу вычислить показатели, используя рекурсию.У меня есть код ниже, который выполняется успешно.

function pow(base, exponent) {

  if (exponent <= 1){
    return base
  }

  else {
    return base * pow(base, exponent-1)
  }
}

// console.log(pow(3, 5)); // -> answer is 243

Я пытаюсь понять другой случай здесь.В операторе else, когда входной аргумент для показателя степени равен 2 или выше:

, что возвращает pow(base, exponent-1) часть return base * pow(base, exponent-1)?Соответствует ли это базовому значению?

Ответы [ 4 ]

2 голосов
/ 15 июня 2019

Так что, если вы хотите вычислить `pow (2, 3) - то есть 2 повышается до 3-й степени или 8 - эта функция делает

                                                       (if)
                                         since 1 <= 1 ------+
                               (else)                       |
                   since 2 > 1 ------+                      |
                                     |                      |
            (else)                   |                      |
since 3 > 1 ------,                  |                      |
                  V                  V                      V
       pow(2, 3) ---> 2 * pow(2, 2) ---> 2 * 2 * pow(2, 1) ---> 2 * 2 * 2 -> 8

В этом суть рекурсии: вызов функции внутри одной и той же функции (или, по крайней мере, где-то в стеке вызовов; см. Примеры взаимной рекурсии) с использованием данных, которые в некотором смысле проще; так что в конечном итоге вы попали в базовый вариант, который вы можете рассчитать без таких вызовов.

1 голос
/ 15 июня 2019

Учтите, что 2 ** 3 == 2 * (2 ** 2) и 2 ** 2 == 2 * (2 ** 1)

Подстановка дает:

2 ** 3 == 2 * 2 * (2 ** 1)

Это все, что делает ваша рекурсивная функция.Когда вы звоните:

pow(2, 3)

Это превращается в:

base * pow(2, 2)

pow(2, 2) превращается в:

 base * pow(2, 1)

Заменить дает:

base * base * pow(2, 1)

pow(2, 1) - это ваш базовый случай, равный base, поэтому в итоге вы получите

pow(2, 3) === base * base * base

Одним из лучших инструментов для понимания рекурсии является отладка.Просто пройдитесь и посмотрите, как меняются значения и что в стеке.

0 голосов
/ 15 июня 2019

Это функция рекурсии. Рассмотрим рекурсивную функцию F (n) в математике. F (n, m) = n * F (n, m-1), F (n, 1) = n. Итак, код просто реализует эту функцию.

F (n) в коде - это pow (основание, показатель степени), где n является основанием, а m - показателем.

0 голосов
/ 15 июня 2019

В каждой рекурсии функция вызывается на 1 меньше, чем первоначально пройденный показатель степени.

pow(base, exponent-1)

, по сути, с обратным отсчетом от своего начального значения до 1, и в этот момент она удовлетворяет условию, когда прекращает рекурсиюи возвращает только базу.

if (exponent <= 1){
    return base
}

, поэтому, если вы передадите pow (3, 4),

рекурсия 1 (pow(3,4)): 3 * // 3

рекурсия 2 (pow(3,3)): 3 * // 9

рекурсия 3 (pow(3,2)): 3 * // 27

рекурсия 4 (pow(3,1)): 3 = // 81

...