Recursividade Alguns problemas são definidos com base nos mesmos, ou seja, podem ser descritos por instâncias do próprio problema.

Documentos relacionados
Introdução a Algoritmos Parte 08

Estruturas de Controle de Fluxo

algoritmo "exercício 28" var opcao, n1, n2: inteiro funcao seleciona_opcao():inteiro var o:caractere inicio repita escreva ("Efetue uma multiplicação

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

Estruturas de Controle de Fluxo

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

Algoritmos e Estruturas de Dados I. Universidade Federal de São João del-rei Pedro Mitsuo Shiroma Sala 119 Bloco 3

ESTRUTURAS DE CONTROLE ESTRUTURAS DE REPETIÇÃO

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

ALGORITMOS I. Procedimentos e Funções

algoritmo "exercício vetor" var vet:vetor [1..12] de inteiro i:inteiro inicio para i de 1 ate 12 faca escreva ("Entre com vetor[",i,"]: ") leia

algoritmo "exercício 22 resposta incorreta" var A, i: inteiro eh_primo: logico inicio repita escreva ("Entre com um valor inteiro positivo: ") leia

n1, /,n2, =,res n1, n2, res: real res <- n1 / n2 Digite o Dividendo: n2<>0 Digite o Divisor: verdadeiro falso

VisuALG Estruturas de Repetição. Professor: Alex Sandro Forghieri

Aula 5 Controle do Fluxo de Execução

ESTRUTURAS DE REPETIÇÃO - PARTE 1

Prof. Jorge Cavalcanti

algoritmo "exercício 13" var op1, op2: real operador: caractere inicio escreva ("Entre com o primeiro operando: ") leia (op1) escreva ("Entre com o

Estruturas de Controle de Fluxo

Aplicaremos a técnica do teste de mesa sobre o algoritmo abaixo, o qual visa determinar o número de vértices de uma figura geométrica.

Sistemas Operacionais e Introdução à Programação. Introdução à Lógica de Programação: estruturas de repetição

Estruturas de Repetição. Prof. Paulo Cesar F. de Oliveira, BSc, PhD

Estruturas de Repetição. João Medeiros FATERN

Fluxograma. Símbolo Nome Descrição

ESTRUTURAS DE CONTROLE - LAÇOS OU MALHAS DE REPETIÇÃO

ESTRUTURAS DE CONTROLE ESTRUTURAS DE REPETIÇÃO

Lógica e Linguagem de Programação Aula 04 - Estruturas de Repetição Repetição com Teste no Final - Repita Até - GABARITO Professor: Danilo Giacobo

INFORMÁTICA APLICADA AULA 05 ALGORITMOS

Aula prática 5. Funções Recursivas

Aula 4 Oficina de Programação Algoritmos - Parte 3. Profa. Elaine Faria UFU

Introdução a Algoritmos Parte 06

Pseudocódigo Exercício 6

Processamento de Dados aplicado à Geociências. AULA 8: Comandos de repetição Repita-até

Estruturas de Controle de Fluxo Estruturas de Repetição. Givanaldo Rocha

Prof. Jorge Cavalcanti

Fluxograma. Símbolo Nome Descrição

Modularização. Exercício 28

Construção de Algoritmos II Aula 06

Aula 05: - Recursão (parte 1)

Estruturas de dados homogêneas

Algoritmos I Aula 10 Estrutura de controle: repetição

Programação II. Victor Amorim dos Santos

Algoritmos e Programação I

Algoritmos. Prof. Jonatas Bastos Site:

Pseudocódigo Exercício 6

Amanda Gondim de Oliveira

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

Aula 05: - Recursão (parte 1)

CONTROLE DE FLUXO DE EXECUÇÃO

Linguagem Computacional. Estruturas de Controle: Estruturas de Repetição. Prof. Dr. Adriano Cansian Prof. Dr. Leandro Alves Neves

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

ESTRUTURAS DE CONTROLE

MATRIZES - PARTE Definição e Manipulação de Matrizes AULA 21

Algoritmos e Programação

Estruturas de Repetição

Recursividade. Prof. Jesus José de Oliveira Neto

1. Escreva um algoritmo em fluxograma que descreva a sequência 1, 5, 13, 17, 21, 25,?,?,?,?. Ou seja, até o seu 10º termo.

9. Comando de repetição com variável de controle (para.. de.. até.. faça)

... contador = contador + 1; //contador++; ... <fim_da_estrutura_de_repetição> soma = 0; <estrutura_de_repetição_com_variável_x> soma = soma + x;

Método para Construção de Algoritmos

Exercícios Aula Prática VII

ESTRUTURAS DE REPETIÇÃO - PARTE 2

Programação Estruturada

Estruturas de Repetição

ALGORITMOS E APLICAÇÕES. FATEC IPIRANGA ADS Noturno 1º semestre de 2012 Prof. Luiz Carlos de Jesus Junior

Fundamentos da programação de computadores.

Este conceito é bastante simples e será útil e conveniente nos itens seguintes, na definição das estruturas básicas de controle de execução.

ALGORITMOS. Estruturas de RepeGção. Alessandro J. de Souza DIATINF - IFRN. twi;er.com/ajdsouza

LÓGICA DE PROGRAMAÇÃO. Estrutura de Repetição Determinada e Indeterminada. Sérgio Carlos Portari Júnior

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

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

INFORMÁTICA APLICADA AULA 02 ALGORITMOS

Estrutura de controle repetitiva: Para (for)

Aula 16 Estruturas de Controle. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes

Estruturas de Controle de Fluxo Pseudocódigo/Exercício Construa o pseudocódigo de um algoritmo para obter o resultado da divisão de dois números

Programação Estruturada

Processamento da Informação

LINGUAGEM DE PROGRAMAÇÃO

VETORES Motivação AULA 19

Introdução à Ciência da Computação

Conceitos básicos de algoritmos

Estruturas de Controle de Fluxo Estruturas de Seleção. Givanaldo Rocha

COMANDOS DE REPETIÇÃO (ENQUANTO)

Algoritmos e Programação

Revisão: Tipo Abstrato de Dados Recursividade

COMANDOS DE REPETIÇÃO (ENQUANTO, REPITA E PARA)

ET51D - INFORMÁTICA. Algoritmos - Estruturas de Decisão. Professor: Glauber G. O. Brante.

Microcontroladores. Programação: fluxogramas, pseudocódigos e lógica. Prof. Daniel

INFORMÁTICA APLICADA AULA 06 ALGORITMOS

AULA 07. HABILIDADES TRABALHADAS: Desenvolver algoritmos utilizando laços a partir da leitura de fluxogramas ou algoritmos em portugol.

Sumário. Ciência da Computação. Prof. Dr. Leandro Alves Neves. Aula 10. Algoritmos e Programação. Enquanto (Teste no início) Repeat (Teste no final)

Variáveis Compostas Homogêneas Vetores

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

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

Lógica de Programação ALGORITMOS.

ALGORITMOS E PROGRAMAÇÃO Estruturas de repetição. Andreza Leite andreza.leite@univasf.edu.br

Resumo VISUALG. A seção de declaração de variáveis começa com a palavra-chave var, e continua com as seguintes sintaxes:

Algoritmos e Programação

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

Transcrição:

Recursividade Alguns problemas são definidos com base nos mesmos, ou seja, podem ser descritos por instâncias do próprio problema. Para tratar estas classes de problemas, utilizase o conceito de recursividade. Um módulo recursivo é um módulo que em sua seção de comandos chama a si mesmo. Uma grande vantagem da recursividade é o fato de gerar uma redução no tamanho do algoritmo, permitindo descrevê-lo de forma mais clara e concisa. 334

Recursividade Porém, todo cuidado é pouco ao se fazer módulos recursivos. A primeira coisa a se providenciar é um critério de parada, o qual vai determinar quando o módulo deverá parar de chamar a si mesmo. Este cuidado impede que o módulo se chame infinitas vezes. Um exemplo de um problema passível de definição recursiva é a operação de multiplicação efetuada sobre números naturais. Podemos definir a multiplicação em termos da operação mais simples de adição. 335

No caso A * B Recursividade pode ser definido como A + A * (B - 1) precisamos agora especificar um critério de parada. Qual seria? 336 A * 0 = 0

337 Recursividade De acordo com o que vimos até o momento, podemos definir um laço de repetição que implementaria o cálculo da operação de multiplicação com base na operação de adição. Definiremos agora este laço: A, B, RES: inteiro RES<-0 enquanto (B<>0) faca RES <- RES + A B<-B-1 fimenquanto

338 Recursividade Com base no que vimos podemos, também, definir um módulo recursivo que implemente a operação de multiplicação com base na operação de adição: funcao multiplicar (A: inteiro; B: inteiro): inteiro inicio se (B=0) entao retorne (0) senao retorne (A + multiplicar (A, B-1)) fimse fimfuncao

Recursividade Para uma melhor compreensão do que foi apresentado, devemos compreender o conceito de registro de ativação. 339 O registro de ativação é uma área de memória que guarda informações referentes ao estado atual de um módulo ou do próprio algoritmo: - valor dos parâmetros (para módulos); - valor das variáveis locais (para módulos); - valor do contador de programa (PC); - etc.

Recursividade Sempre que um módulo é chamado o registro de ativação de quem o invocou (do algoritmo principal, de um outro módulo ou do próprio módulo) é salvo e um novo registro de ativação é criado para o módulo invocado. Estes registros de ativação são empilhados em uma pilha de registros de ativação. Este processo é conhecido como salvamento e troca de contexto e pode ser melhor compreendido se o aplicarmos sobre um algoritmo que se utilize do módulo recursivo multiplicar definido anteriormente. 340

algoritmo "exemplo recursividade" var A, B, RES: inteiro funcao multiplicar (A: inteiro; B: inteiro): inteiro inicio 1 se (B=0) entao 2 retorne (0) 3 senao 4 retorne (A + multiplicar (A, B-1)) 5 fimse fimfuncao inicio 1 2 3 4 5 6 7 8 9 10 341 repita escreva ("Multiplicando (valor natural): ") leia (A) ate (A>=0) repita escreva ("Multiplicador (valor natural): ") leia (B) ate (B>=0) RES <- multiplicar(a,b) escreva (a," *",b," =",res) fimalgoritmo

342 Pilha de registros de ativação Para melhor contextualizar nossa explicação vamos presumir que o usuário forneceu o valor 7 para A e o valor 3 para B.

343 PC = 1 Pilha de registros de ativação Inicialmente o registro de ativação do algoritmo é colocado na pilha de registros de ativação.

RES <- multiplicar (7,3)? 344 PC = 1 A = 7 B = 3 PC = 19 Pilha de registros de ativação Em nosso exemplo a primeira execução de um módulo ocorre na nona instrução da seção de comandos do algoritmo. Neste momento é salvo o registro de ativação do algoritmo e introduzido na pilha um novo registro de ativação referente ao módulo chamado.

RES <- multiplicar (7,3)? 7 + multiplicar (7,2)? PC = 1 A = 7 B = 2 345 PC = 14 PC = 9 A = 7 B = 3 Pilha de registros de ativação Devido ao valor contido no parâmetro B a quarta instrução da seção de comandos do módulo é executada chamando novamente o módulo multiplicar. Neste momento é salvo um registro de ativação (RA) do invocador e introduzido na pilha um novo RA.

RES <- multiplicar (7,3)? 7 + multiplicar (7,2)? 7 + multiplicar (7,1)? PC = 1 PC = 14 A = 7 B = 1 A = 7 B = 2 346 PC = 14 PC = 9 A = 7 B = 3 Pilha de registros de ativação Devido ao valor contido no parâmetro B a quarta instrução da seção de comandos do módulo é executada chamando novamente o módulo multiplicar. Neste momento é salvo o RA do invocador e introduzido na pilha um novo RA.

347 Recursividade Devido ao valor contido no parâmetro B a quarta instrução da seção de comandos do módulo é executada chamando novamente o módulo multiplicar. Neste momento é salvo o RA do invocador e introduzido na pilha um novo RA. Devido ao valor contido no parâmetro B a segunda instrução da seção de comandos do módulo é executada retornando o valor zero e finalizando as chamadas recursivas. Neste momento é salvo o RA do invocador e introduzido na pilha um novo RA. RES <- multiplicar (7,3)? 7 + multiplicar (7,2)? 7 + multiplicar (7,1)? 7 + multiplicar (7,0)?0 PC = 1 PC = 14 PC = 4 PC = 4 PC = 9 A = 7 B = 0 A = 7 B = 1 A = 7 B = 2 A = 7 B = 3 Pilha de registros de ativação

Recursividade Desta forma um a um os módulos vão sendo finalizados e seus registros de ativação desempilhados. RES <- multiplicar (7,3) RES <-? 21 7 + multiplicar (7,2) 7 +? 14 7 + multiplicar (7,1) 7 + 7? 7 + multiplicar 7 + 0(7,0) 0 PC = 4 PC = 4 A = 7 B = 1 A = 7 B = 2 PC = 4 PC = 9 A = 7 B = 3 Pilha de registros de ativação 348

349 Recursividade Com base no que foi exposto, podemos visualizar algumas desvantagens da utilização de recursividade, como: - O consumo de memória necessário para a troca de contexto. - Redução do desempenho de execução devido ao tempo para gerenciamento de chamadas. - Dificuldades na depuração de programas recursivos, especialmente se a recursão for muito profunda. Exercício 47: Para uma melhor compreensão do conceito de recursividade faça agora um módulo recursivo para calcular o fatorial de um número natural e construa um algoritmo que o utilize de forma adequada do módulo em questão.

algoritmo "fatorial recursivo" var n: inteiro funcao fatorial (num: inteiro): inteiro inicio se (num=0) entao retorne (1) senao retorne (num * fatorial(num-1)) fimse fimfuncao inicio escreva("digite o número que você deseja saber o fatorial: ") leia (n) se (n>=0) entao escreva ("O fatorial do número ",n," é ",fatorial(n)) senao escreva("não existe fatorial de números negativos!") fimse fimalgoritmo 350

351 Recursividade Um outro exemplo muito utilizado de problema que possui uma definição recursiva é a geração da série de Fibonacci: {0,1,1,2,3,5,8,13,21,34, } Uma função recursiva que recebe a posição do elemento na série e retorna seu valor é: funcao fibonacci (i: inteiro): inteiro inicio se (i=1) entao retorne (0) senao se (i=2) entao retorne (1) senao retorne (fibonacci(i-1) + fibonacci(i-2)) fimse fimse fimfuncao

Recursividade Fora os problemas mencionados, gerados pela recursão, qual seria outro problema proveniente da recursão evidenciado na função recursiva apresentada para o cálculo do valor de um elemento da série de Fibonacci com base na sua posição? O cálculo do mesmo elemento da séria n vezes. fibonacci(5) fibonacci(4) + fibonacci(3) fibonacci(3) + fibonacci(2) fibonacci(2) + fibonacci(1) fibonacci(2) + fibonacci(1) 352

Obs.: Mesmo problemas que possuem uma definição recursiva também podem ser solucionados de forma imperativa. Um exemplo disso é o cálculo do valor de um elemento da série de Fibonacci com base na sua posição através da função imperativa abaixo: funcao fibonacci (i: inteiro): inteiro var a, b:inteiro inicio se (i=1) entao retorne (0) senao 353 se (i=2) entao retorne (1) senao a<-0 b<-1 enquanto (i-2<>0) faca b<-b+a a<-b-a i<-i-1 fimenquanto retorne (b) fimse fimse fimfuncao

Recursividade Assim como a série de Fibonacci existem outras sequências definidas por recorrência, ou seja, onde um valor da sequência é definido em termos de um ou mais valores anteriores, o que é denominado de relação de recorrência. Exercício 48: Estabeleça a relação de recorrência presente na sequência abaixo e construa uma função recursiva que receba a posição do elemento na série e retorne seu valor. S = { 2, 4, 8, 16, 32 } 354

Recursividade A sequência S é definida por recorrência por 1. S(1) = 2 2. S(n) = 2 * S(n-1) para n>=2 Uma função recursiva que recebe a posição do elemento na série e retorna seu valor é: funcao func (p: inteiro): inteiro inicio se (p=1) entao retorne (2) senao retorne (2*func(p-1)) fimse fimfuncao

Recursividade Exercício 49: Elabore um módulo recursivo que receba dois números inteiros, como parâmetros, e retorne o resultado do somatório de todos os números contidos no intervalo aberto delimitado pelos números fornecidos. Em seguida, construa um algoritmo que se utilize de forma eficaz da módulo elaborado. 356