2016-10-11 3 views
-2

Я изучаю это возведение в степень Рекурсивный алгоритм, он работает хорошо. Но я не понимаю, почему это работает? Потому что я ожидаю, что всегда возвращает 1,1,1 ... если n даже потому, что a не умножается на return.
Когда я пытаюсь recPower(3,2) и печати шаг за шагом фактор, это будет так:Экспоненциальный рекурсивный

Но почему 3 выйдет?

def recPower(a, n): 
    # raises a to the int power n 
    if n == 0: 
     return 1 
    else: 
     factor = recPower(a, n//2) 
     if n%2 == 0: # n is even 
      return factor * factor 
     else:  # n is odd 
      return factor * factor * a 
+1

3 существует потому, что 1 * 1 * 3 == 3 – shuttle87

+0

Ваш алгоритм реализует именно это: 'a ** (2 * n) = (a ** n) * (a ** n)', 'a ** (2 * n + 1) = (a ** n) * (a ** n) * a'. Что именно вы не понимаете по этому поводу? – Julien

+0

«потому что a не умножается в обратном». В зависимости от того, что вы точно подразумеваете под этим, я бы сказал, что он делает в нижнем возврате: коэффициент коэффициента возврата * a'. – Evert

ответ

0

Просто следуйте шаг за шагом:

recPower(3, 2) 

n != 0 так идти вниз еще ветвь:

factor = recPower(3, 2//2) 

Который является:

recPower(3, 1) 

В этом шаге рекурсии n != 0 мы следуем за ветвями else else, 1%2 != 0, поэтому мы следуем за веткой второго. Поэтому коэффициент равен 1, и a == 3.

возвращаемое значение этого шага, следовательно:

factor * factor * a 

или

1 * 1 * 3 
+0

Спасибо, я полностью забыл, что 'n' будет равно 1 и вызовет последний' return'. Я просто слишком сильно фокусируюсь на начальном значении 'n'. – paulmassimo