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

Documentos relacionados
Programação Estruturada

Técnicas de projeto de algoritmos: Indução

MC102 Aula 27 Recursão II

Algoritmos e Estruturas de Dados I Linguagem C

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

Recursão. Aula 1. Liana Duenha. Faculdade de Computação Universidade Federal de Mato Grosso do Sul

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

Revisão: Tipo Abstrato de Dados Recursividade

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

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

Aula 05: - Recursão (parte 1)

Programação científica C++

Aulas 5 e 6 / 28 e 30 de março

apenas os caminhos que passam só por vértices em C, exceto, talvez, o próprio v A Figura 1 a seguir ilustra o significado do conjunto C edovalordist.

SCC Capítulo 2 Recursão

Introdução a Algoritmos Parte 08

Introdução à Análise Algoritmos

CORREÇÃO DE ALGORITMOS E

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

Aula 05: - Recursão (parte 1)

Recursividade. Estrutura de Dados. Prof. Kleber Rezende

MC-102 Aula 20 Ponteiros III

Introdução à Ciência da Computação II. Recursão. Prof. Ricardo J. G. B. Campello

Técnicas de análise de algoritmos

Prof. A. G. Silva. 25 de setembro de Prof. A. G. Silva INE5603 Introdução à POO 25 de setembro de / 35

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

Notas de Aula Aula 2, 2012/2

Recursão. Definição. Características. Recursividade 31/08/2010

Estrutura de Dados Conceitos Iniciais

Processamento da Informação

MC-102 Aula 19 Ponteiros II

Estruturas Discretas

Aula prática 5. Funções Recursivas

Fundamentos de programação

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

Análise e Complexidade de Algoritmos

LINGUAGEM C: FUNÇÕES FUNÇÃO 04/07/2017. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

Programação II RECURSÃO

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

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

Luís Fernando Schultz Xavier da Silveira. 12 de maio de 2010

Construção de Algoritmos II Aula 06

Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação. Recursão em C

Os números inteiros. Álgebra (Curso de CC) Ano lectivo 2005/ / 51

Waldemar Celes e Roberto Ierusalimschy. 29 de Fevereiro de 2012

Recursão. Introdução à Ciência da Computação II(2009/2010) Rosane Minghim. Apoio na confecção: Rogério Eduardo Garcia Danilo Medeiros Eler

Matemática Discreta - 05

LINGUAGEM C: FUNÇÕES FUNÇÃO 08/01/2018. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

Seminário Semanal de Álgebra. Técnicas de Demonstração

Indução Matemática. Profa. Sheila Morais de Almeida. junho DAINF-UTFPR-PG

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

MC102 Algoritmos e Programação de Computadores

Algoritmos e Estrutura de Dados. Aula 04 Recorrência Prof. Tiago A. E. Ferreira

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

Algoritmos e Estruturas de Dados I 01/2013. Vetores e Recursividade. Pedro O.S. Vaz de Melo

Soluções dos exercícios propostos

Recursividade. Prof. Jesus José de Oliveira Neto

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

Análise de Algoritmos e Estruturas de Dados

Preliminares. Profa. Sheila Morais de Almeida. agosto

Solução de Recorrências

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

Aula 2: Linguagem Proposicional

Princípio da Multiplicação Gerando todas as palavras de um alfabeto. > Princípios de Contagem e Enumeração Computacional 0/18

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

Semântica Operacional

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

Divisão e Conquista. Norton T. Roman. Apostila baseada nos trabalhos de Cid de Souza, Cândida da Silva e Delano M. Beder

Linguagem Universal. assim como a entrada ser processada por a. (b) A segunda fita de representa a fita de

ESTRUTURAS DE REPETIÇÃO - PARTE 1

Teoria dos Conjuntos. (Aula 6) Ruy de Queiroz. O Teorema da. (Aula 6) Ruy J. G. B. de Queiroz. Centro de Informática, UFPE

Programação II RECURSÃO

2 Erro comum da indução. 3 Corretude de Algoritmos. > Indução Forte X Indução Fraca Erro comum da indução Corretude de Algoritmos 0/17

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

DAS5102 Fundamentos da Estrutura da Informação

Variáveis e instruções de repetição

Universidade Federal da Grande Dourados Faculdade de Ciências Exatas e Tecnologia Bacharelado em Sistemas de Informação Estruturas de Dados I Lista II

Python: Recursão. Claudio Esperança

Indução Matemática. Matemática Discreta. Indução Matemática. Mayara Midori Omai e Sheila Morais de Almeida UTFPR-PG. Abril

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

Matemática Discreta - 06

Matemática Discreta Bacharelado em Sistemas de Informação Resolução - 4ª Lista de Exercícios. Indução e Recursão

Permite modularidade (dividir programa em partes): Facilita a depuração (debug) e portabilidade.

Rosane Minghim e Guilherme P. Telles

Bases Matemáticas. Juliana Pimentel. 15 de junho de 2016

Recursão. Prof. Fabrício Olivetti de França. (com inspirações do slide do prof. Rodrigo Hausen)

MC-102 Aula 07 Comandos Repetitivos

Indução Matemática. George Darmiton da Cunha Cavalcanti CIn - UFPE

> Princípios de Contagem e Enumeração Computacional 0/19

Análise de algoritmos

O grau de saída d + (v) de um vértice v é o número de arcos que tem

Estruturas de Dados. Revisão de Funções e Recursão. Agradecimentos

Redutibilidade. Mário S. Alvim Fundamentos de Teoria da Computação (FTC) DCC-UFMG (2018/02)

ESTRUTURAS DE REPETIÇÃO - PARTE 2

MC-102 Aula 08 Comandos Repetitivos

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

Estruturas de Dados Aula 14: Recursão

BCC402 Algoritmos e Programação Avançada Prof. Marco Antonio M. Carvalho Prof. Túlio Ângelo M. Toffolo 2011/1

Transcrição:

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

Roteiro 1 Recursão Indução 2 Recursão 3 Fatorial 4 O que acontece na memória 5 Recursão Iteração 6 Soma em um Vetor 7 Números de fibonacci 8 Exercício (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 2 / 38

Recursão Indução Devemos criar uma algoritmo para resolver um determinado problema. Usando o método de recursão/indução, a solução de um problema pode ser expressa da seguinte forma: Primeiramente, definimos a solução para casos básicos; Em seguida, definimos como resolver o problema para um caso geral, utilizando-se de soluções para instâncias menores do problema. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 3 / 38

Recursão Indução Devemos criar uma algoritmo para resolver um determinado problema. Usando o método de recursão/indução, a solução de um problema pode ser expressa da seguinte forma: Primeiramente, definimos a solução para casos básicos; Em seguida, definimos como resolver o problema para um caso geral, utilizando-se de soluções para instâncias menores do problema. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 3 / 38

Recursão Indução Devemos criar uma algoritmo para resolver um determinado problema. Usando o método de recursão/indução, a solução de um problema pode ser expressa da seguinte forma: Primeiramente, definimos a solução para casos básicos; Em seguida, definimos como resolver o problema para um caso geral, utilizando-se de soluções para instâncias menores do problema. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 3 / 38

Indução Indução: Técnica de demonstração matemática onde algum parâmetro da proposição a ser demonstrada envolve números naturais. Seja T uma proposição que desejamos provar como verdadeira para todos valores naturais n. Ao invés de provar diretamente que T é válida para todos os valores de n, basta provar as duas condições 1 e 3 a seguir: 1 Passo base: PROVAR que T é válido para n = 1. 2 Hipótese de Indução: Assumimos que T é válido para n 1. 3 Passo de Indução: Sabendo que T é válido para n 1 devemos PROVAR que T é válido para n. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 4 / 38

Indução Indução: Técnica de demonstração matemática onde algum parâmetro da proposição a ser demonstrada envolve números naturais. Seja T uma proposição que desejamos provar como verdadeira para todos valores naturais n. Ao invés de provar diretamente que T é válida para todos os valores de n, basta provar as duas condições 1 e 3 a seguir: 1 Passo base: PROVAR que T é válido para n = 1. 2 Hipótese de Indução: Assumimos que T é válido para n 1. 3 Passo de Indução: Sabendo que T é válido para n 1 devemos PROVAR que T é válido para n. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 4 / 38

Indução Indução: Técnica de demonstração matemática onde algum parâmetro da proposição a ser demonstrada envolve números naturais. Seja T uma proposição que desejamos provar como verdadeira para todos valores naturais n. Ao invés de provar diretamente que T é válida para todos os valores de n, basta provar as duas condições 1 e 3 a seguir: 1 Passo base: PROVAR que T é válido para n = 1. 2 Hipótese de Indução: Assumimos que T é válido para n 1. 3 Passo de Indução: Sabendo que T é válido para n 1 devemos PROVAR que T é válido para n. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 4 / 38

Indução Indução: Técnica de demonstração matemática onde algum parâmetro da proposição a ser demonstrada envolve números naturais. Seja T uma proposição que desejamos provar como verdadeira para todos valores naturais n. Ao invés de provar diretamente que T é válida para todos os valores de n, basta provar as duas condições 1 e 3 a seguir: 1 Passo base: PROVAR que T é válido para n = 1. 2 Hipótese de Indução: Assumimos que T é válido para n 1. 3 Passo de Indução: Sabendo que T é válido para n 1 devemos PROVAR que T é válido para n. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 4 / 38

Indução Indução: Técnica de demonstração matemática onde algum parâmetro da proposição a ser demonstrada envolve números naturais. Seja T uma proposição que desejamos provar como verdadeira para todos valores naturais n. Ao invés de provar diretamente que T é válida para todos os valores de n, basta provar as duas condições 1 e 3 a seguir: 1 Passo base: PROVAR que T é válido para n = 1. 2 Hipótese de Indução: Assumimos que T é válido para n 1. 3 Passo de Indução: Sabendo que T é válido para n 1 devemos PROVAR que T é válido para n. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 4 / 38

Indução Indução: Técnica de demonstração matemática onde algum parâmetro da proposição a ser demonstrada envolve números naturais. Seja T uma proposição que desejamos provar como verdadeira para todos valores naturais n. Ao invés de provar diretamente que T é válida para todos os valores de n, basta provar as duas condições 1 e 3 a seguir: 1 Passo base: PROVAR que T é válido para n = 1. 2 Hipótese de Indução: Assumimos que T é válido para n 1. 3 Passo de Indução: Sabendo que T é válido para n 1 devemos PROVAR que T é válido para n. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 4 / 38

Indução Por que a indução funciona? Por que as duas condições são suficientes? Mostramos que T é valida para um caso base, como n = 1. Com o passo da indução, automaticamente mostramos que T é válida para n = 2. Como T é válida para n = 2, pelo passo de indução, T também é válida para n = 3, e assim por diante. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 5 / 38

Exemplo Teorema A soma S(n) dos primeiros n números naturais é n(n + 1)/2 Prova. Base: Para n = 1 devemos mostrar que n(n + 1)/2 = 1. Isto é verdade: 1(1 + 1)/2 = 1. Hip. de Indução:Vamos assumir que é válido para (n 1), ou seja, S(n 1) = (n 1)((n 1) + 1)/2. Passo: Devemos mostrar que é válido para n, ou seja, devemos mostrar que S(n) = n(n + 1)/2. Por definição, S(n) = S(n 1) + n e por hipótese S(n 1) = (n 1)((n 1) + 1)/2, logo S(n) = S(n 1) + n = (n 1)((n 1) + 1)/2 + n = n(n 1)/2 + 2n/2 = n(n + 1)/2 (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 6 / 38

Exemplo Teorema A soma S(n) dos primeiros n números naturais é n(n + 1)/2 Prova. Base: Para n = 1 devemos mostrar que n(n + 1)/2 = 1. Isto é verdade: 1(1 + 1)/2 = 1. Hip. de Indução:Vamos assumir que é válido para (n 1), ou seja, S(n 1) = (n 1)((n 1) + 1)/2. Passo: Devemos mostrar que é válido para n, ou seja, devemos mostrar que S(n) = n(n + 1)/2. Por definição, S(n) = S(n 1) + n e por hipótese S(n 1) = (n 1)((n 1) + 1)/2, logo S(n) = S(n 1) + n = (n 1)((n 1) + 1)/2 + n = n(n 1)/2 + 2n/2 = n(n + 1)/2 (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 6 / 38

Exemplo Teorema A soma S(n) dos primeiros n números naturais é n(n + 1)/2 Prova. Base: Para n = 1 devemos mostrar que n(n + 1)/2 = 1. Isto é verdade: 1(1 + 1)/2 = 1. Hip. de Indução:Vamos assumir que é válido para (n 1), ou seja, S(n 1) = (n 1)((n 1) + 1)/2. Passo: Devemos mostrar que é válido para n, ou seja, devemos mostrar que S(n) = n(n + 1)/2. Por definição, S(n) = S(n 1) + n e por hipótese S(n 1) = (n 1)((n 1) + 1)/2, logo S(n) = S(n 1) + n = (n 1)((n 1) + 1)/2 + n = n(n 1)/2 + 2n/2 = n(n + 1)/2 (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 6 / 38

Recursão Definições recursivas de funções funcionam como o princípio matemático da indução que vimos anteriormente. A idéia é que a solução de um problema pode ser expressa da seguinte forma: Definimos a solução para casos básicos; Definimos como resolver o problema geral utilizando soluções do mesmo problema só que para casos menores. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 7 / 38

Fatorial Problema: Calcular o fatorial de um número (n!). Qual o caso base e o passo da indução? Se n é igual a 1, então o fatorial é 1. Qual seria o passo indutivo? Temos que expressar a solução para n > 1, supondo que já sabemos a solução para algum caso mais simples. n! = n (n 1)!. Este caso é trivial pois a própria definição do fatorial é recursiva. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 8 / 38

Fatorial Problema: Calcular o fatorial de um número (n!). Qual o caso base e o passo da indução? Se n é igual a 1, então o fatorial é 1. Qual seria o passo indutivo? Temos que expressar a solução para n > 1, supondo que já sabemos a solução para algum caso mais simples. n! = n (n 1)!. Este caso é trivial pois a própria definição do fatorial é recursiva. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 8 / 38

Fatorial Problema: Calcular o fatorial de um número (n!). Qual o caso base e o passo da indução? Se n é igual a 1, então o fatorial é 1. Qual seria o passo indutivo? Temos que expressar a solução para n > 1, supondo que já sabemos a solução para algum caso mais simples. n! = n (n 1)!. Este caso é trivial pois a própria definição do fatorial é recursiva. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 8 / 38

Fatorial Portanto, a solução do problema pode ser expressa de forma recursiva como: Se n = 1 então n! = 1. Se n > 1 então n! = n (n 1)!. Note como aplicamos o princípio da indução: Sabemos a solução para um caso base: n = 1. Definimos a solução do problema geral n! em termos do mesmo problema só que para um caso menor ((n 1)!). (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 9 / 38

Fatorial em C l o n g f a t r ( l o n g n ){ l o n g x, r ; i f ( n == 1) // Passo B á s i c o r e t u r n 1 ; e l s e { x = n 1; r = f a t r ( x ) ; // Sabendo o f a t o r i a l de ( n 1) r e t u r n ( n r ) ; // c a l c u l a m o s o f a t o r i a l de n } } (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 10 / 38

Fatorial Para solucionar o problema, é feita uma chamada para a própria função, por isso, esta função é chamada recursiva. Recursividade geralmente permite uma descrição mais clara e concisa dos algoritmos, especialmente quando o problema é recursivo por natureza. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 11 / 38

Fatorial Para solucionar o problema, é feita uma chamada para a própria função, por isso, esta função é chamada recursiva. Recursividade geralmente permite uma descrição mais clara e concisa dos algoritmos, especialmente quando o problema é recursivo por natureza. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 11 / 38

O que acontece na memória Precisamos entender como é feito o controle sobre as variáveis locais em chamadas recursivas. A memória de um sistema computacional é dividida em alguns segmentos: Espaço Estático: Contém as variáveis globais e código do programa. Heap: Para alocação dinâmica de memória. Pilha: Para execução de funções. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 12 / 38

O que acontece na memória O que acontece na pilha: Toda vez que uma função é invocada, suas variáveis locais são armazenadas no topo da pilha. Quando uma função termina a sua execução, suas variáveis locais são removidas da pilha. Considere o exemplo: i n t f 1 ( i n t a, i n t b ){ i n t c =5; r e t u r n ( c+a+b ) ; } i n t f 2 ( i n t a, i n t b ){ i n t c ; c = f 1 ( b, a ) ; r e t u r n c ; } i n t main ( ) { f 2 ( 2, 3 ) ; } (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 13 / 38

O que acontece na memória Inicialmente a pilha está vazia. Pilha Topo (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 14 / 38

O que acontece na memória Quando f2(2,3) é invocada, suas variáveis locais são alocadas no topo da pilha. Pilha Topo f2 a b c 2 3 (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 15 / 38

O que acontece na memória A função f2 invoca a função f1(b,a) e as variáveis locais desta são alocadas no topo da pilha sobre as de f2. f1 a b c Pilha Topo 3 2 5 f2 a b c 2 3 (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 16 / 38

O que acontece na memória A função f1 termina, devolvendo 10. As variáveis locais de f1 são removidas da pilha. Pilha Topo f2 a b c 2 3 10 (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 17 / 38

O que acontece na memória Finalmente f2 termina a sua execução devolvendo 10. Suas variáveis locais são removidas da pilha. Pilha Topo (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 18 / 38

O que acontece na memória No caso de chamadas recursivas para uma mesma função, é como se cada chamada correspondesse a uma função distinta. As execuções das chamadas de funções recursivas são feitas na pilha, assim como qualquer função. O último conjunto de variáveis alocadas na pilha, que está no topo, corresponde às variáveis da última chamada da função. Quando termina a execução de uma chamada da função, as variáveis locais desta são removidas da pilha. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 19 / 38

Usando recursão em programação Considere novamente a solução recursiva para se calcular o fatorial e assuma que seja feito a chamada fatr(4). l o n g f a t r ( l o n g n ){ l o n g x, r ; i f ( n == 1) // Passo B á s i c o r e t u r n 1 ; e l s e { x = n 1; r = f a t r ( x ) ; // Sabendo o f a t o r i a l de ( n 1) r e t u r n ( n r ) ; // c a l c u l a m o s o f a t o r i a l de n } } (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 20 / 38

O que acontece na memória Cada chamada da função fatr cria novas variáveis locais de mesmo nome (n, x, r). Portanto, várias variáveis n, x e r podem existir em um dado momento. Em um dado instante, o nome n (ou x ou r) refere-se à variável local ao corpo da função que está sendo executada naquele instante. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 21 / 38

O que acontece na memória Cada chamada da função fatr cria novas variáveis locais de mesmo nome (n, x, r). Portanto, várias variáveis n, x e r podem existir em um dado momento. Em um dado instante, o nome n (ou x ou r) refere-se à variável local ao corpo da função que está sendo executada naquele instante. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 21 / 38

O que acontece na memória Cada chamada da função fatr cria novas variáveis locais de mesmo nome (n, x, r). Portanto, várias variáveis n, x e r podem existir em um dado momento. Em um dado instante, o nome n (ou x ou r) refere-se à variável local ao corpo da função que está sendo executada naquele instante. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 21 / 38

O que acontece na memória Estado da Pilha de execução para fatr(4). 2 1 * fat(2) 3 2 * fat(3) 3 2 * fat(3) 4 3 * fat(4) 4 3 * fat(4) 4 3 * fat(4) n x r n x r n x r 1 * * fat(1) 2 1 * fat(2) 3 2 * fat(3) 4 3 * fat(4) 1 2 1 1 fat(2) 3 2 * fat(3) 4 3 * fat(4) 2 3 2 2 fat(3) 4 3 * fat(4) 6 n x r n x r n x r 4 3 6 fat(4) 24 n x r n x r (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 22 / 38

O que acontece na memória É claro que as variáveis x e r são desnecessárias. Você também deveria testar se n não é negativo! l o n g f a t r ( l o n g n ){ i f ( n <= 1) // Passo B á s i c o r e t u r n 1 ; e l s e // Sabendo o f a t o r i a l de ( n 1) // c a l c u l a m o s o f a t o r i a l de n r e t u r n ( n f a t r ( n 1)); } (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 23 / 38

Recursão Iteração Soluções recursivas são geralmente mais concisas que as iterativas. Soluções iterativas em geral têm a memória limitada enquanto as recursivas, não. Cópia dos parâmetros a cada chamada recursiva é um custo adicional para as soluções recursivas. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 24 / 38

Recursão Iteração Neste caso, uma solução iterativa é mais eficiente. Por quê? l o n g f a t ( l o n g n ) { l o n g r = 1 ; f o r ( i n t i = 1 ; i <= n ; i ++) r = r i ; } r e t u r n r ; (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 25 / 38

Exemplo: Soma de elementos de um vetor Dado um vetor v de inteiros de tamanho tam, devemos calcular a soma dos seus elementos da posição 0 até tam 1. Como podemos descrever este problema de forma recursiva? Isto é, como podemos descrever este problema em função de si mesmo? Vamos denotar por S(n) a soma dos elementos das posições 0 até n do vetor, e portanto devemos achar S(tam 1). O valor de S(n) pode ser calculado com a seguinte definição recursiva: Se n = 0 então a soma S(0) é igual a v[0]. Se n > 0 então a soma S(n) é igual a v[n] + S(n 1). (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 26 / 38

Exemplo: Soma de elementos de um vetor Dado um vetor v de inteiros de tamanho tam, devemos calcular a soma dos seus elementos da posição 0 até tam 1. Como podemos descrever este problema de forma recursiva? Isto é, como podemos descrever este problema em função de si mesmo? Vamos denotar por S(n) a soma dos elementos das posições 0 até n do vetor, e portanto devemos achar S(tam 1). O valor de S(n) pode ser calculado com a seguinte definição recursiva: Se n = 0 então a soma S(0) é igual a v[0]. Se n > 0 então a soma S(n) é igual a v[n] + S(n 1). (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 26 / 38

Exemplo: Soma de elementos de um vetor Dado um vetor v de inteiros de tamanho tam, devemos calcular a soma dos seus elementos da posição 0 até tam 1. Como podemos descrever este problema de forma recursiva? Isto é, como podemos descrever este problema em função de si mesmo? Vamos denotar por S(n) a soma dos elementos das posições 0 até n do vetor, e portanto devemos achar S(tam 1). O valor de S(n) pode ser calculado com a seguinte definição recursiva: Se n = 0 então a soma S(0) é igual a v[0]. Se n > 0 então a soma S(n) é igual a v[n] + S(n 1). (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 26 / 38

Algoritmo em C i n t soma ( i n t v [ ], i n t n ){ i f ( n == 0) r e t u r n v [ 0 ] ; e l s e r e t u r n v [ n ] + soma ( v, n 1); } (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 27 / 38

Algoritmo em C Exemplo de uso: #i n c l u d e <s t d i o. h> i n t soma ( i n t v [ ], i n t n ) ; i n t main ( ) { i n t v e t [ 5 ] = { 4, 3, 6, 2, 5 } ; p r i n t f ( %d\n, soma ( vet, 4 ) ) ; } i n t soma ( i n t v [ ], i n t n ){ i f ( n == 0) r e t u r n v [ 0 ] ; e l s e r e t u r n v [ n ] + soma ( v, n 1); } Note que na chamada da função o segundo parâmetro é exatamente o índice da última posição do vetor (tam 1). (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 28 / 38

Exemplo de execução V = (4, 3, 6, 2, 5) 5 soma(v,0) 4 soma(v,1) 3 soma(v,2) 2 soma(v,3) 1 soma(v,4) 0 Retorna v[0]=4 6 Retorna v[1] + 4 = 3 + 4 = 7 7 Retorna v[2] + 7 = 6 + 7 = 13 8 Retorna v[3] + 13 = 2 + 13 = 15 9 Retorna v[4] + 15 = 5 + 15 = 20 10 Chamada inicial (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 29 / 38

Soma do vetor recursivo O método recursivo sempre termina: Existência de um caso base. A cada chamada recursiva do método temos um valor menor de n. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 30 / 38

Algoritmo em C Neste caso, a solução iterativa também seria melhor (não há criação de variáveis das chamadas recursivas): i n t c a l c u l a s o m a ( i n t [ ] v, i n t n ){ i n t soma=0, i ; f o r ( i =0; i <=n ; i ++) soma = soma + v [ i ] ; r e t u r n soma ; } (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 31 / 38

Recursão com várias chamadas Não há necessidade da função recursiva ter apenas uma chamada para si própria. A função pode fazer várias chamadas para si própria. A função pode ainda fazer chamadas recursivas indiretas. Neste caso a função 1, por exemplo, chama uma outra função 2 que por sua vez chama a função 1. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 32 / 38

Fibonacci A série de fibonacci é a seguinte: 1, 1, 2, 3, 5, 8, 13, 21,.... Queremos determinar qual é o n-ésimo número da série que denotaremos por fibo(n). Como descrever o n-ésimo número de fibonacci de forma recursiva? (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 33 / 38

Fibonacci No caso base temos: Se n = 1 ou n = 2 então fibo(n) = 1. Sabendo casos anteriores podemos computar fibo(n) como: fibo(n) = fibo(n 1) + fibo(n 2). (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 34 / 38

Algoritmo em C A definição anterior é traduzida diretamente em um algoritmo em C: l o n g f i b o ( l o n g n ){ i f ( n <= 2) r e t u r n 1 ; e l s e r e t u r n ( f i b o ( n 1) + f i b o ( n 2)); } (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 35 / 38

Relembrando Recursão é uma técnica para se criar algoritmos onde: 1 Devemos descrever soluções para casos básicos. 2 Assumindo a existência de soluções para casos menores, mostramos como obter a solução para o caso maior. Algoritmos recursivos geralmente são mais claros e concisos. Implementador deve avaliar clareza de código eficiência do algoritmo. (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 36 / 38

Exercício Mostre a execução da função recursiva imprime abaixo: O que será impresso? #i n c l u d e <s t d i o. h> v o i d imprime ( i n t v [ ], i n t i, i n t n ) ; i n t main ( ) { i n t v e t [ ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 1 0 } ; } imprime ( vet, 0, 9 ) ; p r i n t f ( \n ) ; v o i d imprime ( i n t v [ ], i n t i, i n t n ){ i f ( i==n ){ p r i n t f ( %d,, v [ i ] ) ; } e l s e { imprime ( v, i +1,n ) ; p r i n t f ( %d,, v [ i ] ) ; } } (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 37 / 38

Exercício Mostre o estado da pilha de memória durante a execução da função fibo com a chamada fib(5). Qual versão é mais eficiente para se calcular o n-ésimo número de fibonacci? A recursiva ou iterativa? (Instituto de Computação Unicamp) MC-102 17 de Novembro de 2016 38 / 38