Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

Estruturas de dados: Recursividade, Slides de Estruturas de Dados e Algoritmos

Slides da aula 8 de Engenharia Telemática

Tipologia: Slides

2010

Compartilhado em 29/11/2010

samuel-santos-22
samuel-santos-22 🇧🇷

4.6

(41)

262 documentos

Pré-visualização parcial do texto

Baixe Estruturas de dados: Recursividade e outras Slides em PDF para Estruturas de Dados e Algoritmos, somente na Docsity! Estruturas de Dados DR Re ade Prof. Alex Sandro alexscunha(Dyahoo.com.br NEED! 2 Recursividade  Conceito  Uma função é dita recursiva se ela faz chamada a si mesmo (direta ou indiretamente) dentro de sua implementação  Possuem um critério de parada, caso contrário, seria uma recursividade infinita.  Um exemplo clássico: cálculo do fatorial  Se n =0, fatorial = 1  3! = 3x2x1 = 6  4! = 4x3x2x1 = 24 (e assim por diante) 5 Recursividade  Solução recursiva: int fatorial(int num){ int x,y; if (num==0) return 1; x = num – 1; y = fatorial(x); return( num * y ); }  No comando y=fatorial(x), a função fatorial chama a si mesma  Cada vez que for executado, sua entrada será um a menos que na vez anterior  Devemos verificar se o algoritmo sempre tem uma parada 6 Recursividade  Como funciona a recursividade?  Na primeira chamada da função, n=4 e x=3  Toda vez que fatorial é chamada recursivamente, um novo conjunto de variáveis locais e de parâmetros é alocado.  Apenas a cópia mais recente das variáveis são referenciadas  Quando ocorre o retorno de fatorial, o fluxo é retomado ao ponto de chamada anterior  A alocação mais recente das variáveis é liberada 7 Recursividade  Uso da pilha para fazer o controle das variáveis:  A pilha mantém as sucessivas gerações de variáveis locais e parâmetros  Toda vez que uma função recursiva é iniciada, uma nova alocação de suas variáveis é introduzida no topo da pilha  Quando a função retorna ao ponto de chamada anterior, a alocação do topo é liberada e é executado um desvio para o endereço de retorno  A função de chamada recupera o valor, prossegue a execução e recorre à sua própria área de dados que, agora, está no topo da pilha  Suponha a execução da seguinte instrução: printf(“%d”,fatorial(4)); 10 Recursividade  Considerações  Devemos verificar a validade dos parâmetros de entrada numa rotina recursiva printf(“%d”, fatorial(-1)); Resultado: Você acha que a função vai ser executada corretamente? Quando ela vai parar? Alguma mensagem de erro é produzida? 11 Recursividade  Revisão da função fatorial() int fatorial(int num){ int x,y; if (num < 0) { printf(“%s”,”Parametro negativo na funcao fatorial”); exit(1); } if (num==0) return 1; x = num – 1; y = fatorial(x); return( n * y ); } 12 Recursividade  Outro Exemplo: Sequência de Fibonacci.  0, 1, 1, 2, 3, 5, 8, 13, 21, ...  Começa com 0 e 1, cada número posterior é a soma de dois anteriores:  Fibonacci(0) = 0;  Fibonacci(1) = 1;  Fibonacci(2) = Fibonacci(0) + Fibonacci(1);  Fibonacci(3) = Fibonacci(1) + Fibonacci(2);  Fibonacci(4) = Fibonacci(2) + Fibonacci(3);  Fibonacci(5) = Fibonacci(3) + Fibonacci(4); 15 Recursividade Atenção !  Qualquer problema que pode ser resolvido recursivamente também pode ser resolvido iterativamente, mesmo que o resultado não seja aparente;  Evite usar a recursividade onde o desempenho é fundamental. Recursividade aumenta “overhead” de chamadas de funções, ou seja, são demoradas (tempo do processador) e consomem memória adicional. 16 Recursividade  Desenvolver soluções recursivas não é uma tarefa fácil  As definições e algoritmos originais precisam ser desenvolvidos.  A maioria dos problemas pode ser solucionada de maneira simples (sem recursividade)  Porém, alguns problemas podem ser resolvidos em termos lógicos e com mais elegância por meio de recursividade. 17 Recursividade  Exercício: Determine o que a seguinte função recursiva em C calcula. Escreva uma função iterativa para atingir o mesmo objetivo. func(int n) { if (n==0) return 0; return (n + func(n-1)); } /* fim da função func */
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved