Recursividade. Recursividade

Documentos relacionados
Programação Estruturada

SCC Capítulo 2 Recursão

Analise o código abaixo:

Recursividade. Prof. Jesus José de Oliveira Neto

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

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

Técnicas de análise de algoritmos

Aula 21 - Algoritmos e Funções Recursivas

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

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

Revisão: Tipo Abstrato de Dados Recursividade

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

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

LISTA DE EXERCÍCIOS MÊS 04

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

Introdução à Programação em C

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

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.

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

Algoritmos e Estruturas de Dados I

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

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.

Aula 10 Algoritmos e Funções Recursivas

PROGRAMAÇÃO INSTRUÇÕES DA LINGUAGEM C

Recursividade. Estrutura de Dados. Prof. Kleber Rezende

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

SSC300- Linguagens de Programação e Aplicações Profa Vânia de Oliveira Neves. ICMC/USP São Carlos

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

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

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

Algoritmos e Funções Recursivas

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

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

MC102 Algoritmos e Programação de Computadores

1) Operadores de auto incremento ++ e auto decremento --

Análise de Algoritmos Parte 4

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

Linguagem C estruturas de repetição

ESTRUTURAS CONDICIONAIS. Introdução à Ciência da ComputaçãoI Simone Senger de Souza

PROGRAMAÇÃO INSTRUÇÕES DA LINGUAGEM C

Programação: Vetores

Análise de Complexidade para algoritmos iterativos e recursivos

Python: Recursão. Claudio Esperança

Aula 16: Laços aninhados e desvios

Introdução à Programação em C (I)

BCC202 - Estrutura de Dados I

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

Fundamentos de Programação 1

Aula 3: Algoritmos: Formalização e Construção

Roteiro Prático Nº 13 Recursividade

3. Linguagem de Programação C

LP II Estrutura de Dados

PROGRAMAÇÃO FUNÇÕES NA LINGUAGEM C

Introdução à Programação em C (I)

Transcrição:

A recursão é uma técnica que define um problema em termos de uma ou mais versões menores deste mesmo problema. Esta ferramenta pode ser utilizada sempre que for possível expressar a solução de um problema em função do próprio problema. Para se codificar programas de modo recursivo usa-se um procedimento ou sub-rotina, que permite dar um nome a um comando, o qual pode chamar a si próprio. Esta chamada pode ser diretamente recursiva, quando o procedimento P contiver uma referência explícita a si próprio, ou indiretamente recursiva, quando o procedimento P contiver uma referência a outro procedimento Q, que por sua vez contém uma referência direta ou indireta a P.

Exemplo: Soma N primeiros números inteiros Supondo N = 5; S(5) = 1+2+3+4+5 = 15 -> S(5) = S(4) + 5 -> 10 + 5 = 15 S(4) = 1+2+3+4 =10 -> S(4) = S(3) + 4 -> 6 + 4 = 10 S(3) = 1+2+3 = 6 -> S(3) = S(2) + 3 -> 3 + 3 = 6 S(2) = 1+2 = 3 -> S(2) = S(1) + 2 -> 1 + 2 = 3 S(1) = 1 =1 -> S(1) = 1 --------------->solução trivial Em se tratando de procedimentos recursivos pode-se ocorrer um problema de terminação do programa, como um looping interminável ou infinito. Portanto, para determinar a terminação das repetições, deve-se: 1) Definir uma função que implica em uma condição de terminação (solução trivial), e 2) Provar que a função decresce a cada passo de repetição, permitindo que, eventualmente, esta solução trivial seja atingida.

S ( N ) = 1 S ( N 1) + N, se se N = 1 N > 1 solução trivial chamada recursiva main( ) int n; scanf( %d, &n); printf( %d, soma(n)); int soma(int n) if (n == 1) return (1); else return (n + soma(n 1)); main 1ª)soma 2ª)soma 3ª)soma 4ª)soma n=4 n=3 soma(4) n=2 n=1 4+soma(3) 3+soma(2) soma(4)=10 soma(3)=6 2+soma(1)0 soma(2)=3 soma(1)=1 Teste de Mesa para N=4 (somatório dos 4 primeiros números inteiros) Exercício Determine a ordem de complexidade do algoritmo recursivo de soma de N primeiros números naturais

Seqüência de Fibonacci Cada termo resulta da adição dos dois que o antecedem (U n = U n-1 + U n-2 ) originando assim os números 0; 1; 1; 2; 3; 5; 8; 13; 21 e por aí em diante. Os números desta série têm muitas propriedades e aplicações interessantes, por exemplo na botânica, no desenvolvimento de plantas (arranjo das folhas), e na genética, na produção de coelhos. Seqüência de Fibonacci F ( N ) = 1 F se ( N 1) + F( N 2), N = 1ou N = 2 se N > 2 solução trivial chamada recursiva void main() int n; scanf( %d, n); printf( %d, fibonacci(n)); int fibonacci(int n) if ((n == 1) (n == 2)) return (1); else return(fibonacci(n-1)+fibonacci(n-2));

Seqüência de Fibonacci Fib(5) 5 Fib(4) + Fib(3) 3 2 Fib(3) + Fib(2) Fib(2) + Fib(1) 2 1 1 1 Fib(2) + Fib(1) 1 1 Seqüência de Fibonacci Os números de Fibonacci podem ser calculados por um esquema iterativo, que evita o cálculo repetido dos mesmos valores, através do uso de variáveis auxiliares. int cont=1, post=1, ant=0, aux; while (cont < n) aux = post; post = post + ant; ant = aux; cont = cont + 1;

Vantagens X Desvantagens Um programa recursivo é mais elegante e menor que a sua versão iterativa, além de exibir com maior clareza o processo utilizado, desde que o problema ou os dados sejam naturalmente definidos através de recorrência. Por outro lado, um programa recursivo exige mais espaço de memória e é, na grande maioria dos casos, mais lento do que a versão iterativa. Fatorial int factorial(int n) if (n == 0) return 1; else return n * factorial(n-1);

Fatorial factorial(20) -- allocate 1 word of memory, call factorial(19) -- allocate 1 word of memory, call factorial(18) -- allocate 1 word of memory,... call factorial(2) -- allocate 1 word of memory, call factorial(1) -- allocate 1 word of memory, call factorial(0) -- allocate 1 word of memory, at this point 21 words of memory and 21 activation records have been allocated. return 1. -- release 1 word of memory. return 1*1. -- release 1 word of memory. return 2*1. -- release 1 word of memory.... Torre de Hanoi Existem três estacas A, B e C. Vários discos de diferentes diâmetros são encaixados na estaca A, de modo que um disco maior fique sempre abaixo de um disco menor, O objetivo é deslocar os discos para a estaca C, usando a estaca B como auxiliar. Somente o primeiro disco de toda estaca pode ser deslocado para outra estaca, e um disco maior não pode nunca ficar posicionado sobre um disco menor.

Torre de Hanoi #include <stdio.h> main() int n; scanf( %d, &n); towers(n, A, B, C ); towers(int n, char frompeg, char topeg, char auxpeg) if(n == 1) printf( \n%s%c%s%c, move disco 1 da estaca, frompeg, p/ a estaca, to peg); return; towers(n-1, frompeg, auxpeg, topeg); printf( \n%s%d%s%c%s%c, move disco, n, da estaca, frompeg, p/ a estaca, to peg); towers(n-1, auxpeg, topeg, frompeg); Exercício Determine a ordem de complexidade do algoritmo recursivo de Torre de Hanoi