02.prog.rec.nb 1 Programação Recursiva Nos exercícios que se seguem, as únicas funções primitivas sobre listas que deve utilizar são: First, Last, Rest, Append, Prepend e {}. Defina recursivamente em Mathematica as funções abaixo descritas. † 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 perfeitos até n. quadrados@6D 81, 4, 9, 16, 25, 36< † 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< † prodLista: recebe uma lista de inteiros e devolve o produto dos seus elementos. prodLista@81, 2, 3, 4<D 24 † contemPrimoQ:recebe uma lista de naturais w e devolve True sse w contém pelo menos um número primo. contemPrimoQ@81, 2, 3, 4<D True contemPrimoQ@84, 6, 8, 10<D False 02.prog.rec.nb † 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 † junta: recebe duas listas e devolve a sua concatenação. junta@81, 2, 3<, 89, 8, 7<D 81, 2, 3, 9, 8, 7< † indicesPar: recebe uma lista de inteiros w e devolve a lista dos elementos de w em posições pares. indicesPar@82, 3, 4, 4, 5<D 83, 4< † retiraPares: recebe uma lista de inteiros w e devolve a lista dos elementos pares de w. retiraPares@82, 3, 4, 4, 5<D 82, 4, 4< † retiraNeg: recebe uma lista de inteiros w e devolve a lista resultante de retirar todos os números negativos de w. retiraNeg@83, −2, 1, −7<D 83, 1< † supremo: recebe uma lista de inteiros e devolve o seu supremo. (Note que o supremo do conjunto vazio é -¶.) supremo@8<D −∞ supremo@81, −3, 6, −27<D 6 † 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 2 02.prog.rec.nb 3 † lposicoes: recebe como argumentos uma lista de inteiros w e um inteiro k e devolve a lista das posições em que k ocorre em w. lposicoes@81, 2, 3, 1, 2, 3<, 2D 82, 5< † caracteristicaPrimos: recebe uma lista de naturais w e devolve uma lista com True nas posições onde ocorre em w um número primo e False nas outras. caracteristicaPrimos@81, 2, 3, 4, 5, 6, 7, 8, 9<D 8False, True, True, False, True, False, True, False, False< † apaga1: recebe uma lista w e um número inteiro k e devolve a lista que resulta de se apagar de w a primeira ocorrência de k (caso exista). apaga1@81, 2, 3, 2, 1, 2<, 1D 82, 3, 2, 1, 2< † 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< † seleccao: recebe uma lista e um predicado e devolve a lista dos elementos que verificam esse predicado. seleccao@81, 2, 3, 4, 5, 6<, PrimeQD 82, 3, 5< † mapeia: recebe uma função f e uma lista w e devolve a lista dos resultados de aplicar f aos elementos de w. mapeia@Function@x, 2 ^ xD, 83, 5, 7, 8<D 88, 32, 128, 256< mapeia@Function@x, EvenQ@xDD, 83, 5, 7, 8<D 8False, False, False, True< † primalg: recebe um inteiro k e devolve o primeiro algarismo de k. primalg@2D 2 02.prog.rec.nb 4 primalg@6535D 6 † temPrimoQ: dada uma lista de listas de inteiros devolve True sse alguma das suas sublistas tem um número primo. temprimoQ@884<, 83<, 81, 4, 6<<D True temprimoQ@884<, 88<, 81, 4, 6<<D False † inverteLista: recebe uma lista e devolve a mesma lista mas invertida. Apresente duas soluções para a referida função: uma usando recursão à esquerda e outra usando recursão à direita. inverteLista@81, 2, 3, 4<D 84, 3, 2, 1< † ligualQ: recebe duas listas e devolve True se as listas forem iguais e False caso contrário. ligualQ@81, 2, 3<, 81, 2, 3<D True ligualQ@81, 2, 3<, 82, 1, 3<D False Os exercícios seguintes são de um nível de dificuldade mais elevado; caso considere necessário, utilize algumas das funções acima definidas. † 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 permutacao@81, 2, 3<, 81, 2, 2, 3<D False † intercala: recebe duas listas w1 e w2 e devolve a lista resultante de intercalar os elementos de w1 e w2. intercala@83, 2, 1<, 85, 6, 7<D 83, 5, 2, 6, 1, 7< 02.prog.rec.nb intercala@83, 2, 1<, 84<D 83, 4, 2, 1< intercala@8<, 85, 6, 7<D 85, 6, 7< † indPrimos: recebe uma lista de listas de inteiros w1={w11,w12,...,w1k} e devolve a lista w2={w21,w22,...,w2k}, em que w2i é composta pelas posições dos números primos em w1i. indprimos@881, 2, 3, 4, 5<, 82, 4, 3, 5<, 84, 6, 8, 9<, 8<<D 882, 3, 5<, 81, 3, 4<, 8<, 8<< † separaMult3e5: recebe uma lista de inteiros w e devolve um par formado por duas listas: a dos múltiplos de 5 que ocorrem em w e a dos múltiplos de 3 que ocorrem em w. separaMult3e5@81, 2, 3, 4, 5, 9, 15<D 883, 9, 15<, 85, 15<< † potencia: recebe um algarismo k (que não zero) e devolve o menor natural n tal que 2^n começa por k. potencia@2D 2 potencia@3D 6 † repete: recebe uma lista w e devolve uma lista em que o primeiro elemento de w aparece uma vez, o segundo elemento duas vezes, ... . repete@8a, b, c<D 8a, b, b, c, c, c< 5