04.prog.func.nb 1 Programação Funcional Nos exercícios que se seguem não deve utilizar recursão nem composição sequencial de comandos (;). As suas funções devem ser definidas utilizando as funções primitivas Apply, Map, MapThread, Nest e FixedPoint, podendo também recorrer a outras funções sobre listas que considere necessárias. Cada exercício sobre listas pode (e deve) ser resolvido de várias maneiras diferentes; em particular, um bom exercício é apresentar para cada problema uma solução recorrendo à função FixedPoint (note que muitas vezes esta não é, no entanto, a melhor solução). Defina funcionalmente em Mathematica as seguintes funções. † somaNat: recebe um número natural n e devolve a soma de todos os naturais até n. somaNat@6D 21 † quadrados: recebe um número natural n e devolve a lista dos quadrados dos naturais até n (exclusivé). quadrados@6D 80, 1, 4, 9, 16, 25< † quadradosinv: recebe um número natural n e devolve a lista dos quadrados perfeitos até n, por ordem decrescente. quadradosinv@6D 836, 25, 16, 9, 4, 1< † inverteLista: recebe uma lista e devolve a mesma lista mas invertida. inverteLista@81, 2, 3, 4<D 84, 3, 2, 1< 04.prog.func.nb † indicesPares: recebe uma lista de inteiros w e devolve a lista dos elementos de w em posições pares. indicesPares@82, 3, 4, 5, 6<D 83, 5< † triangulo: recebe como argumento um natural n e devolve uma lista em que o primeiro elemento é a lista {1}, o segundo a lista {1,2}, ... , o n-ésimo elemento é a lista com todos os naturais até n. triangulo@4D 881<, 81, 2<, 81, 2, 3<, 81, 2, 3, 4<< † prodLista: recebe uma lista de inteiros e devolve o produto dos seus elementos. prodLista@82, 1, −5, 2<D −20 † conta: recebe como argumentos uma lista de inteiros w e um inteiro k e devolve o número de vezes que k ocorre em w. conta@81, 2, 3, 1, 2, 3<, 2D 2 † pertenceQ: recebe uma lista de inteiros w e um inteiro k e devolve True sse k ocorre em w. pertenceQ@83, 4, 5, 6, 7, 5<, 8D False pertenceQ@83, 4, 5, 6, 7, 5<, 7D True † listaPrimosQ:recebe uma lista de naturais w e devolve True sse w só contém números primos. listaPrimosQ@81, 2, 3, 4<D False listaPrimosQ@82, 5, 3<D True † IntListQ: verifica se o argumento é uma lista de inteiros. IntListQ@82, 3, 6, 3<D True 2 04.prog.func.nb IntListQ@84, s, "banana", Function@x, xD<D False IntListQ@MatrixQD False † NatListQ: verifica se o argumento é uma lista de naturais. NatListQ@82, 3, 6, 3<D True NatListQ@82, −3, 6, 3<D False NatListQ@84, s, "banana", Function@x, xD<D False † IntListListQ: verifica se o argumento é uma lista de listas de inteiros. IntIntListQ@82, 3, 6, 3<D False IntIntListQ@882, 3, 6, 3<<D True IntIntListQ@882, 5<, 8−3<, 8<<D True † StringMatrixQ: verifica se o argumento é uma matriz de strings. StringMatrixQ@88"banana", "maçã"<, 8"laranja", "pêssego"<<D True StringMatrixQ@88"a", "b"<, 8"c"<<D False StringMatrixQ@8"blah"<D False † permutacao: recebe duas listas w1 e w2 e devolve True se w2 for uma permutação de w1 e False caso contrário. permutacao@81, 2, 3<, 82, 1, 3<D True 3 04.prog.func.nb 4 permutacao@81, 2, 3<, 81, 2, 2, 3<D False permutacao@82, 4<, 82<D False † comprimento: recebe uma lista e devolve o seu comprimento. comprimento@81, 2, 3, 4<D 4 † junta: recebe duas listas e devolve a sua concatenação. junta@81, 2, 3<, 89, 8, 7<D 81, 2, 3, 9, 8, 7< † intercala: recebe duas listas w1 e w2 e devolve a lista resultante de intercalar os elementos de w1 e w2. intercala@83, 2, 1<, 8a<D 83, a, 2, 1< intercala@86, 4<, 85, 6, 7<D 86, 5, 4, 6, 7< intercala@83, 2, 1<, 85, 6, 7<D 83, 5, 2, 6, 1, 7< † apaga: recebe uma lista w e um número inteiro k e devolve a lista que resulta de se apagar de w todas as ocorrências de k. apaga@81, 2, 3, 2, 1, 2<, 1D 82, 3, 2, 2< † posPrimos: recebe uma lista de inteiros e devolve a lista das posições onde ocorrem números primos. posPrimos@82, 7, 6, 5, 7<D 81, 2, 4, 5< † posMax: recebe uma lista de inteiros e devolve a lista das posições onde ocorre o maior elemento. posMax@82, 7, 6, 5, 7<D 82, 5< 04.prog.func.nb † indPrimos: recebe uma lista de listas de inteiros l={l1,l2,...,lk} e devolve a lista w={w1,w2,...,wk}, em que wi é composta pelas posições dos números primos em li. indPrimos@881, 2, 3, 4, 5<, 82, 4, 3, 5<, 84, 6, 8, 9<, 8<<D 882, 3, 5<, 81, 3, 4<, 8<, 8<< † fibonacci: recebe como argumento um natural n e devolve o n-ésimo número de Fibonacci. (A sucessão dos números de Fibonacci define-se recursivamente da seguinte forma: - fibonacci[1]=1; - fibonacci[2]=1; - fibonacci[n+2]=fibonacci[n+1]+fibonacci[n].) fibonacci@6D 8 5