JavaScript: попытка понять оператор Else функции рекурсии, вычисляющей значение экспоненты

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

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 здесь. В операторе else, когда входной аргумент для показателя степени равен 2 или выше:

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


person PineNuts0    schedule 15.06.2019    source источник
comment
вызывает вашу функцию pow с аргументами, основанием и показателем степени - 1 и возвращает результат, умноженный на основание   -  person Jaromanda X    schedule 15.06.2019
comment
к вашему сведению, pow(x,0) возвращает x, но всегда должно возвращать 1 — вы можете исправить это, изменив базовый случай на if (exponent === 0) return 1   -  person Mulan    schedule 15.06.2019


Ответы (4)


Итак, если вы хотите вычислить `pow(2, 3) — это 2, возведенное в третью степень, или 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

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

person Scott Sauyet    schedule 15.06.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

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

person Mark    schedule 15.06.2019

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

F(n) в коде — pow(base, exponent), где n — основание, а m — показатель степени.

person Kamran Koupayi    schedule 15.06.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

person JSONaLeo    schedule 15.06.2019