[python-brasil] Potenciação com recursividade

1,953 views
Skip to first unread message

victor_heuer

unread,
Dec 16, 2009, 12:44:41 PM12/16/09
to python...@yahoogrupos.com.br
Alguém poderia me ajudar a orrigir e completar uma função para a potenciação com recursividade.

O código que eu fiz é o seguinte:

#Função recursiva que calcula a potência de um número real
def pot(x,y):
if y == 0:
return 1
else:
return x * pot(x,y-1)

#Programa principal
x = float(input('Digite um valor para x: '))
y = float(input('Digite um valor para y: '))
print(x, 'elevado a', y, 'é:')
pot(x,y)

Não sei se o código está certo. O professor definiu como função pot(x,y) onde x é base e y expoente. Sei que em Python há o pow(x,y) quando usada a biblioteca "math", mas não tenho certeza se ela deve ser usada neste caso.
Quando eu rodo o programa ele não retorna nenhum valor, nem mesmo quando y = 0.

Nota: usei x*pot(x,y-1) uma vez que x**y = x*x**(y-1) para fazer a recursão a função. udei uma lógica parecida para o caso do fatorial e deu certo e aqui não vai.

------------------------------------

,-----------------------------------------------------------.
| Antes de enviar um e-mail para o grupo leia: |
| http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar |
| E se você é usuário do BOL lembre-se de cadastrar o |
| e-mail do grupo na lista branca do seu sistema anti-spam. |
`-----------------------------------------------------------´Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/python-brasil/

<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@yahoogrupos.com.br

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html


Adriano Ogata

unread,
Dec 16, 2009, 1:21:59 PM12/16/09
to python...@yahoogrupos.com.br
> print(x, 'elevado a', y, 'é:')
> pot(x,y)

print("%f elevado a %f eh: %f" % x, y, pot(x, y))


Faltou mandar exibir o resultado.

Og!

Luciano Ramalho

unread,
Dec 17, 2009, 7:23:10 PM12/17/09
to python...@yahoogrupos.com.br
2009/12/16 victor_heuer <victor...@yahoo.com.br>:

> Alguém poderia me ajudar a orrigir e completar uma função para a potenciação com recursividade.
>
> O código que eu fiz é o seguinte:
>
> #Função recursiva que calcula a potência de um número real
> def pot(x,y):
>    if y == 0:
>        return 1
>    else:
>        return x * pot(x,y-1)
>
> #Programa principal
> x = float(input('Digite um valor para x: '))
> y = float(input('Digite um valor para y: '))
> print(x, 'elevado a', y, 'é:')
> pot(x,y)
>
> Não sei se o código está certo. O professor definiu como função pot(x,y) onde x é base e y expoente. Sei que em Python há o pow(x,y) quando usada a biblioteca "math", mas não tenho certeza se ela deve ser usada neste caso.
> Quando eu rodo o programa ele não retorna nenhum valor, nem mesmo quando y = 0.
>
> Nota: usei x*pot(x,y-1) uma vez que x**y = x*x**(y-1) para fazer a recursão a função. udei uma lógica parecida para o caso do fatorial e deu certo e aqui não vai.

Você não precisa usar pot do módulo math: existe o operador ** em
Python, que faz potenciação.

Uma outra forma recursiva de fazer potenciação com expoentes inteiros,
bem mais eficiente, é esta:

def pot(x, n):
if n == 0:
return 1
y = pot(x, n/2)
if n % 2:
return y * y * x
else:
return y * y

Aqui o expoente vai sendo sucessivamente dividido por 2, então o
número de multiplicações em ponto flutuante realizadas é proporcional
a log(n, 2) e não a n. Ou seja, se o expoente é da ordem de 1000, o
método do seu professor vai fazer umas 1000 multiplicações, enquanto
que o método acima vai fazer umas 10.

Além de mais eficiente, este método é mais preciso, porque operações
com ponto flutuante costumam introduzir imprecisões, então quanto
menos forem realizadas, melhor.

[ ]s
Luciano

Reply all
Reply to author
Forward
0 new messages