Listas. CIC/UFRGS INF Fundamentos de Algoritmos 2006/1

Documentos relacionados
Vários Tipos de Dados

Fundamentos de Algoritmos

Algoritmos - Aula 3 CIC/UFRGS 2006/1. Algoritmos CIC/UFRGS Algoritmos - Aula /1

Fundamentos de Algoritmos

Naturais. Paradigma de Programação Funcional. Marco A L Barbosa

Fundamentos de Algoritmos - Aula 5

Funções Compostas. Fundamentos de Algoritmos. Projeto de programas complexos. Roteiro. Um programa é composto por definições de funções e variáveis

Dados compostos. Paradigma de Programação Funcional. Marco A L Barbosa

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

Notas sobre Definições Recursivas

Fundamentos de Algoritmos

Combinação de modelos

Paradigmas de Programação

Linguagens de Programação

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

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

Conceitos de Linguagem de Programação - 2

Arquitetura de Computadores Sistema de Numeração. Apresentado por Prof. Fred Sauer Mat. Elaborado por Prof. Ricardo Quintão

Um alfabeto é um conjunto de símbolos indivisíveis de qualquer natureza. Um alfabeto é geralmente denotado pela letra grega Σ.

Aulas 10 e 11 / 18 e 20 de abril

Dados Compostos: Estruturas

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

Listas: nós de cabeçalho, listas não homogêneas, listas generalizadas. SCC-502 Algoritmos e Estruturas de Dados I

Funções. Disciplina: Tópicos Especiais em TI PHP

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 25. Instituto de C

EXPRESSÕES ARITMÉTICAS PARTE 1

Fundamentos de Programação

Exercícios sobre Listas, Árvores, Grafos e Recursão Generativa

Redutibilidade. Mário S. Alvim Fundamentos de Teoria da Computação (FTC) DCC-UFMG (2018/02)

OPRM a Fase Nível 1 01/09/18 Duração: 4 horas

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

Fundamentos de Programação

Soluções dos exercícios propostos

Matemática para Ciência de Computadores

Linguagem com sintaxe e semântica precisas: lógica. Mecanismo de inferência: derivado da sintaxe e da

Exercícios de Laboratório 2

Sistemas Digitais. Revisão Portas Lógicas. Isaac Maia

Algoritmos - Informação Simólica

Processamento da Informação Teoria. Desvio Condicional

EXPRESSÕES RELACIONAIS

Tipo de argumentos. valor. argumentos

MATRIZES - PARTE Mais exemplos Multiplicação de duas matrizes AULA 26

Capítulo 2: Procedimentos e algoritmos

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

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

Programação Funcional

Capítulo 2. Representação de dados em sistemas computacionais

MAC 0316/5754 Conceitos de Linguagens de Programação Primeiro Semestre de 2011 Primeira Prova 29 de março de 2011

Variáveis e Entrada de Dados Marco André Lopes Mendes marcoandre.googlepages.

Fundamentos de Programação

Aula 5: Conversões Entre Bases Numéricas

Fundamentos de Programação

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Condicionais e de Repetição

if not(isinstance(a, int)) or a < 0: raise ValueError ("misterio: arg nao e inteiro nao negativo") else: return misterio_aux(a, a + 1)

Fundamentos da Programação

Aula 05: - Recursão (parte 1)

Curso: Ciência da Computação Turma: 6ª Série. Teoria da Computação. Aula 4. Autômatos Finitos

Aula 05: - Recursão (parte 1)

Problemas NP-Completos Bolas Mágicas

Programação Estruturada

Linguagens de Programação

Instituto Federal de Educação, Ciência e Tecnologia do RN Câmpus Currais Novos. LINGUAGEM C++ VARIÁVEIS COMPOSTAS Arrays Aula I

Filas de Prioridade. Uma fila de prioridade pode ser vista como uma generalização das filas com as seguintes duas operações:

Problema de seleção de atividades. Aula 14. Exemplo. Algoritmos Gulosos. Algoritmos Gulosos. Intervalo: par ordenado de números

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

Recursividade, Tentativa e Erro

Python Listas e Strings. Listas 23/11/2016. Por que usar listas? Listas. Listas - Solução. Listas - Problema

Linguagens de Programação

Unidade 2: Estruturas de Controle Parte 1 - Scanner e Estrutura IF Prof. Daniel Caetano

Paradigmas. Fortran, Algol, Algol-68, Pascal, C, Cobol, PL/I

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

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

Roteiro da segunda aula presencial - ME

Resolução Exe 2.12 Monolítico Recursivo

Análise e Projeto de Algoritmos

Introdução ao Curso. Área de Teoria DCC/UFMG 2019/01. Introdução à Lógica Computacional Introdução ao Curso Área de Teoria DCC/UFMG /01 1 / 22

Estruturas de Repetição

Fundamentos de Arquiteturas de Computadores

Algoritmos e Estruturas de Dados I

Um sistema de numeração posicional utiliza um conjunto de símbolos. O valor que cada

Notas de Aula Aula 2, 2012/2

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

4 Conceito de Herança

Estruturas de Dados Pilhas, Filas, Listas

1 Introdução e Conceitos básicos

Aula prática 5. Funções Recursivas

ESTRUTURAS DE REPETIÇÃO - PARTE 2

BCC402 Algoritmos e Programação Avançada Prof. Marco Antonio M. Carvalho Prof. Túlio Ângelo M. Toffolo 2011/1

CIC 111 Análise e Projeto de Algoritmos II

ESTRUTURAS DE REPETIÇÃO - PARTE 1

Tópicos em LP. Fabio Mascarenhas

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

Dízimas e intervalos encaixados.

Introdução a programação Visão geral

Apêndice A. Alguns construtores e métodos importantes e úteis da classe Vector são:

Marcos Castilho. DInf/UFPR. 16 de maio de 2019

Linguagens de Programação

Informática para Ciências e Engenharias 2013/14. Teórica 7

Transcrição:

Listas 1 Estruturas são apenas uma forma de representar informação composta. Elas são úteis quando sabemos exatamente como e por quantas partes um determinado dado é composto. Quando não sabemos ao certo quantos elementos pertencem a um determinado dado, podemos formar uma lista, que pode ter um tamanho arbitrário (ou seja, um número finito, mas indeterminado de ítens).

cons truindo listas... Para construir uma lista, podemos partir de uma lista vazia e incluir ítens nessa lista. Em Scheme, usamos as seguintes funções: empty : representa a lista vazia; 2 (cons Item Lista) : é a função que inclui o item Item na lista Lista Item Lista

cons Mercurio empty) Mercurio Exemplos... 3 (cons Venus (cons Mercurio empty)) Venus Mercurio (cons Terra (cons Venus (cons Mercurio empty))) Terra Venus Mercurio

Mais exemplos... 4 lista com 10 números: (cons 0 (cons 1 (cons 2 (cons 3 (cons 4 (cons 5 (cons 6 (cons 7 (cons 8 (cons 9 empty))))))))))

lista com elementos de tipos diferentes: 5 (cons RobbyRound (cons 3 (cons true empty)))

Outro exemplo: função que soma os 3 valores de uma lista Uma lista-de-3-números é (cons x (cons y (cons z empty))) onde x, y e z são números. ;; add-up-3 : lista-de-3-números -> number ;; obj.: somar os 3 números de uma lista de 3 números ;; exemplos e testes: ;; (= (add-up-3 (cons 2 (cons 1 (cons 3 empty)))) 6) ;; (= (add-up-3 (cons 0 (cons 1 (cons 0 empty)))) 1) (define (add-up-3 a-list-of-3-numbers)...) Mas, como acessar os elementos de uma lista? 6

Operações sobre Listas Em Scheme podemos usar as seguintes funções para acessar os elementos de uma lista: first : aplicada sobre uma lista, devolve seu primeiro elemento; (first Venus Mercurio ) = Venus 7 rest : aplicada sobre uma lista, retira seu primeiro elemento e devolve o resto da lista. (rest Venus Mercurio ) = Mercurio

Exemplos de operações sobre listas: (first (cons 10 empty)) = 10 8 (rest (cons 10 empty)) = empty (first (rest (cons 10 (cons 22 empty)))) = (first (cons 22 empty)) = 22

Template para a função add-up-3 9 ;; add-up-3 : list-of-3-numbers -> number ;; to add up the three numbers in a-list-of-3-numbers (define (add-up-3 a-list-of-3-numbers)... (first a-list-of-3-numbers)...... (first (rest a-list-of-3-numbers))...... (first (rest (rest a-list-of-3-numbers)))... ) Exercício: Complete a definição desta funçao.

Definição de Dados para Listas de Tamanho Indeterminado Até agora, todas as definições de dados que fizemos foram de tamanho fixo: estruturas ou listas com número fixo de elementos. Em muitas situações, não sabemos quantos elementos as listas usadas em um determinado programa terão. Nesses casos, precisamo fazer uma definição genérica, ou seja, definir a classe de todas as listas finitas. Uma lista-de-símbolos é ou 1. a lista vazia empty, ou 2. (cons s los), onde s é um símbolo e los é uma lista de símbolos. Essa é uma definição recursiva!!! 10

Processando Listas de Tamanho Indeterminado Suponha que queiramos construir um programa para verificar se uma lista de ítens de uma loja de brinquedos contém boneca. Como já temos a definição do tipo de dados necessário ao problema lista-de-símbolos, passamos para a a fase de descrever o contrato, objetivo e cabeçalho: ;; contem-boneca? : lista-de-símbolos -> boolean ;; obj: determinar se a palavra boneca ocorre em uma lista de símbolos (define (contem-boneca? uma-lista-de-simbolos)...) 11

Exemplos para a função contem-boneca (boolean=? (contem-boneca? empty) false) (boolean=? (contem-boneca? (cons bola empty)) false) (boolean=? (contem-boneca? (cons boneca empty)) true) (boolean=? (contem-boneca? (cons pote (cons jogo (cons bola empty)))) false) (boolean=? (contem-boneca? (cons flecha (cons boneca (cons bola empty)))) true) 12

Template para a função contem-boneca 13 Como a definição dos dados de entrada da função (lista-de-símbolos ) tem 2 cláusulas, o corpo da função deve ser uma expressão cond : (define (contem-boneca? uma-lista-de-simbolos) (cond [(empty? uma-lista-de-simbolos)...] [(cons? uma-lista-de-simbolos)...])) Ao invés de (cons uma-lista-de-simbolos), podemos usar else na segunda cláusula.

Template para a função contem-boneca... Como uma lista construída com cons é composta de um símbolo e uma lista de símbolos, na segunda cláusula provavelmente usaremos as funções first e rest para definir o algoritmo: (define (contem-boneca? uma-lista-de-simbolos) (cond [(empty? uma-lista-de-simbolos)...] [else... (first uma-lista-de-simbolos)... (rest uma-lista-de-simbolos)...])) 14

Definindo a função contem-boneca... 15 (define (contem-boneca? uma-lista-de-simbolos) (cond [(empty? uma-lista-de-simbolos) false] [else (cond [(symbol=? (first uma-lista-de-simbolos) boneca) true] [else... (rest uma-lista-de-simbolos)...])])) Se a lista passada como argumento não for vazia, o primeiro elemento não for a palavra boneca, o que devemos fazer?

Definindo a função contem-boneca... 16 (define (contem boneca? uma lista de simbolos) (cond [(empty? uma llista de simbolos) false] [ else (cond [symbol=? (first uma lista de simbolos) boneca) true] [else (contem boneca? (rest uma lista de simbolos))])] Essa é uma função recursiva!!!

Exercícios sobre os seguintes argu- Teste a definição da função contem-boneca? mentos: empty (cons bola empty) (cons flecha (cons boneca empty)) (cons pote (cons flecha (cons bola empty))) 17

Projeto de Funções Recursivas Análise e Projeto de Dados: Se o problema envolver dados de tamanho arbitrário, precisamos usar definições recursivas. Para fazer definições recursivas válidas, duas condições devem ser satisfeitas: 1. A definição deve ter no mínimo duas cláusulas; 2. Pelo menos uma das cláusulas não deve referenciar o dado a ser definido. Para identificarmos melhor quais cláusulas são recursivas, é uma boa prática apontá-las, por exemplo, através de setas: 18

Template: Projeto de Funções Recursivas... 19 (define (fun-for-los a-list-of-symbols) (cond [(empty? a-list-of-symbols)...] [else... (first a-list-of-symbols)...... (fun-for-los (rest a-list-of-symbols))...])) Chamamos as auto-aplicações de RECURSÃO NATURAL.

Corpo: Projeto de Funções Recursivas... Para montar o corpo da função, iniciamos definindo o que fazer nos casos que não envolvem recursão natural. Esses são os chamados CASOS BASE, e normalmente a solução do problema para esses casos é bastante simples. Então passamos aos casos que envolvem RECURSÃO, lembrando que, para as chamadas recursivas da função, assumimos que a função já funciona como esperado para os argumentos aos quais fazemos a chamada recursiva. 20

Exemplo de Definição do Corpo Queremos definir a função how-many, que determina quantos símbolos e- xistem em uma lista de símbolos. Seguindo os passos descritos, temos os seguintes template e corpo: ;; how-many : list-of-symbols -> number ;; to determine how many symbols are on a-list-of-symbols (define (how-many a-list-of-symbols) (cond [(empty? a-list-of-symbols)...] [else... (first a-list-of-symbols)...... (how-many (rest a-list-of-symbols))...])) (define (how-many a-list-of-symbols) (cond [(empty? a-list-of-symbols) 0] [else (+ (how-many (rest a-list-of-symbols)) 1)])) 21

Fases do Projeto de Algoritmos usando Recursão Fase Objetivo Atividade Projeto e Análise formular uma definição de Dados de dados Contrato, Objetivo e Cabeçalho dar um nome à função, especificar as classes de entrada e saída, descrever o objetivo e formular um cabeçalho 22 construir uma definição de dados com no mínimo 2 cláusulas, onde pelo menos uma delas não deve ser recursiva. Identificar explicitamente o ponto onde ocorre recursão na definição. nomear a função, as classes de entrada e saída e especificar um objetivo: ;; name : in1 in2...--> out} ;; to compute... from x1...} (define (name x1 x2...)...)

Fases do Projeto de Algoritmos usando Recursão... Fase Objetivo Atividade Exemplos caracterizar a relação entrada/saída através de exemplos Template formular um esboço para a função 23 criar exemplos da relação entrada/saída, levando em consideração que deve existir pelo menos um exemplo para cada subclasse de dados aos quais a função pode ser aplicada colocar uma estrutura cond com uma linha para cada cláusula da definição dos dados do problema. Usar os seletores apropriados para cada cláusula.indicar onde ocorre recursão natural. TESTE: as autoreferências neste template e na definição de dados devem casar.

Fases do Projeto de Algoritmos usando Recursão... 24 Fase Objetivo Atividade Corpo completar a definição da função construir expressões Scheme para cada uma das cláusulas do cond Testes encontrar erros aplicar a função aos exemplos e checar se os resultados são os esperados.

Exercícios Usar o método de desenvolvimento de algoritmos para construir os programas a seguir: 1. Construa uma função que, dada uma lista de valores de objetos de uma loja, calcula o valor total do estoque da loja. 2. Construa a função dollar-store? que, dada uma lista de preços, checa se todos os preços estão abaixo de 1. Depois, generalize essa função, para obter como entrada a lista de preços e um valor, e verificar se todos os preços da lista estão abaixo deste valor. 3. Construa a função convert, que, dada uma lista de dígitos, produz o número decimal correspondente. O primeiro dígito da lista deve ser o menos significante. 25