мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версияСледующая версия справа и слева
haskell:fibb [19/02/2014 18:50] vlasovhaskell:fibb [19/02/2014 18:57] vlasov
Строка 41: Строка 41:
 <code haskell> <code haskell>
 fib 0 1 n fib 0 1 n
 +</code>
 +
 +Другой вариант из сайта [[http://www.haskell.org/haskellwiki/The_Fibonacci_sequence|The Fibonacci sequence]] с аккумулятором и //хвостовой рекурсией// (используя расширения языка):
 +
 +<code haskell>
 +{-# LANGUAGE BangPatterns #-}
 +fib n = go n (0,1)
 +  where
 +    go !n (!a, !b) | n==0      = a
 +                   | otherwise = go (n-1) (b, a+b)
 +</code>
 +
 +Вот //императивный вариант// с монадой состояния (оттуда же):
 +
 +<code haskell>
 +import Control.Monad.State
 +fib n = flip evalState (0,1) $ do
 +  forM [0..(n-1)] $ \_ -> do
 +    (a,b) <- get
 +    put (b,a+b)
 +  (a,b) <- get
 +  return a
 +</code>
 +
 +А статья [[http://rsdn.ru/article/haskell/haskell_part1.xml|Мягкое введение в Haskell-1]] предлагает решение в виде циклического бесконечного списка:
 +
 +<code haskell>
 +fib = 1 : 1 : [ a+b | (a,b) <- zip fib (tail fib) ]
 </code> </code>