Ferramentas de Utilizador

Ferramentas de Site


dev_geral:haskell:series_geometricas

Séries Geométricas

Em matemática, uma série geométrica é uma série com um rácio constante entre os sucessivos termos. Visto Haskell ser lazy, uma pessoa consegue facilmente gerar a lista infinita das sequências. Ficam alguns exemplos.

Exemplos

Todas as versões irão definir a função serie que receberá dois argumentos, um para indicar o valor do primeiro termo e o seguinte para indicar o rácio.

-- Usando listas por compreensão
serie t r = [ t * r^x | x <- [0..]]
 
-- Usando Monad de listas
serie t r = [0..] >>= return . (t*) . (r^)
 
-- Usando a sintaxe 'do'
serie t r = do
   x <- [0..]
   return (t * r^x)
 
-- Usando o tradicional map
serie t r = map ((t*).(r^)) [0..]
 
-- Usando a definição da própria função
serie t r = t : map (*r) (serie t r)
 
-- A função 'iterate' até parece que foi criada de propósito para este problema
serie t r = iterate (*r) t
 
-- Usando um fold especial que armazena os passos intermédios
-- Irá gerar uma sequência infinita já que o fold nunca irá calcular o último termo...
serie t r = scanl (*) t (repeat r)
 
-- Usando o Y Combinator (em Haskell 'fix')
-- Necessário importar a biblioteca (Control.Monad.Fix)
-- Ou então definir à mão
fix f = f (fix f)
 
serie t r = fix ((t:) . map (*r))
 
-- Usando anamorfismo sobre listas
-- Define-se primeiro as funções para anamorfismo em listas
-- Usando notações de Arrows (import Control.Arrow)
 
inList = (const [] ||| (uncurry (:)))
recList f = id +++ ( id *** f)
ana f = inList . (recList (ana f)). f
 
-- Tendo a função generalista para anamorfismo de listas criada
-- Usamos para o nosso caso particular
serie t r = ana (Right . (id &&& (*r))) t
 
 
-- No caso das listas, Haskell já vem com a função de cata/anamorfismo no sistema de bibliotecas
-- Para catamorfismos temos as funções foldr, etc
-- Para anamorfismos temos a função unfoldr (import Data.List)
serie t r = unfoldr (Just . (id &&& (*r))) t
dev_geral/haskell/series_geometricas.txt · Esta página foi modificada pela última vez em: 2018/05/14 21:37 (Edição externa)