Elementos de Programação
Amílcar Sernadas, Cristina Sernadas e Jaime Ramos

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[6]

quadrados: recebe um número natural n e devolve a lista dos quadrados dos naturais até n (exclusivé).

quadrados[6]

quadradosinv: recebe um número natural n e devolve a lista dos quadrados perfeitos até n, por ordem decrescente.

quadradosinv[6]

inverteLista: recebe uma lista e devolve a mesma lista mas invertida.

inverteLista[{1,2,3,4}]

indicesPares: recebe uma lista de inteiros w e devolve a lista dos elementos de w em posições pares.

indicesPares[{2,3,4,5,6}]

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[4]

prodLista: recebe uma lista de inteiros e devolve o produto dos seus elementos.

prodLista[{2,1,-5,2}]

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[{1,2,3,1,2,3},2]

pertenceQ: recebe uma lista de inteiros w e um inteiro k e devolve True sse k ocorre em w.

pertenceQ[{3,4,5,6,7,5},8]

pertenceQ[{3,4,5,6,7,5},7]

listaPrimosQ:recebe uma lista de naturais w e devolve True sse w só contém  números primos.

listaPrimosQ[{1,2,3,4}]

listaPrimosQ[{2,5,3}]

IntListQ: verifica se o argumento é uma lista de inteiros.

IntListQ[{2,3,6,3}]

IntListQ[{4,s,"banana",Function[x,x]}]

IntListQ[MatrixQ]

NatListQ: verifica se o argumento é uma lista de naturais.

NatListQ[{2,3,6,3}]

NatListQ[{2,-3,6,3}]

NatListQ[{4,s,"banana",Function[x,x]}]

IntListListQ: verifica se o argumento é uma lista de listas de inteiros.

IntIntListQ[{2,3,6,3}]

IntIntListQ[{{2,3,6,3}}]

IntIntListQ[{{2,5},{-3},{}}]

StringMatrixQ: verifica se o argumento é uma matriz de strings.

StringMatrixQ[{{"banana","maçã"},{"laranja","pêssego"}}]

StringMatrixQ[{{"a","b"},{"c"}}]

StringMatrixQ[{"blah"}]

permutacao: recebe duas listas w1 e w2 e devolve True se w2 for uma permutação de w1 e False caso contrário.

permutacao[{1,2,3},{2,1,3}]

permutacao[{1,2,3},{1,2,2,3}]

permutacao[{2,4},{2}]

comprimento: recebe uma lista e devolve o seu comprimento.

comprimento[{1,2,3,4}]

junta: recebe duas listas e devolve a sua concatenação.

junta[{1,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[{3,2,1},{a}]

intercala[{6,4},{5,6,7}]

intercala[{3,2,1},{5,6,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[{1,2,3,2,1,2},1]

posPrimos: recebe uma lista de inteiros e devolve a lista das posições onde ocorrem números primos.

posPrimos[{2,7,6,5,7}]

posMax: recebe uma lista de inteiros e devolve a lista das posições onde ocorre o maior elemento.

posMax[{2,7,6,5,7}]

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[{{1,2,3,4,5},{2,4,3,5},{4,6,8,9},{}}]

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[6]