2015-03-08 2 views
1

Для упражнения я должен выполнить код, демонстрирующий рекурсию в python.Рекурсия в Python с показателями

мне было дано и код, и сказал, чтобы закончить его так, что, например, 4^2 = 16

def raise_to_power(base_val, exponent_val): 
    if exponent_val == 0: 
     result_val = 1 
    else: 
     result_val = base_val * #start entering code here 

    return result_val 

user_base = 4 
user_exponent = 2 

print('%d^%d = %d' % (user_base, user_exponent, 
     raise_to_power(user_base, user_exponent))) 

Я знаю, что они хотят, чтобы я сделал, но я не знаю, как выразить Это. Я попытался сделать base_val ** exponent_val, но он говорит о недопустимом синтаксисе. Он также говорит, что не использовать функцию math.pow().

Может кто-нибудь помочь мне понять это? Мне очень трудно найти рекурсию. Функция изменения

+2

вы должны вызвать raise_to_power рекурсивно , –

+3

Вы должны решить проблему взамен, поэтому ваша функция 'raise_to_power' должна снова называть себя в какой-то момент. Возможно, это (http://www.cs.utah.edu/~germain/PPS/Topics/recursion.html) помогает понять концепцию. – SmCaterpillar

+0

Да, но как бы назвать это рекурсивно @AnttiHaapala – Elsa

ответ

1

Простое изменение кода. Это похоже на ваш код.

def raise_to_power(base_val, exponent_val): 
    if exponent_val == 0: 
     return 1 
    else: 
     return base_val * raise_to_power(base_val, exponent_val-1) 

user_base = 4 
user_exponent = 2 

print('%d^%d = %d' % (user_base, user_exponent, 
     raise_to_power(user_base, user_exponent))) 
1

к:

def raise_to_power(base_val, exponent_val): 
    return base_val * raise_to_power(base_val, exponent_val - 1) if exponent_val else 1 

в рекурсивных функциях, которые вы должны вызвать функцию снова внутри тела функции и установить одно или несколько условий, чтобы разорвать рекурсивные вызовы функции.

Для лучшего понимания вы можете использовать dis.dis, чтобы увидеть анализ CPython байткод разобрав его:

>>> dis.dis(raise_to_power) 
    2   0 LOAD_FAST    1 (exponent_val) 
       3 POP_JUMP_IF_FALSE  27 
       6 LOAD_FAST    0 (base_val) 
       9 LOAD_GLOBAL    0 (raise_to_power) 
      12 LOAD_FAST    0 (base_val) 
      15 LOAD_FAST    1 (exponent_val) 
      18 LOAD_CONST    1 (1) 
      21 BINARY_SUBTRACT  
      22 CALL_FUNCTION   2 
      25 BINARY_MULTIPLY  
      26 RETURN_VALUE   
     >> 27 LOAD_CONST    1 (1) 
      30 RETURN_VALUE   

А для дополнительной информации read more about recursion on WIKI.

+0

Я не знаю, поможет ли прямое решение без объяснения причин, почему это случай, когда дело доходит до образования и домашнего задания. – SmCaterpillar

+0

Спасибо за ваш ответ. Я не понимаю, что ваш ответ делает. Поэтому он вызывает функцию и почему сделал make exponent_val-1? – Elsa

+0

Что нарушает вызов функции? Почему ты бы так поступил? Спасибо за редактирование. – Elsa

1

Рекурсивная Функция:

Рекурсия является способом программирования задачи, в которых функция вызывает себя один или несколько раз в своем теле. Обычно возвращается возвращаемое значение этого вызова функции. Link


Простой пример, чтобы добавить число от 5 до 0 с помощью рекурсивного вызова:

Код:

def addNumbers(n): 
    print "Debug 1: n=%d"%(n) 
    if n==0: 
     print "Debug 2: n=%d"%(n) 
     return 0 
    else: 
     print "Debug 3: n=%d"%(n) 
     ans = n + addNumbers(n-1) 
    print "Debug 4: n=%d, ans=%d"%(n, ans) 
    return ans 

add_nos = addNumbers(5) 
print "\nFinal Addition:", add_nos 

Выход:

$ python 4.py 
Debug 1: n=5 
Debug 3: n=5 
Debug 1: n=4 
Debug 3: n=4 
Debug 1: n=3 
Debug 3: n=3 
Debug 1: n=2 
Debug 3: n=2 
Debug 1: n=1 
Debug 3: n=1 
Debug 1: n=0 
Debug 2: n=0 
Debug 4: n=1, ans=1 
Debug 4: n=2, ans=3 
Debug 4: n=3, ans=6 
Debug 4: n=4, ans=10 
Debug 4: n=5, ans=15 

Final Addition: 15 
Смежные вопросы