Universidade Federal do Espírito Santo Introdução à Programação uma Abordagem Funcional Programação I Prof.ª Claudia Boeres [email protected] CT VII - Sala 34 Departamento de Informática Centro Tecnológico Universidade Federal do Espírito Santo Discutindo eficiência... Problema: Dada uma lista, verifique se ela é não decrescente. Versão 1: lms1 xs = [ xs!!i | i ← [0..length xs – 2], j ← [i+1..length xs – 1], xs!!i > xs!!j] ord xs = (lms1 xs) == [ ] Versão 2: lms2 xs = [ xs!!i | i ← [0..length xs – 2], xs!!i > xs!!(i+1)] ord xs = (lms2 xs) == [ ] Versão 3: adjacentes xs = zip (init xs) (tail xs) lms3 xs = [(x,y) | (x,y) ← xs, x > y] ord xs = (lms3 (adjacentes xs)) == [ ] função zip: recebe duas listas como entrada e cria a lista dos pares de elementos de cada posição correspondente nas listas de entrada. Exemplo: zip “teste” [1..10] → [('t',1),('e',2),('s',3),('t',4),('e',5)] Usando Módulos Um módulo em Haskell é uma coleção de funções relacionadas, tipos e classes de tipos. Um script em Haskell pode utilizar uma coleção de modulos. A biblioteca padrão do Haskell é dividida em módulos: – de funções básicas (Prelude) – para funções que envolvem caracteres (data.Char) – listas (Data.List) – entre outros... Exemplo Problema: Dada uma letra minúscula, convertê-la para maiúscula. converte x = chr (ord x - 32) Avaliação: HUGS> converte 'a' ERROR - Undefined variable "ord" As funções chr e ord não estão em Prelude Usando módulos... De duas formas: a) Carrega o módulo diretamente pelo HUGS usando :load <nome do módulo> • Para desabilitar :load b) usa o comando import dentro do seu script da seguinte forma: import <nome do módulo> Módulos em Haskell http://www.haskell.org/ghc/docs/6.4.1/ht ml/libraries/ Matrizes Uma matriz de dimensões nxm pode ser representada por uma lista cujo comprimento é igual a n*m, com as n linhas da matriz original dispostas em sequencia na lista. – Exemplo: 1 3 4 5 3 5 8 6 2 7 2 10 em Haskell [1, 3, 4, 5, 3, 5, 8, 6, 2, 7, 2, 10] Matrizes Alternativamente, as matrizes podem ser representadas por listas de listas que representam as linhas da matriz. mat = [[10, 31, 45], linha [41, 21, 30], [15, 20, 50]] mat (i,j) → mat!!i!!j linha i → mat!!i coluna coluna j → [mat!!i!!j | i ← [0..n] ] Exercícios Considerando a primeira representação de matrizes apresentada, dada uma matriz quadrada de dimensões nxn: – – – – – defina a transposta da matriz defina uma lista com os elementos da diagonal principal da matriz calcule o número de elementos não nulos de uma matriz, por linha da matriz verifique se a matriz é diagonal verifique se é triangular superior (todas as entradas da matriz abaixo da diagonal devem ser nulas) Recursão - Recursão é uma maneira de definir funções na qual uma chamada a própria função sendo definida é utilizada na sua descrição. - Exemplos: - fatorial de um número: O fatorial de um número natural n > 0 é igual ao produto de todos os números naturais de 1 até n. - sequência de Fibonacci, ... Exeplo Exercícios 1) somatório dos elementos de uma lista 2) o maior valor de uma lista