Introdução à Programação. Recursão



Documentos relacionados
Estrutura de Dados Básica

Analise o código abaixo:

Linguagem C: agregados heterogêneos, arquivos binários, recursividade. Prof. Críston Algoritmos e Programação

Recursividade. Túlio Toffolo BCC202 Aula 08 Algoritmos e Estruturas de Dados I

José Romildo Malaquias

Recursividade. Aula 9

Programação Estruturada

Funções recursivas. O exemplo mais comum: int fat(int n){ if(n == 0) return 1; return n*fat(n-1); }

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

Introdução à Programação

Acumuladores. Paradigma de Programação Funcional. Marco A L Barbosa

Nível da Arquitetura do Conjunto das Instruções

Operaçõe õ s c om o Strings Intr oduç ão a o Ponte iros o e Funçõe õ s

Estruturas de entrada e saída

Algoritmos e Programação Estruturada

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

Exercício 1. Tabela 1: Cadastro de usuários, senhas e privilégios (exemplo). Login Senha Privilégio Armamento

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

Pilhas. Profa Morganna Diniz

2. OPERADORES ALGORITMOS, FLUXOGRAMAS E PROGRAMAS FUNÇÕES... 10

GFM015 Introdução à Computação Linguagem C / Introdução à Modularização de Programas (uso de subprogramas)

MC102 Algoritmos e Programação de Computadores

Estruturas de Repetição

BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES

Recursividade. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Análise de complexidade

Introdução à Programação. Armazenamento de Grande Quantidade de Informação Usando Vetores

1 se n = 0 n (n 1)! se n 1

INF 1007 Programação II

ESTRUTURAS DE DADOS I. Notas de Aula. Prof. Dr. Gilberto Nakamiti

Programa ConsoleRPN. PUC-Rio CIV Sistemas Gráficos para Engenharia Luiz Fernando Martha & André Maués Brabo Pereira

Aula 3 Alocação Dinâmica

Programação II. Aula 2

Implementando uma Classe e Criando Objetos a partir dela

Recursividade. Recursividade

Introdução a POO. Introdução a Linguagem C++ e POO

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Recursividade

INF 1005 Programação I

Algoritmos de Busca em Tabelas

Algoritmos e Estruturas de Dados I

Linguagem de Programação

Aula 06 - Funções. O que é uma Função - Comando return - Protótipos de Funções - Tipos de Funções - Escopo de Variáveis - Passagem de parâmetros

OPERADORES E ESTRUTURAS DE CONTROLE

Simulado de Linguagem de Programação Java

17 - Funções e Procedimentos em C Programação Modular

MC102 Algoritmos e Programação de Computadores 2ª Aula Programa, entrada e saída de dados

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e traduções para C dos originais:

INF 1005 Programação I

Análise de Complexidade para algoritmos iterativos e recursivos

SCC Capítulo 2 Recursão

Processamento da Informação Teoria. Algoritmos e Tipos de dados

Bacharelado em Sistemas de Informação Programação Funcional. Lista de Exercicios - Linguagem Haskell

Recursividade. Estrutura de Dados. Prof. Kleber Rezende

5 - Vetores e Matrizes Linguagem C CAPÍTULO 5 VETORES E MATRIZES

INFORMÁTICA APLICADA AULA 02 LINGUAGEM DE PROGRAMAÇÃO C++

CONVENÇÃO DE CÓDIGO JAVA

MC102 Algoritmos e Programação de Computadores 1ª Aula Introdução à Programação de Computadores

GUIA DE FUNCIONAMENTO DA UNIDADE CURRICULAR

Grupo I [4v] b. [0,6v] De que forma é que o escalonador do Linux tenta minimizar o impacto desta limitação?

Linguagens de Programação I

Estruturas de repetição (Ciclos)

PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

Recursividade. Prof. Jesus José de Oliveira Neto

Resumo da Matéria de Linguagem de Programação. Linguagem C

Unidade IV: Ponteiros, Referências e Arrays

Introdução a PHP (Estruturas de Controle)

Simulado de Linguagem de Programação Java

Universidade Federal de Mato Grosso do Sul Faculdade de Computação Disciplina de Verão: Algoritmos e Programação II

Algoritmos e Programação. Curso de Engenharia de Produção Prof. Ms. Rogério Cardoso rogerio.cardoso@aedu.com professor@rogeriocardoso.com.

Programação Funcional. Aula 5. Funções Recursivas. José Romildo Malaquias. Departamento de Computação Universidade Federal de Ouro Preto 2011.

Aula Prática 1: Introdução ao Ambiente de Programação Dev-C++

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

9 Comandos condicionais

SCC0601 Projeto de Algoritmos. Recursão

Conceitos de Linguagens de Programação

A INTERNET COMPLETOU 20 ANOS DE BRASIL EM 2015.

Por que o quadrado de terminados em 5 e ta o fa cil? Ex.: 15²=225, 75²=5625,...

Integrais Duplas e Coordenadas Polares. 3.1 Coordenadas Polares: Revisão

Métodos Computacionais. Árvores

Computação II Orientação a Objetos

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

20 Caracteres - Tipo char

Projeto de Software Orientado a Objeto

Estrutura de um programa em linguagem C

Transcrição:

Introdução à Programação Recursão

Recursão decoração Substantivo feminino. 1.Ato ou efeito de decorar decorar Verbo transitivo direto. 1.Guarnecer com adorno(s); dispor formas e cores em; ornamentar, embelezar; 2.Realçar, avivar, adornar; Recursão Fonte: Dicionário Aurélio 2

Tópicos da Aula Hoje, aprenderemos a usar uma técnica de programação chamada de recursão Conceito de Recursão Definições Recursivas Casos Base e Geral Programando Recursivamente Recursão X Laço 3

Recursão Uma definição recursiva de um conceito consiste em utilizar o próprio conceito na definição Ex: fat(n) = n * fat(n-1) Definições recursivas em linguagem natural não são, geralmente, muito úteis Contudo, em outras situações, uma definição recursiva pode ser a mais apropriada para explicar um conceito Recursão é uma técnica de programação que pode fornecer soluções elegantes para determinados problemas Mas, antes, deve-se aprender a pensar recursivamente! 4

Definições Recursivas: Lista Considere a seguinte lista de números 24, 88, 40, 37 Podemos definir uma lista de números como: Uma LISTA é um: número ou um: número vírgula LISTA Resumindo: uma LISTA é definida ou como um único número, ou como um número seguido de uma vírgula seguida de uma LISTA Utilizamos LISTA para sua própria definição 5

Definições Recursivas: Lista A parte recursiva da definição de LISTA é utilizada diversas vezes, até que se possa utilizar a parte não recursiva número vírgula 24, Parte não recursiva da definição de LISTA 88, 40, 37 88, LISTA 40, 37 40, 37 37 Parte recursiva da definição de LISTA 6

Definições Recursivas: Fatorial Fatorial de um número N (N!), que é inteiro e positivo, é definido como a multiplicação de todos os inteiros compreendidos entre 1 e N (inclusive) Podemos definir fatorial recursivamente: 0! = 1 N! = N x (N-1)! Mais uma vez, utilizamos fatorial para sua própria definição 7

Definições Recursivas: Fatorial 5! 5 * 4! 4 * 3! 120 24 3 * 2! 2 * 1! 6 1 * 0! 1 2 1 8

Caso Base e Caso Geral Toda definição recursiva deve ter uma parte recursiva e outra não recursiva Se não houver a parte não recursiva, o caminho recursivo nunca termina Gera uma recursão infinita Similar a um laço infinito Denomina-se de caso base, a parte não recursiva da definição, enquanto o caso geral é a parte recursiva 9

Programação Recursiva Uma função em C pode chamar ela mesma Função recursiva O código de uma função recursiva deve tratar o caso base e o caso geral Cada chamada da função cria novos parâmetros e variáveis locais Cria-se uma nova instância da função Como em qualquer chamada de função, assim que a função termina sua execução, o controle retorna para a função que a chamou (que neste caso, é outra instância da mesma função)

Exemplo de Função Recursiva: Fatorial int fatorial(int n) { int resultado; if (n == 0) resultado = 1; Caso Base else resultado = n * fatorial(n - 1); return resultado; } Caso Geral 11

Chamando Função Recursiva: Fatorial int main() { int fat = fatorial(2); printf( Fatorial de 2 é %d,fat); } return 0; 12

1 Chamada da função: cópia do argumento Pilha de Execução de Funções Recursivas 2 Chamada recursiva: cópia do argumento 3 Chamada recursiva: cálculo da expressão resultado n fat - - 2 <fatorial <main resultado - n 1 resultado - n fat - 2 <fatorial <fatorial <main resultado 1 n 0 resultado - n 1 resultado - n - 2 fat <fatorial <fatorial <fatorial <main 4 Retorno da 3a chamada: cálculo da expressão 5 Retorno da 2a chamada: cálculo da expressão 5 Retorno da 1a chamada resultado 1 n 1 resultado - n fat - 2 <fatorial <fatorial <main resultado n fat 2-2 <fatorial <main fat 2 <main 13

Usando Recursividade para resolver problemas Problema: Torre de Hanoi Deve-se transportar todos os discos da primeira estaca até a última obedecendo as seguintes regras: 1. Só pode ser deslocado um disco por vez (o do topo de uma estaca) 2. Em nenhum momento um disco maior pode estar sobre um menor 14

Resolvendo Recursividade o Problema da Torre de Hanoi Solução: Torre de Hanoi 1. Mover n 1 discos da estaca Origem para a Temporária 2. Mover o disco n da estaca Origem para a Destino 3. Mover n 1 discos da estaca Temporária para a Destino 15

Torre de Hanoi Caso Base void mover(int n, char orig, char temp, char dest) { if (n == 1) printf("mova o disco 1 da estaca %c para a estaca %c\n",orig,dest); else { mover (n-1,orig,dest,temp); printf("mova o disco %d da estaca %c para a estaca %c\n",n,orig,dest); mover(n-1,temp,orig,dest); } } Caso Geral 16

Pontos Chave de uma Solução Recursiva Definir o problema em termos recursivos Definir o caso geral Determinar o caso base Definir uma solução de modo que a cada chamada recursiva, podemos nos aproximar do caso base 17

Recursão x Laço Não é porque existe uma solução recursiva, que sempre devemos usá-la Soluções iterativas (com laço) são geralmente mais eficientes Soluções recursivas geralmente demandam mais poder de processamento e memória Porém, soluções utilizando recursão podem ser mais elegantes e mais compreensíveis que soluções iterativas equivalentes Programador deve analisar caso a caso qual é a melhor técnica a aplicar para a resolução do problema 18

Recursão Resumindo... Conceito Exemplos de definições recursivas Casos Base e Geral Programando Recursivamente Recursão X Laço 19