programando em python recursao

Download Programando em python   recursao

If you can't read please download the document

Upload: samuelthiago

Post on 19-Jun-2015

541 views

Category:

Entertainment & Humor


6 download

TRANSCRIPT

  • 1. Python: RecursoClaudio Esperana

2. Recurso um princpio muito poderoso para construo dealgoritmos A soluo de um problema dividido em Casos simples: So aqueles que podem ser resolvidos trivialmente Casos gerais: So aqueles que podem ser resolvidos compondo solues decasos mais simples Semelhante prova de teoremas por induo Casos simples: O teorema verdadeiro trivialmente Casos genricos: so provados assumindo-se que todos os casos mais simples tambm so verdadeiros 3. Funo recursiva Implementa um algoritmos recursivo onde a soluo dos casosgenricos requerem chamadas prpria funo Uma funo recursiva a maneira mais direta (mas nonecessariamente a melhor) de se resolver problemas de naturezarecursiva ou para implementar estruturas de dados recursivas Considere, por exemplo, a definio da seqncia de Fibonacci: O primeiro e o segundo termo valem 0 e 1, respectivamente O i-simo termo a soma do (i-1)-simo e o (i-2)-simo termo >>> def fib(i): if i==1: return 0 elif i==2: return 1 else: return fib(i-1)+fib(i-2) >>> for i in range(1,11): print fib(i), 0 1 1 2 3 5 8 13 21 34 4. Exemplo: Busca binria Um exemplo clssico de recurso o algoritmo conhecidocomo busca binria que usado para pesquisar um valor emuma lista ordenada Chamemos de imin e imax os ndices mnimo e mximo dalista onde a busca ser feita Inicialmente, imin = 0 e imax =len(lista)-1 O caso base corresponde a imin == imax Ento, ou o valor igual a lista [imin] ou no est na lista Seno, podemos dividir o intervalo de busca em dois Seja meio = (imin+imax)/2 Se o valor maior que lista [meio] , ento ele se encontraem algum dos ndices entre meio+1 e imax Caso contrrio, deve se encontrar em algum dos ndicesentre imin e meio 5. Busca binria: implementaodef testa(lista,valor):def busca_binaria(imin,imax):if imin==imax: return iminelse:meio=(imax+imin)/2if valor>lista[meio]:return busca_binaria(meio+1,imax)else:return busca_binaria(imin,meio)i = busca_binaria(0,len(lista)-1)if lista[i]==valor:print valor,"encontrado na posicao",ielse:print valor,"nao encontrado">>> testa([1,2,5,6,9,12],3)3 nao encontrado>>> testa([1,2,5,6,9,12],5)5 encontrado na posicao 2 6. Recurso infinita Assim como nos casos dos laos de repetio, precisocuidado para no escrever funes infinitamente recursivas Ex.:def recursiva(x):if f(x): return Trueelse: return recursiva(x) Uma funo recursiva tem que Tratar todos os casos bsicos Usar recurso apenas para tratar casos garantidamente mais simples do que o caso corrente Ex.:def recursiva(x):if f(x): return Trueelif x==0: return Falseelse: return recursiva(x-1) 7. Eficincia de funes recursivas Quando uma funo chamada, um pouco de memria usado para guardar o ponto de retorno, os argumentos evariveis locais Assim, solues iterativas so normalmente maiseficientes do que solues recursivas equivalentes Isto no quer dizer que solues iterativas sempre sejampreferveis a solues recursivas Se o problema recursivo por natureza, uma soluorecursiva mais clara, mais fcil de programar e,freqentemente, mais eficiente 8. Pensando recursivamente Ao invs de pensar construtivamente para para obter umasoluo, s vezes mais simples pensar em termos deuma prova indutiva Considere o problema de testar se uma lista a umapermutao da lista b Caso bsico: a uma lista vazia Ento a permutao de b se b tambm uma lista vazia Caso bsico: a[0] no aparece em b Ento a no uma permutao de b Caso genrico: a[0] aparece em b na posio i Ento a permutao de b se a[1:] uma permutao de bdo qual foi removido o elemento na posio i 9. Exemplo: Testa permutaesdef e_permutacao(a,b):"""Retorna True sse a lista a umapermutao da lista b"""if len(a) == 0 : return len(b)==0if a[0] in b:i = b.index(a[0])return e_permutacao(a[1:],b[0:i]+b[i+1:])return False>>> e_permutacao([1,2,3],[3,2,1])True>>> e_permutacao([1,2,3],[3,3,1])False>>> e_permutacao([1,2,3],[1,1,2,3])False>>> e_permutacao([1,1,2,3],[1,2,3])False 10. Estruturas de dados recursivas H estruturas de dados que so inerentemente recursivas, jque sua prpria definio recursiva Por exemplo, uma lista pode ser definida recursivamente: [] uma lista (vazia) Se A uma lista e x um valor, ento A+[x] uma lista com x como seu ltimo elemento Esta uma definio construtiva, que pode ser usada paraescrever funes que criam listas Uma outra definio que pode ser usada para analisar listas : Se L uma lista, ento: L == [] , ou seja, L uma lista vazia, ou x = L.pop() torna L uma lista sem seu ltimo elemento x Esta definio no to til em Python j que o comando for permite iterar facilmente sobre os elementos da lista 11. Exemplo: Subseqnciadef e_subseq(a,b):""" Retorna True sse a subseqncia de b,isto , se todos os elementos a[0..n-1] de aaparecem em b[j(0)], b[j(1)]... b[j(n-1)]onde j(i)1: hanoi(n-1,origem,temp,destino) mover(origem,destino) if n>1: hanoi(n-1,temp,destino,origem) def mover(origem,destino):print Mover de, origem, para,destino Com um pouco mais de trabalho, podemos redefinir afuno mover para que ela nos d uma representaogrfica do movimento dos discos 17. Torres de Hani: Exemplo | | | | | | * | | | | |***| | | | * ***** | | | ********======================= ======================= | | | | | | | | | | | |***| | | | | ***** * | * ********======================= ======================= | | | | | | | | | | | | | | | |***| ***** ***** ***** |======================= ======================= | | | | | | | | | | * | | | * |***| ***** |***| ***** |======================= =======================