Sie sind auf Seite 1von 3

Folha 2

Programao Funcional, DCC/FCUP 25 de Fevereiro de 2013

Expresses condicionais, guardas e padres

2.1

Considere as denies das funes

max

min

do preldio-padro que

calculam respectivamente o mximo e o mnimo de dois nmeros:

max x y = if x y then x else y min x y = if x y then x else y


(a) Usando condies embricadas, escreva denies de duas funes e

max3

min3

para calcular, respectivamente, o mximo e o mnimo de de trs

nmeros. (b) Re-escreva as funes pedidas nas alneas anteriores de forma a usar apenas a composio de

max

min

(i.e. sem condicionais ou guardas).

2.2

Escreva duas denies, respectivamente usando expresses condicionais e

guardas, da funo

classica :: Int String 9


1012 1315 1618 1920 reprovado suciente bom muito bom

que faz corresponder uma classi-

cao qualitativa a uma nota de 0 a 20:

muito bom com distino

2.3

Escreva uma denio da funo lgica ou-exclusivo usando mltiplas equaes com padres. Pretende-se implementar uma funo

xor :: Bool Bool


que extende

Bool
2.4

safetail :: [a] [a]

a funo

tail

do preldio de forma a dar a lista vazia quando o argumento Escreva trs denies diferentes usando

a lista vazia (em vez de um erro).

condicionais, equaes com guardas e padres.

2.5

Escreva duas denies da funo

curta :: [a] Bool

para testar se uma

lista tem zero, um ou dois elementos, usando: (a) a funo

length

do preldio-padro;

(b) mltiplas equaes e padres.

2.6 (TP)
exemplos:

Dena uma funo

textual :: Int String

para converter um nmero

positivo inferior a um milho para a designao textual em portugus. Alguns

textual 21 = vinte textual 1234 = mil


Sugesto:

e um

duzentos e trinta e quatro e vinte e trs mil quatrocentos e cinquenta e seis

textual 123456 = cento

Comee por denir funes auxiliares para converter para texto

nmero inferiores a 100 e 1000.

Listas em compreenso

2.7
soma

Usando uma lista em compreenso, escreva uma expresso para calcular a

12 + 22 + + 1002

dos quadrados dos inteiros de 1 a 100.

2.8

A constante matemtica

pode ser aproximada usando expanso em sries

(i.e. somas innitas), como por exemplo:

1 1 (1)n = 1 + + + 4 3 5 2n + 1
(a) Escreva uma funo em

parcelas da srie acima (onde

aprox :: Int Double para aproximar somando n o argumento da funo). aprox

(b) A srie anterior converge muito lentamente, pelo so necessrio muitos termos para obter uma boa aproximao; escreva uma outra funo usando a seguinte expanso para

2 :

1 1 (1)k 2 = 1 + + + 12 4 9 (k + 1)2
Compare os resultados obtidos somado 10, 100 e 1000 termos com a aproximao

pi

pr-denida no preldio-padro.

2.9

Dena uma funo

divprop :: Int [Int ] usando uma lista em compreenso divprop 10 = [1, 2, 5].

para calcular a lista de divisores prprios de um inteiro positivo (i.e. inferiores ao nmero dado). Exemplo:

2.10

Um inteiro positivo

sores (excluindo o prprio mento. Exemplo:

n diz-se perfeito se for igual soma dos seus divin). Dena uma funo perfeitos :: Int [Int ] que
Sugesto:

calcula a lista de todos os nmeros perfeitos at um limite dado como argu-

perfeitos 500 = [6, 28, 496].

utilize a soluo do

exerccio 2.9.

2.11

Dena uma funo

primo :: Int Bool

que testa primalidade:

n primo

se tem exactamente dois divisores, a saber, 1 e

n.

Sugesto : utilize a funo do

exerccio 2.9 para obter a lista dos divisores prprios.

2.12 (TP)
(a) Escreva uma funo

mindiv :: Int Int

cujo resultado o menor divisor Note que se de

prprio do argumento (i.e. o menor divisor superior a 1).

n = p q , ento p e q so ambos divisores q n pelo que mindiv n n.


(b) Utilize a

n;

assim, se

n,

ento

mindiv

para denir um teste de primalidade mais eciente do que

o exerccio 2.11:

n primo se n > 1 e o seu menor divisor prprio for igual

n.
Usando uma funo

2.13

binom

que calcula o coeciente binomal (ver a

Folha 1), escreva uma denio da funo as primeiras linhas tringulo de Pascal.

pascal :: Int [[Int ]]

que calcula

2.14

Escreva uma funo

dotprod :: [Float ] [Float ] Float

para calcular o

produto interno de dois vectores (representados como listas):

dotprod [x1 , . . . , xn ] [y1 , . . . , yn ] = x1 y1 + + xn yn =


Sugesto :

n i=1

xi yi

utilize a funo

zip :: [a] [b] [(a, b)]

do preldio-padro para

emparilhar duas listas.

2.15

Um trio

Dena a

(x, y, z ) de inteiros positivos diz-se pitagrico se x2 + y 2 = z 2 . funo pitagoricos :: Int [(Int , Int , Int )] que calcule todos os trios
Por exemplo:

pitagricos cujas componentes no ultrapassem o argumento.

pitagoricos 10 = [(3, 4, 5), (4, 3, 5), (6, 8, 10), (8, 6, 10)].

Das könnte Ihnen auch gefallen