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
Download

Problema: Dada uma lista, verifique se ela é não