Recursão e Back-Tracking

Documentos relacionados
Fernando Silva DCC-FCUP. Estruturas de Dados

Ordenação e Pesquisa

Introdução à Programação

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

Estruturas de Dados Aula 14: Recursão

Estruturas de Dados Aula 14: Recursão 19/05/2011

Recursividade. Recursividade

1 Da aula teórica ao Java

Alguns Exemplos em Java

Estrutura de Dados Conceitos Iniciais

Árvores e Mapas. Luís Lopes. Estruturas de Dados DCC-FCUP

SCC Capítulo 2 Recursão

Recursão David Déharbe

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

SCC0601 Projeto de Algoritmos. Recursão

Programação I Aula 15 Definições recursivas

Capítulo VII : A Recorrência

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

GFM015 Introdução à Computação. Algoritmos. Ilmério Reis da Silva UFU/FACOM

Programação Estruturada

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

Algoritmos e Estruturas de Dados I

Programação científica C++

Processamento da Informação

Programação I Aula 15 Definições recursivas Pedro Vasconcelos DCC/FCUP

MC102 Aula 27 Recursão II

Notas sobre Definições Recursivas

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

UNIVERSIDADE FEDERAL DO PARÁ BIBLIOTECA DE OBJETOS MATEMÁTICOS COORDENADOR: Dr. MARCIO LIMA

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

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

Introdução à Programação Aula 16 Mais exemplos de recursão

SCC Introdução à Ciência de Computação II. Recursão

Algoritmos e Modelação Computacional. Paulo Mateus MEBiom LMAC 2018

Análise e Síntese de Algoritmos. Revisão CLRS, Cap. 4, 6

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

Algoritmos e Estruturas de Dados I Linguagem C

Exame de Admissão. Instituto Nacional de Pesquisas Espaciais 18 de setembro de 2018 A: GABARITO

Estrutura de Dados. Introduc a o e Alocac a o de Memo ria. Vilson Heck Junior. Instituto Federal de Santa Catarina

Programação de Computadores II TCC

Introdução à Programação

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

Estruturas de Dados. Pedro Ribeiro 2017/2018 DCC/FCUP. Pedro Ribeiro (DCC/FCUP) Estruturas de Dados 2017/ / 16

Recursividade. Prof. Jesus José de Oliveira Neto

Lista de Figuras Figura 1 1: Figura 1 2: Figura 1 3: Figura 1 4: Figura 1 5: Figura 1 6: Figura 1 7: Figura 2 1: Figura 2 2: Figura 2 3: Figura 2 4:

Comparação com Divisão e Conquista

Universidade Federal de Uberlândia Faculdade de Computação GGI030 Programação Orientada a Objetos 1o. Semestre de 2017 Prof.

O termo Programação Dinâmica é um bocado infeliz.

Introdução à Programação

Lista 1 - PMR2300. Fabio G. Cozman 3 de abril de 2013

Prof. A. G. Silva. 13 de novembro de Prof. A. G. Silva INE5603 Introdução à POO 13 de novembro de / 1

PROGRAMAÇÃO DINÂMICA

Análise e Complexidade de Algoritmos

Análise e Complexidade de Algoritmos

Universidade Federal do ABC Programação Estruturada Fabrício Olivetti França Lista de Exercícios 02

SCC0214 Projeto de Algoritmos

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

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

ÍNDICE. PREFÁCIO xv. 3 PROCESSOS GERADOS POR PROCEDIMENTOS Recursão Linear Cálculo de potências Cálculo de factoriais 91

Introdução à Programação / Programação I

Linguagem Java. Introdução. Rosemary Silveira Filgueiras Melo

Fernando Lobo. Algoritmos e Estrutura de Dados. Outra técnica de concepção de algoritmos, tal como Divisão e Conquista.

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

UNIVERSIDADE ESTADUAL PAULISTA Julio de Mesquita Filho" FACULDADE DE ENGENHARIA

Análise de Complexidade para algoritmos iterativos e recursivos

Algoritmos e Estruturas de Dados

Programação I Aula 17 Correção de programas Pedro Vasconcelos DCC/FCUP

1 Elementos Básicos da Linguagem C Parte 1: Revisão da Linguagem C

Exercícios: Recursão

Projeto e Análise de Algoritmos Projeto de Algoritmos Programação Dinâmica. Prof. Humberto Brandão

Algoritmos e Estruturas de Dados

SCC Capítulo 3 Análise de Algoritmos - Parte 2

Solução de Recorrências

Pesquisa e Ordenação

Introdução a Algoritmos Parte 08

Introdução à Linguagem Java

7. Introdução à Complexidade de Algoritmos

Paradigmas de Projetos de Algoritmos

Introdução à Linguagem Java

Divisão-e-Conquista ( ) CAL ( ) MIEIC/FEUP. ./rr (1) Técnicas de Concepção de Algoritmos

Sistemas de Produção, Espaços de estados e buscas

Python: Recursão. Claudio Esperança

LISTA DE EXERCÍCIOS MÊS 04

Prova 2 PMR3201 1o. semestre 2016 Prof. Thiago Martins

Departamento de Ciência de Computadores Estruturas de Dados (CC114) FCUP 2010/11. 2 o Teste: 20/Junho/2011

Introdução Paradigmas

Análise de algoritmos

Fundamentos de programação

HeapSort. Estrutura de Dados II Jairo Francisco de Souza

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Funções Finitas II: árvores AVL

Lista 2 - PMR2300/3200

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

Analise o código abaixo:

Entrada Processamento Saída

Oficina cognição e lógica

Introdução. Por que desenvolver ALGORITMO?

Transcrição:

Recursão e Back-Tracking Fernando Silva & Luís Lopes DCC-FCUP Estruturas de Dados

Recursão Uma função diz-se recursiva quando se chama a si própria, directa ou indirectamente. A recursão: à semelhança dos ciclos, permite repetir a execução de um conjunto de instruções é uma técnica de programação poderosa que permite frequentemente formular problemas complexos de forma simples está na base de uma técnica algorítmica designada por dividir-para-conquistar, em que um problema é decomposto em sub-problemas idênticos de menor complexidade, aplicando-se a cada instância o mesmo algoritmo de resolução.

A função factorial 1 se n=0 n! = fact(n) = n fact(n 1) se n>0 Exemplo: 5! = 5 4 3 2 1 = 5 (4 3 2 1) = 5 4! Importante: o 0! = 1 funciona como caso base da recursão, Uma função recursiva deve: ter pelo menos um caso base que pára a recursão as chamadas recursivas devem aproximar-se do caso base

Implementação Factorial c l a s s TestFactorial { p u b l i c s t a t i c v o i d main ( String args []) { System. out. println (" fact (9) = " + fact (9)); p r i v a t e s t a t i c i n t fact ( i n t n) { i f ( n == 0 ) r e t u r n 1; e l s e r e t u r n n * fact ( n - 1 );

A sequência de Fibonacci 1 se n=0 fib(n) = 1 se n=1 fib(n 1) + fib(n 2) se n>1 Exemplo: fib(3) = fib(2)+fib(1) = (fib(1)+fib(0))+fib(1) = (1+1)+1 = 3 neste caso a base da recursão é composta por fib(0) = 1 e fib(1) = 1 a sequência é 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,...

Implementação Fibonacci c l a s s TestFibonacci { p u b l i c s t a t i c v o i d main ( String args []) { System. out. println (" fib (9) = " + fib (9)); p r i v a t e s t a t i c i n t fib ( i n t n) { i f ( n == 0 n == 1 ) r e t u r n 1; e l s e r e t u r n fib ( n - 1 ) + fib ( n - 2);

Mais Exemplos... p r i v a t e s t a t i c i n t recsum ( i n t [] a, i n t n) { i f (n == 1) r e t u r n a [0]; e l s e r e t u r n recsum (a, n - 1) + a[n - 1];...

Mais Exemplos...... p r i v a t e s t a t i c v o i d recinvert ( i n t [] a, i n t i, i n t j) { i f ( i < j ) { i n t tmp = a[i]; a[i] = a[j]; a[j] = tmp ; recinvert (a, i + 1, j - 1);...

Mais Exemplos...... p r i v a t e s t a t i c i n t recbinarysum ( i n t [] a, i n t i, i n t j) { i f ( i == j ) r e t u r n a[i]; e l s e { i n t k = (i + j) / 2; r e t u r n recbinarysum (a,i,k) + recbinarysum (a,k + 1,j);...

Diagrama de chamadas para um exemplo anterior com 8 elementos

Um último exemplo: pesquisa binária p r i v a t e s t a t i c i n t binarysearch ( i n t [] values, i n t val ) { r e t u r n binarysearch ( values, val, 0, values. length - 1); p r i v a t e s t a t i c i n t binarysearch ( i n t [] values, i n t val, i n t low, i n i f ( high < low ) r e t u r n -1; e l s e { i n t half = low + ( high - low ) / 2; i f ( val == values [ half ] ) r e t u r n half ; e l s e i f ( val < values [ half ] ) r e t u r n binarysearch ( values, val, low, half - 1); e l s e r e t u r n binarysearch ( values, val, half + 1, high );

Torres de Hanoi Jogo do século XIX associado a uma história da construção do Templo de Brahma. Dadas 3 pegas em diamante, uma das quais com 64 discos em ouro, foi pedido aos monges que deslocassem todos discos da 1 a para a 3 a pega, eventualmente usando a 2 a pega, mas sem nunca colocarem um disco maior em cima de um menor. De acordo com a lenda, quando o último disco fosse colocado o mundo terminaria.

Torres de Hanoi Problema: dadas 3 torres A, B e C, como deslocar os discos de A para C, eventualmente usando B, deslocando um disco de cada vez e sem nunca colocar um disco maior em cima de um menor.

Torres de Hanoi: uma solução objectivo: partindo de uma configuração inicial chegar a uma configuração final, deslocando um disco de cada vez e sem nunca colocar um disco maior em cima de um menor:

Torres de Hanoi: uma solução Suponhamos que conseguimos passar N-1 discos de A para B, usando C como temporário, ficando: Para chegar à solução final, os movimentos seguintes seriam: passar o disco maior de A para C passar os N-1 discos de B para C usando A como temporário O número mínimo de movimentos para chegar à solução é 2 N 1, para N discos.

Torres de Hanoi c l a s s TowersOfHanoiTest {... s t a t i c v o i d movedisks ( i n t n, char from, char to, char aux ) { i f ( n == 1 ) { // one disk remaining System. out. printf (" Move disk from %c to %c%n",from,to ); numbermoves ++; e l s e { movedisks ( n - 1, from, aux, to ); // n-1 from A to B using C movedisks ( 1, from, to, aux ); // largest disk from A to C movedisks ( n - 1, aux, to, from ); // n-1 from B to C using A

Torres de Hanoi c l a s s TowersOfHanoiTest { s t a t i c i n t numbermoves = 0; p u b l i c s t a t i c v o i d main ( String [] args ) { Scanner stdin = new Scanner ( System. in ); System. out. println (" Number of disks in the tower?"); i n t n = stdin. nextint (); movedisks (n, A, C, B ); // start moving disks System. out. println (" movimentos = " + numbermoves );...

Torres de Hanoi: árvore de recursão A árvore de recursão correspondente à chamada movedisks(3, A, C, B ), representando-se apenas os argumentos do método. Na figura, A->C significa que um disco da torre A é deslocado para a torre C.

Retrocesso (backtracking) esta técnica é normalmente usada para se encontrar todas as soluções de um problema, por construção de soluções parciais o algoritmo procura extender a solução parcial até estar completa, mas se alguma inconsistência acontecer o algoritmo retrocede (faz backtracking), removendo a parte da solução mais recentemente construída e tenta outra possibilidade

Exemplo: encontrar saída de labirinto Input: 6 6 S #####...# #.#### #.####...#. G ##...#

Exemplo... p u b l i c c l a s s SolveMaze { s t a t i c i n t nl, nc; s t a t i c i n t si, sj; s t a t i c char [][] maze ; p u b l i c s t a t i c v o i d main ( String args []) throws IOException { File file = new File ( args [0]); Scanner input = new Scanner ( file ); nl = input. nextint (); nc = input. nextint (); maze = new char [nl ][ nc ];...

Exemplo... p u b l i c c l a s s SolveMaze {... p u b l i c s t a t i c v o i d main ( String args []) throws IOException {... input. nextline (); f o r ( i n t i = 0 ; i < nl ; i++ ) { String line = input. nextline (); f o r ( i n t j = 0 ; j < nc ; j++ ) { char c = line. charat ( j); i f ( c == S ) { si = i; sj = j; maze [i][j] = c; i f ( findpath (si,sj) ) System. out. println (" found ");

Exemplo... p r i v a t e s t a t i c boolean findpath ( i n t i, i n t j) { printmaze (); i f ( i < 0 j < 0 i > nl - 1 j > nc - 1) r e t u r n f a l s e ; i f ( maze [i][j] == # maze [i][j] == + ) r e t u r n f a l s e ; i f ( maze [i][j] == G ) r e t u r n t r u e ; maze [i][j] = + ; i f ( findpath (i+1, j ) ) r e t u r n t r u e ; i f ( findpath (i -1, j ) ) r e t u r n t r u e ; i f ( findpath (i, j +1) ) r e t u r n t r u e ; i f ( findpath (i, j -1) ) r e t u r n t r u e ; maze [i][j] =. ; r e t u r n f a l s e ;

Exemplo... p r i v a t e s t a t i c v o i d printmaze () { f o r ( i n t i = 0 ; i < nl ; i++ ) { f o r ( i n t j = 0 ; j < nc ; j++ ) System. out. print ( " " + maze [i][j] + " "); System. out. println (); System. out. println (); System. out. println ();