Recursividade e listas

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

Complexidade de Algoritmos. Edson Prestes

Aula prática 5. Funções Recursivas

Programação Estruturada

Notas sobre Definições Recursivas

MC102 Aula 27 Recursão II

Macros e funções. Prof. Dr. Silvio do Lago Pereira. Departamento de Tecnologia da Informação Faculdade de Tecnologia de São Paulo

Exercícios de Linguagem C

Busca no espaço de estados (parte I)

Utilização do Conjunto de Cantor para a resolução da Torre de Hanoi

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

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:

05 Análise de Algoritmos (parte 4) SCC201/501 - Introdução à Ciência de Computação II

Estruturas de Dados em Python

Exercícios: Recursão

SCC Capítulo 2 Recursão

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

Algoritmos e Estruturas de Dados I

Linguagens Formais e Problemas de Decisão

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

Subindo uma escada. Ação: Subir 1 degrau da escada

Lista de Exercícios 4

LISTA DE EXERCÍCIOS. Humberto José Bortolossi

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

Raciocínio Automatizado

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

Análise de Complexidade para algoritmos iterativos e recursivos

SCC0601 Projeto de Algoritmos. Recursão

ALGORITMOS I. Procedimentos e Funções

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

Fernando Silva DCC-FCUP. Estruturas de Dados

Contagem I. Figura 1: Abrindo uma Porta.

Algoritmos e Estruturas de Dados I. Recursividade. Pedro O.S. Vaz de Melo

LISTA DE EXERCÍCIOS MÊS 04

USANDO UM MÉTODO INDUTIVO PARA RESOLVER PROBLEMAS. Bruno Maffeo Departamento de Informática PUC-Rio

Revisão: Tipo Abstrato de Dados Recursividade

Circuitos Digitais Segunda Lista de Exercícios

decomposição de Cholesky.

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

Modelagem com relações de recorrência. Exemplo: Determinada população dobra a cada ano; população inicial = 5 a n = população depois de n anos

SISTEMAS DE NUMERAÇÃO

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Introdução Paradigmas

Lógica de Programação

1o sem profa. daniela m. vieira. (a) f(x, y) = 3x y no conjunto A de todos (x, y) tais que x 0, y 0, y x 3, x + y 4 e

1/50. Conceitos Básicos. Programa Básico

Recursividade. Estrutura de Dados. Prof. Kleber Rezende

Listas em Prolog. Listas

Universidade Federal da Grande Dourados Faculdade de Ciências Exatas e Tecnologia Bacharelado em Sistemas de Informação Estruturas de Dados I Lista II

EXERCÍCIOS AVALIATIVOS 2º TRIMESTRE MATEMÁTICA

Análise e Complexidade de Algoritmos

Programação Lógica. Programação Lógica PROLOG

Recursividade. Recursividade

Aula 10 Comandos de Repetição For e Do While

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

Descrevendo Circuitos Lógicos (Continuação) Teoremas Booleanos. CPCX UFMS Slides: Prof. Renato F. dos Santos Adaptação: Prof. Fernando Maia da Mota

Introdução à Algoritmos. Professora: Fabíola Gonçalves.

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

Equações Diofantinas III

Introdução a Computação

Divisão e conquista. Eficiência de divisão e conquista

Python: Recursão. Claudio Esperança

Lógica de Programação

Árvores. Fabio Gagliardi Cozman. PMR2300 Escola Politécnica da Universidade de São Paulo

Lema do Bombeamento. Aplicação para Linguagens Regulares e Livres de Contexto. Maria Adriana Vidigal de Lima. Abril

Aula 4 Expressões e Operadores Cleverton Hentz

INTRODUÇÃO À COMPUTAÇÃO - EPET006 Aula 3

É interessante comparar algoritmos para valores grandes de n. Para valores pequenos de n, mesmo um algoritmo ineficiente não custa muito para ser

Algoritimos e Estruturas de Dados III CIC210

Fundamentos e prática de Prolog

Construção de Algoritmos II Aula 06

Normalização: 3 a Forma Normal

Análise de Problemas Recursivos. Algoritmos e Estruturas de Dados Flavio Figueiredo (

Transcrição:

Recursividade e listas Prof. Dr. Silvio do Lago Pereira Departamento de Tecnologia da Informação Faculdade de Tecnologia de São Paulo

Princípio de recursividade Recursividade é um princípio que permite obter a solução de um problema P, a partir das soluções de subproblemas de P, que são similares ao próprio P. De acordo com este princípio, o problema deve ser decomposto em subproblemas cada vez mais simples, até que tenhamos apenas subproblemas triviais. Cada subproblema trivial é resolvido diretamente, sem novas decomposições, e os resultados obtidos são usados para compor a solução do problema original. Exemplo 1. Arrecadação de R$1500,00 para doação Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 2

Princípio de recursividade Para resolver um problema P, um algoritmo recursivo deve ser capaz de classificar cada uma das instâncias de P como trivial ou não-trivial. Uma instância trivial deve ser resolvida diretamente, já que não pode ser reduzida a outra mais simples. Uma instância não-trivial deve ser resolvida recursivamente, usando o princípio de recursividade esquematizado a seguir: instância original P( I ) solução de P( I ) reduz usa instância mais simples P( I ) obtém solução de P( I ) Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 3

Definições recursivas Uma definição recursiva é composta por base: cláusulas que resolvem as instâncias triviais diretamente. passo: cláusulas que resolvem as instâncias não-triviais recursivamente. A cada passo, uma instância não-trivial é reduzida a outra mais simples e ficamos cada vez mais perto de obter uma instância trivial Quando uma instância trivial é obtida, a base faz com que o processo de reduções termine Então, usamos as soluções das instâncias menores para construir as soluções das instâncias maiores Assim, a incapacidade de reduzir instâncias, ou de detectar instâncias triviais, pode fazer o processo entrar em looping, sem jamais resolver o problema. 2 3 8 reduz usa 2 2 4 reduz usa 2 1 2 reduz usa 2 0 1 Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 4

Definições recursivas Exemplo 1. Cálculo de potência com expoente natural % pot(x,n,p) : X elevado a N é P pot(_,0,1). % base pot(x,n,p) :- % passo N>0, % condição para redução M is N-1, % reduz a instância pot(x,m,r), % obtém a solução da instância mais simples P is X*R. % constrói solução da instância original Exercício 1. Cálculo de fatorial % fat(n,f) : o fatorial de N é F fat(0,1). % base fat(n,f) :-...... % passo Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 5

Definições recursivas Exemplo 2. Torres de Hanói Problema: mover todos os discos da torre A para a torre C, usando da torre B Restrições: Mover um disco de cada vez Não colocar um disco sobre outro menor Transferir os discos de uma torre para outra, imediatamente A B C Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 6

Definições recursivas Exercício 2. Torres de Hanói hanói(0,_,_,_). % base hanói(n,origem,auxiliar,destino) :-...... % passo Complete e teste o predicado hanói/4, com base na idéia esquematizada a seguir: mova n-1 discos de A para B mova 1 disco de A para C mova n-1 discos de B para C A B C A B C A B C A B C Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 7

Definições recursivas Exercício 3. Exibição de números em binário exibe_binário(n) :- % base N<2,!, % condição para base write(n). % solução trivial exibe_binário(n) :- % passo...... % se chegou aqui, então N>=2 Complete e teste exibe_binário/1, com base na idéia esquematizada a seguir: reduz reduz reduz 13 6 3 1 usa usa usa 1101 110 11 1 Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 8

Relações transitivas Uma relação r/2 é transitiva se r(x,y) e r(y,z) implicam r(x,z) Uma relação transitiva pode ser definida, recursivamente, a partir de uma relação base. Exemplo 3. Ancestrais de uma pessoa pai(adão,cain). pai(adão,abel). pai(adão,seth). pai(seth,enos). ancestral(x,y) :- % base pai(x,y). X X ancestral pai ancestral Y Y ancestral(x,y) :- % passo pai(x,z), ancestral(z,y). pai Z ancestral Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 9

Relações transitivas Exercício 4. A relação transitiva acima/2 sobre(b,a). sobre(d,b). sobre(d,c). sobre(e,d). Usando a relação sobre/2, defina a relação acima/2 e faça as consultas a seguir:?- sobre(d,a).?- acima(d,a).?- sobre(d,x).?- acima(d,x). B A E D C?- acima(x,a). Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 10

Listas

Listas Uma lista é uma seqüência de itens separados por vírgulas e delimitados por colchetes?- [X Y] = [terra, sol, lua]. X = terra Y = [sol, lua]?- [X Y] = [estrela]. X = estrela Y = [] cabeça (primeiro item) [X Y] cauda (demais itens)?- [X Y] = []. no O acesso aos itens de uma lista é feito por meio de casamento de padrões! Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 12

Listas Exercício 5. Uso de padrões Veja os resultados das consultas:?- [1,2,3,4] = [A R].?- [1,2,3,4] = [A,B R].?- [1,2,3,4] = [A,B,C].?- [1,2,3,4] = [A,B,C R].?- [1,2,3,4] = [A,B,C,D].?- [1,2,3,4] = [A,B,C,D R]. Padrão Itens na lista [] nenhum [X] [X Y] [X,Y] exatamente um pelo menos um exatamente dois [X,Y Z] pelo menos dois [X,Y,Z] exatamente três Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 13

Tratamento recursivo de listas Exemplo 4. Exibição dos itens de uma lista /* 1 */ exiba([]). /* 2 */ exiba([x 2 Y 2 ]) :- writeln(x 2 ), exiba(y 2 ). A cada chamada recursiva, as variáveis da regra são renomeadas!?- exiba([a,b]). a b yes?- exiba([a,b]). 2, X 1 =a, Y 1 =[b]?- writeln(a), exiba([b]).?- exiba([b]). 2, X 2 =b, Y 2 =[]?- writeln(b), exiba([]).?- exiba([]). 1?- Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 14

Tratamento recursivo de listas Exemplo 5. Verificação de pertinência /* 1 */ membro(x,[x _]). /* 2 */ membro(x 3,[_ Y 3 ]) :- membro(x 3,Y 3 ). A cada chamada recursiva, as variáveis da regra são renomeadas!?- membro(d,[a,b,c,d,e]). yes?- membro(d,[a,b,c,d,e]). 2, X 1 =d, Y 1 =[b,c,d,e]?- membro(d,[b,c,d,e]). 2, X 2 =d, Y 2 =[c,d,e]?- membro(d,[c,d,e]). 2, X 3 =d, Y 3 =[d,e]?- membro(d,[d,e]). 1, X=d?- Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 15

Tratamento recursivo de listas Exemplo 6. Tamanho de uma lista /* 1 */ tam([],0). /* 2 */ tam([_ Y 2 ],T 2 ) :- tam(y 2,R 2 ), T 2 is R 2 +1. A cada chamada recursiva, as variáveis são renomeadas!?- tam([a,b],n). N = 2 yes?- tam([a,b],n). 2, Y 1 =[b], T 1 =N?- tam([b],r 1 ), N is R 2, Y 2 =[], R 1 =T 2 is R 1 +1.?- tam([],r 2 ), R 1 is R 2 +1, N is R 1 +1. 1, R 2 =0?- R 1 is 0+1, N is R 1 +1. R 1 =1?- N is 1+1. N=2?- Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 16

Tratamento recursivo de listas Exemplo 7. Concatenação de listas /* 1 */ concat([],b,b). /* 2 */ concat([x 2 A 2 ],B 2,[X 2 C 2 ]) :- concat(a 2,B 2,C 2 ). A cada chamada recursiva, as variáveis são renomeadas!?- concat([a,b],[c,d],r). R = [a,b,c,d] yes?- concat([a,b],[c,d],r). 2, X 1 =a, A 1 =[b], B 1 =[c,d], R=[a C 1 ]?- concat([b],[c,d],c 1 ). 2, X 2 =b, A2=[], B2=[c,d], C 1 =[b C 2 ]?- concat([],[c,d],c 2 ). 1, B 3 =[c,d], C 2 =[c,d c,d]?- Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 17

Tratamento recursivo de listas Exercício 6. Altere esta definição para exibir os itens da lista em ordem inversa exiba([]). exiba([x Y]) :- writeln(x), exiba(y). Exercício 7. Acesso ao último item de uma lista Defina o predicado último(l,x), que dá o último item X armazenado na lista L. Exercício 8. Soma dos itens de uma lista Com base na definição do predicado tam/2, defina o predicado soma(l,s) determina a soma S dos itens armazenados na lista L. Exercício 9. Exclusão de um item da lista soma(l,s), que Usando o predicado concat/3, defina o predicado exclui(x,l1,l2), que dá a lista L2 L1. L2 resultante da exclusão do item X da lista L1 Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 18

Tratamento recursivo de listas Exercício 10. Permutação dos itens de uma lista Usando o predicado exclui/3, defina o predicado permutação(l,p), que dá uma permutação P da lista L. Exercício 11. Inversão de uma lista Usando o predicado concat/3, defina o predicado inverte(l,i), que inverte a ordem dos itens na lista L, produzindo a lista I. Exercício 12. Item máximo de uma lista de números Sem usar nenhum predicado previamente definido, defina o predicado máximo(l,m) que dá o item de valor máximo M armazenado numa lista de números L. máximo(l,m), Prof. Dr. Silvio do Lago Pereira DTI / FATEC-SP 19

Fim