Commom Lisp–Project Euler #1
Olá pessoal, seguindo a série de posts sobre commom lisp e a série de resoluções de problemas do projecteuler.net que os amigos Rodrigo Vidal, Elemar Junior e Juan Lopes estão fazendo aqui está minha contribuição do problema #1 em commom lisp.Vamos ao código:
A solução é bem menos elegante que a solução proposta pelo mestre Elemar em Haskell mesmo assim vamos analisar a solução.
Algoritmo
O algoritmo usado envolveu declarar uma função que recebe os limites, inferior e superior, e calcula os números cujo módulo de 3 ou 5 é igual a 0. Ao final da verificação de itens dentro do intervalo uma função que soma todos os valores resultantes foi aplicada.
Código
linha 2: o comando label foi usado para definir uma função que retorne uma lista com os números entre, inclusive, os limites passados como parâmetro.
O loop for
Olhando bem para o uso do comando loop ele é um pouco diferente do restante do código lisp não é? afinal de contas um monte de palavras soltas não é normal em commom lisp. O comando loop é uma macro que permite diversas combinações de uso, olhe mais aqui.
linha 3: uma função múltiplo-de-3-ou-5 é definida, na função foi usado o comando (mod x y ) para verificar o módulo de um determinado número x por y.
linha 4: É onde o problema é realmente resolvido. Lendo o código da esquerda para direita temos o seguinte: uma função redutora que faz uso do redutor de soma “+” é usada para reduzir uma lista gerada pela função mapcar. A função mapcar aplicou a função ‘múltiplo-de-3-ou-5 na lista gerada pela função intervalo.
É isso pessoal, em breve vou compartilhar mais soluções de problemas do ProjectEuler em lisp.
Assim não fica mais fácil?!
(+ (loop for x from 3 to 999 by 3
sum x)
(loop for x from 5 to 999 by 5
sum x))
[]s
Elemar JR
Opa .. Erro
(-
(+
(loop for x from 3 to 999 by 3
sum x)
(loop for x from 5 to 999 by 5
sum x)
)
(loop for x from 15 to 999 by 15
sum x)
)
agora sim