Introdução à Programação / Programação I

Documentos relacionados
Introdução à Programação Aula 15 Definições recursivas

Processamento da Informação Teoria. Recursividade

Recursividade. Estrutura de Dados. Prof. Kleber Rezende

Introdução à Programação

Recursividade. Métodos iterativos. Prof. Cesar Augusto Tacla. Métodos iterativos utilizam estruturas de repetição

Análise de Problemas Recursivos. Algoritmos e Estruturas de Dados Flavio Figueiredo (

Técnicas de análise de algoritmos

Aula 06: Análise matemática de algoritmos recursivos

04 Recursão SCC201/501 - Introdução à Ciência de Computação II

Programação I Aula 10 Processamento de listas

MC102 Aula 26. Instituto de Computação Unicamp. 17 de Novembro de 2016

Recursividade. Objetivos do módulo. O que é recursividade

Aula 05: - Recursão (parte 1)

# Estrutura de Dados # Aula 08 Recursão (conceito, utilização, exemplos) Prof. Leinylson Fontinele Pereira

Computação 1 - Python Aula 3 - Teórica: Tipos de dados, Strings, Estrutura Condicional 1/ 28

Comparação com Divisão e Conquista

Algoritmos e Programação. AULA 21: Recursividade UNIVERSIDADE FEDERAL DE PELOTAS CENTRO DE DESENVOLVIMENTO TECNOLÓGICO CIÊNCIA DA COMPUTAÇÃO

Universidade Federal do ABC Programação Estruturada Fabrício Olivetti França Lista de Exercícios 02

if not(isinstance(a, int)) or a < 0: raise ValueError ("misterio: arg nao e inteiro nao negativo") else: return misterio_aux(a, a + 1)

if not(isinstance(a, int)) or a < 0: raise ValueError ( misterio: arg devia ser inteiro nao negativo ) else: return misterio_aux(a, a + 1)

BC1424 Algoritmos e Estruturas de Dados I Aula 03: Recursão / Recursividade

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: funções

Aula 05: - Recursão (parte 1)

PROGRAMAÇÃO DE COMPUTADORES V - TCC Modulo 6 : Funções Escopo de Variáveis: Globais x Locais Aura - Erick

Fundamentos da Programação

Projeto e Análise de Algoritmos Aula 4: Dividir para Conquistar ou Divisão e Conquista ( )

Primeira Prova de Linguagens de Programação - DCC024 -

Programação Estruturada

Complexidade de Algoritmos

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

Recursividade. Prof. Jesus José de Oliveira Neto

Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

Roteiro Prático Nº 13 Recursividade

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo

Fundamentos da Programação

Programação I Aula 3 Primeiros programas

Análise e Síntese de Algoritmos. Programação Dinâmica CLRS, Cap. 15

Análise e Complexidade de Algoritmos

Revisão: Tipo Abstrato de Dados Recursividade

Subindo uma escada. Ação: Subir 1 degrau da escada

Introdução à Programação Aula 3 Primeiros programas

Recursividade. Recursividade

Nesta aula... Iteração indefinida. 1 Decisões em Python. 2 Funções lógicas. 3 Recursão. 4 Iteração. 5 Ciclo for ou while?

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo

ALGORITMOS AVANÇADOS UNIDADE II Recursividade. Luiz Leão

Programação Dinâmica I SCC0210 Algoritmos Avançados (2/2011) Lucas Schmidt Cavalcante

Pedro Vasconcelos DCC/FCUP. Programação Funcional 8 a Aula Listas infinitas

Fundamentos da Programação

Aula prática 5. Funções Recursivas

Pedro Vasconcelos DCC/FCUP. Programação Funcional 5 a Aula Definições recursivas

Programação Funcional Aulas 5 & 6

Análise de Algoritmos Parte 4

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

Relações de recorrência

Programação Dinâmica. Prof. Anderson Almeida Ferreira. Adaptado do material elaborado por Andrea Iabrudi Tavares

Introdução à Programação

SCC Capítulo 2 Recursão

Transcrição:

Introdução à Programação / Programação I Aula 18: Definições recursivas Rita P. Ribeiro 2017/2018 Departamento de Ciência de Computadores

Nesta aula 1. Definições recursivas 2. Exemplos INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 1

Definições recursivas

Iteração e Recursão Para resolver um problema complexo é comum partirmos esse problema em tarefas mais pequenas que são resolvidas, uma de cada vez, e no final, combinarmos os resultados obtidos. Existem duas abordagens: iteração repetimos uma sequência de operações um número variável de vezes até que o problema fique resolvido recursão partimos o problema em problemas semelhantes mas mais pequenos que se consigam resolver, repetindo assim a sequência de operações e, com essas soluções, construimos a solução final. INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 2

Recursividade Recursividade: definição de uma função, relação ou um processo em termos de si próprio. Exemplos: um antepassado é o pai ou a mãe ou um dos seus antepassados; um diretório é uma estrutura que contém ficheiros e sub-diretórios; uma árvore é uma folha ou um ramo que bifurca em duas ou mais sub-árvores. INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 3

Exemplos

Fatorial Podemos definir o fatorial de n recursivamente: 0! = 1 n! = n (n 1)! (n > 0) A primeira equação define o caso base (0!) A segunda equação define o caso recursivo: n! usando (n 1)!. Assim fatorial fica definido para todos os inteiros não-negativos. INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 4

Fatorial (cont.) Exemplo: 4! = 4 3! = 4 (3 2!) = 4 (3 (2 1!)) = 4 (3 (2 (1 0!))) = 4 (3 (2 (1 1))) = 24 INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 5

Fatorial (cont.) Em Python: (Exemplo de execução no Python Tutor.) def fatorial(n): if n==0: r=1 # caso base else: r=n*fatorial(n-1) # caso recursivo return r Uma função recursiva envolve a definição: um ou mais casos base, para os quais a solução é conhecida caso recursivo que chama a mesma função para resolver um problema mais simples e que se aproxima do(s) caso(s) base. INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 6

Fractal de Koch n = 0 n = 1 n = 2 A curva de ordem 0 é uma linha. A curva ordem n + 1 consiste em quatro curvas de ordem n. n = 3 INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 7

Fractal de Koch (cont.) from turtle import * def koch(n, size): if n == 0: forward(size) else: koch(n-1, size/3) left(60) koch(n-1, size/3) right(120) koch(n-1, size/3) left(60) koch(n-1, size/3) # caso base: uma linha # caso recursivo # 4 curvas com 1/3 do comprimento INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 8

Fractal de Koch (cont.) Podemos simplificar a definição anterior: right(α) é equivalente a left( α); left(0) não altera a orientação. INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 9

Fractal de Koch (cont.) def koch(n, size): if n == 0: # caso base: uma linha forward(size) else: # caso recursivo for angle in [60, -120, 60, 0]: koch(n-1, size/3) # avançar 1/3 do comprimento left(angle) INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 10

Números de Fibonacci Conhecidos na Índia (700 DC) Introduzidos na Europa por Leonardo de Pisa (1202 DC) Modelo simplificado para o crescimento de uma população de coelhos: um par de coelhos são colocados num campo; os coelhos podem acasalar com um mês; no fim do segundo mês, nasce um novo par de coelhos; os coelhos não morrem, e cada par produz sempre um novo par ao fim de um mês. Quantos pares de coelhos existem ao fim de um ano? INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 11

Números de Fibonacci (cont.) Ao fim de 1 mês ainda há só 1 par. Ao fim de 2 meses nasce um novo par, logo há 2 pares. Ao fim de 3 meses, nasce um segundo par da primeira fémea, logo há 3 pares. Ao fim de 4 meses, nasce o terceiro par da primeira fémea e o primeiro par da segunda fémea; logo há 5 pares. INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 12

Números de Fibonacci (cont.) INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 13

Números de Fibonacci (cont.) O número de pares que existem ao fim de n meses é então a soma de: 1. o número de pares que existiam no mês anterior; 2. o número de pares que nascem (que é o número de pares no mês n 2). Simbolicamente F n = F n 1 + F n 2 Os casos base são F 0 = 1 e F 1 = 1. INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 14

Implementação recursiva Tradução direta para uma função recursiva. def fib(n): if n==0 or n==1: r=1 else: r= fib(n-1) + fib(n-2) return r Exemplo: >>> fib(4) 5 Contudo: esta implementação é pouco eficiente! INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 15

Eficiência Construir uma tabela do tempo de computação em função de n. import time for n in range(1, 40): t0 = time.clock() fn = fib(n) t1 = time.clock() print("%d\t%f" % (n,t1-t0)) INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 16

Eficiência (cont.) 45 40 35 30 CPU time 25 20 15 10 5 0 0 5 10 15 20 25 30 35 40 n INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 17

Fibonacci: grafo de chamadas fib(1) fib(2) fib(3) fib(0) fib(4) fib(2) fib(1) fib(1) fib(0) A computação de fib(2) é repetida desnecessariamente... INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 18

Fibonacci com memorização Vamos usar um dicionário para guardar resultados já calculados. fib_memo = {0:1, 1:1} # dicionário global def fastfib(n): if n in fib_memo: r = fib_memo[n] else: r = fastfib(n-1) + fastfib(n-2) fib_memo[n] =r return r INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 19

Fibonacci com memorização (cont.) Utilização (resultados praticamente instantâneos): >>> fastfib(40) 165580141 >>> fastfib(500) 22559151616193633087251269503607207204601132491375 81905886388664184746277386868834050159870527969684 98626L INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 20

Listas imbricadas Vamos considerar listas imbricadas, i.e. listas cujos elementos são: números inteiros ou vírgula flutuante; outras listas imbricadas. Exemplos: [1, 2, 3] [1, [2, 3], 4] [[1,2],[3,4],[[5],6]] INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 21

Listas imbricadas (cont.) Queremos definir uma função recursiva para somar todos os valores numa lista imbricada. Note que a função pré-definida sum não serve (soma apenas listas de números). >>> sum([1,2,3]) 6 >>> sum([1, [2, 3], 4]) TypeError >>> sum([[1,2],[3,4],[[5],6]] TypeError INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 22

Listas imbricadas (cont.) def recsum(xs): "Somar todos os valores numa lista imbricada." s = 0 # acumulador da soma for x in xs: # percorrer todos os elementos if type(x)==int or type(x)==float: s += x elif type(x)==list: s += recsum(x) # somar sub-lista recursivamente else: raise TypeError("lista inválida") return s INTRODUÇÃO À PROGRAMAÇÃO / PROGRAMAÇÃO I - 2017/2018: AULA 18 23