Recursividade Inhaúma Neves Ferraz

Slides:



Advertisements
Apresentações semelhantes
JAVA Orientação a Objetos
Advertisements

Programação em Java Prof. Maurício Braga
Recursividade Inhaúma Neves Ferraz
Soluções Iterativas com Laços
Programação Orientada a Objetos*
Construção de Algoritmos 2
Programação em Java Prof. Maurício Braga
Estruturas de Repetição
Métodos, Parâmetros, Argumentos e Contratos
Capítulo 1 Introdução.
Tratamento de Exceções
Aula Teste INFNET terça-feira, 11 de janeiro de 2011
Programação orientada a objetos
Assembly MAC-1 Implementação de ciclos Ciclo ‘while’ // Em Java : ...
Orientação a Objetos: Encapsulamento e Classificação
De 26 1 MVV - Arquitetura da Máquina Virtual Virtuosi Carlos José Johann Kolb Programa de Pós-Graduação em Informática Aplicada Centro de Ciências Exatas.
Introdução à Programação
De 17 1 Linguagens de Programação Orientadas a Objetos Pós-Gradução(Lato-Sensu) em Sistemas de Banco de Dados - UFPa Marco Fagundes Aula.
Arquivos Seqüenciais Inhaúma Neves Ferraz
EXPRESSÕES ARITMÉTICAS
Variáveis Dinâmicas Caixas de Nós
EXPRESSÕES ARITMÉTICAS
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
Estruturas de Dados II Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Membros estáticos.
Treinamento no GRADEp HelloWorld Args. Slide 2 Rede Nacional de Ensino e Pesquisa Treinamento em Gradep - julho 2005 HelloWorld e Args Autoria Autora.
Aula 6 Subprogramas Universidade do Vale do Rio dos Sinos
1 Aula 7 ImplementandoSubprogramas Universidade do Vale do Rio dos Sinos
Revisão da Linguagem C.
Classes e objetos Arrays e Sobrecarga
Classes e objetos P. O. O. Prof. Grace.
Introdução a Programação JAVA
Paradigmas de Linguagens de Programação Paradima da Programação Orientada à Objetos Professor: Armando Hage Belém-2008.
CRIANDO OBJETOS EM JAVA
JAVA: Conceitos Iniciais
Threads: Introdução e Implementação
Programação Orientada a Objetos com Java
PROGRAMAÇÃO ESTRUTURADA II
JAVA Linguagem Ambiente de Desenvolvimento
METODOLOGIA PARA DESENVOLVIMENTO DE SISTEMAS Prof. Dr. rer. nat. Daniel D. Abdala 1.
BCC /01 Funções. Material Didático Unificado. 1 BCC701 – Programação de Computadores I Universidade Federal de Ouro Preto Departamento de Ciência.
Interfaces.
UNIDADE 6 - complemento Funções recursivas
Linguagem técnica de programação I Java
Entendendo as definições de classe
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
1.
Orientação a Objetos e Java Graduação em Ciência da Computação
Capítulo 1. static import  A importação estática pode ser utilizado quando queremos acessar métodos ou atributos estáticos de uma outra classe.  Através.
Capítulo III Modularização Procedimentos e Funções Universidade Federal de São Carlos Departamento de Computação Aluna: Luanna Lopes Lobato
Programação Orientada a Objetos Curso de Engenharia da Computação Parte 03 – Conceitos Básicos III Prof. Fabricio Mota Oliveira
Professora: Lucélia Alves de Oliveira
Listas Simplesmente Encadeadas
Universidade do Vale do Rio dos Sinos - São Leopoldo -
Wagner Santos C. de Jesus
Nome alunos 1 Título UC. Título – slide 2 Conteúdo Conteúdo 2.
BCC /01 Aula Teórica 09 Funções Material Didático Proposto. 1 BCC701 – Programação de Computadores I Universidade Federal de Ouro Preto Departamento.
Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota
Implementação Orientada a Objetos – Aula 05 Construtores e sobrecarga de métodos Prof. Danielle Martin Universidade de Mogi das Cruzes
Polimorfismo.
Funções Matemáticas e de String
M ÉTODOS DA C LASSE S TRING. FUNÇÕES COM STRING Uma string é um tipo texto que corresponde à união de um conjunto de caracteres. Em Java, as strings são.
Implementação Orientada a Objetos – Aula 06 Conversão de tipos e métodos estáticos Prof. Danielle Martin Universidade de Mogi das Cruzes
Aula Prática 5 05/05/2010. //Estrutura do método public int subtrair (int a, int b){ //Calcule a operação desejada. int resultado = a – b; //Retorne o.
Recursividade Bruno Silva.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2014 Capítulo IX Subprogramação e Recursividade.
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
Professor Luiz José Hoffmann Filho
PCI- Funções e Procedimentos Profa. Mercedes Gonzales Márquez.
Laboratório de Programação II Método main Dados e Métodos de Classes.
Transcrição da apresentação:

Recursividade Inhaúma Neves Ferraz ferraz@ic.uff.br Departamento de Ciência da Computação Universidade Federal Fluminense ferraz@ic.uff.br

Objetos e Procedimentos Recursivos Um objeto é dito recursivo se consiste parcialmente em si mesmo ou é definido em termos de si mesmo. Procedimentos recursivos podem ser processadas por procedimentos não recursivos simulando a recursão.

Eventos que ocorrem no uso de Procedimentos Na chamada do procedimento · Passagem dos argumentos · Alocação e inicialização das variáveis locais · Transferência do controle para a função (endereço de retorno)   No retorno do procedimento · Recuperação do endereço de retorno · Liberação da área de dados · Desvio para o endereço de retorno

Chamadas de procedimentos (não recursivos)

Implementação de procedimentos recursivos Procedimentos recursivos só podem ser implementados em alto nível de abstração. As máquinas não executam procedimentos recursivos. Cabe ao “software” simular procedimentos recursivos.

Simulação de Procedimentos Recursivos A simulação de recursão utilizará uma pilha com os seguintes atributos gravados: · Parâmetros · Variáveis · Valor da função (se for o caso) · Endereço de retorno

Chamadas recursivas de funções

Chamadas recursivas de funções 1 2 11 3 5 10 14 8 19 17 6 12 15 18 7 16 4 9 13

Exemplo de Procedimentos Recursivos Cálculo do fatorial de um inteiro Série de Fibbonacci Torres de Hanói

Cálculo do fatorial de um inteiro public class Factorial { public static void main(String[] args){ int input = Integer.parseInt(args[0]); double result = factorial(input); System.out.println(result); } public static double factorial(int x){ if (x<0) return 0.0; else if (x==0) return 1.0; else return x*factorial(x-1);

Série de Fibonacci public static int fib(int n) { // Série de Fibonacci de ordem 4 int x,y; if (n <= 1) return 1; else { x = fib(n-1); y = fib(n-2); z = fib(n-3); return x + y + z; }

Torres de Hanói Denote os pinos por A, B, C Seja n o número total de discos Numere os discos de 1 (menor, no topo da pilha) até n (maior, base da pilha) Para mover n discos do pino A para o pino B: Mova n-1 discos de A para C. Isto faz com que o disco n fique isolado no pino A Mova o disco n de A para B Mova n-1 discos de C para B de maneira que eles fiquem em cima do disco n

Exemplo

Algoritmo do Fatorial fact(n) = n * fact(n - 1) se n=o então x = n-1 y = fact(x) fact(n) = n * y fim do se

Exemplo de uso de pilha x = n-1 y = fact(x) fact(n) = n * y

Simulação de Recursão

Programa simulador de recursão (1) Para criar um programa que simule a recursão deve-se partir do programa recursivo e executar 3 alterações: · Alteração inicial · Substituição de cada chamada recursiva por um conjunto de instruções · Substituição de cada retorno da função por um conjunto de instruções

Programa simulador de recursão (2) O programa assim obtido será uma simulação não recursiva do programa recursivo. Os laços recursivos serão substituídos por laços até obter uma pilha de recursão vazia Dentro dos laços uma seleção múltipla (switch..case) governa os retornos e desvios do programa

Alteração inicial Declarar uma pilha e inicializá-la como vazia Atribuir aos dados correntes os valores adequados Criar uma repetição até obter pilha vazia contendo uma seleção múltipla cujo parâmetro é o endereço de retorno da recursão O primeiro caso da seleção é a condição de término da recursão

Chamadas recursivas Quando os argumentos da chamada do procedimento forem expressões calcular o valor das expressões e atribuir estes valores aos parâmetros formais Empilhar os parâmetros, as variáveis locais e o endereço de retorno i Atualizar os valores dos parâmetros para o prosseguimento do programa

Substituição do return Desempilhar os parâmetros, variáveis locais e endereço de retorno Se o procedimento for uma função avaliar as expressões que se seguem ao return e empilhar o resultado

Modelos de geração de programas não recursivos simulando programas recursivos Modelo de alteração inicial Modelo de chamada recursiva Modelo de retorno de chamada recursiva

Exemplo Será apresentado um problema clássico de recursão : cálculo do fatorial de um inteiro

Fatorial recursivo long int fact(int n) { Long int x; long int y; if (n < 0) { printf("parâmetro negativo: %d\n",n); exit(1); } /* end if */  if (n == 0) return (1); x = n-1; y = fact(x); return(n*y); } /* end fact */

Elemento da pilha de recursão class CFactNode { private: //atributos encapsulados long int value; long int x; long int y; short int retAddr;

Alterações iniciais long int FactSwitch(long int n) { stack<CFactNode> FactStack; long int Result; short int i; short int RetAddr; CFactNode currNode; //Empilha termo vazio para desempilhamento no final do processo FactStack.push(CFactNode(0)); //Atribui aos parâmetros e endereço de retorno os valores adequados currNode.setValue(n); currNode.setRetAddr(4); currNode.setX(0); currNode.setY(0); i = 0;

Estrutura do programa while (FactStack.size()) { switch (i) case 0: // início do procedimento recursivo if(currNode.getValue()== 0) //caso básico, Saída da Recursão } else //entrada normal da recursão break; } //end case 0 case 1: // retorno da chamada recursiva } //end case 1 default: // retorno final return (Result); } //end default } //end switch } //end While

Case 0: início do procedimento case 0: // início do procedimento recursivo { if(currNode.getValue()== 0) //caso básico, Saída da Recursão Result = 1; i = currNode.getRetAddr(); // para aonde vai currNode = FactStack.top(); FactStack.pop(); //Desempilha i = currNode.getRetAddr(); } else //entrada normal da recursão currNode.setX(currNode.getValue() - 1) ; FactStack.push(currNode); //Empilha o currNode //O novo currNode recebe o Valor n-1 currNode.setValue(currNode.getX()); currNode.setRetAddr(1); //vai para case 1 i = 0; // chamada recursiva break; } //end case 0

Case 1: retorno da chamada recursiva { //Parâmetro x recebe o valor de Fact(n-1); currNode.setY(Result); Result = currNode.getValue() * currNode.getY(); i= currNode.getRetAddr(); currNode = FactStack.top(); FactStack.pop(); //chamada recursiva break; } //end case 1

Case Default: retorno final { return (Result); break; } //end default } //end switch } //end While }