-- 经典的菲波纳契数列的函数定义,求每一个位置上的数值
fib 1 = 1
fib 2 = 1
fib n = fib(n-1) + fib(n-2)
-- 产生一个无限长的fib数列
fib_l n = fib n : fib_l (n+1)
take 10 (fib_l 1) => [1,1,2,3,5,8,13,21,34,55]
--另一个更快解法
fibs = fibgen 1 1
fibgen n1 n2 = n1 : fibgen n2 (n1+n2)
--求解素数的一个无限数列方法:
prime = sieve [2..]
sieve (x:xs) = x : sieve (filter (\y ->y `rem` x /= 0) xs)
take 25 prime => [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]
--打印头 100 个汉明数(以2、3、5 的阶乘为因子的正整数)
main = print (take 100 hamming)
hamming = 1 : (map (2*) hamming) ~~ (map (3*) hamming) ~~ (map (5*) hamming)
where
xxs@(x:xs) ~~ yys@(y:ys)
| x==y = (x : xs~~ys)
| x<y = x:xs~~yys
| otherwise = (y : xxs~~ys)
--克拉兹(Collatz)问题
module Main where
import Data.Tuple
import Data.List (sortBy)
import Data.Function (on)
chain' :: Integer -> [Integer]
chain' 1 = [1]
chain' n
| n <= 0 = []
| even n = n : chain' (n `div` 2)
| odd n = n : chain' (n * 3 + 1)
main :: IO ()
main = do
let seqx = map (\x -> (x, length $ chain' x)) [999999,999997..3]
print . fst .head $ sortBy (flip compare `on` snd) seqx
--更快的解法
module Main where
import Data.Tuple
import Data.List (sortBy, iterate)
import Data.Function (on)
chain' :: Integer -> Int
chain' n
| n < 1 = 0
| otherwise = 1 + (length $ (takeWhile (> 1) $ iterate (\x ->if even x then x `div` 2 else x * 3 + 1) n))
main :: IO ()
main = do
let seqx = map (\x -> (x, chain' x)) [999999,999997..3]
print . fst .head $ sortBy (flip compare `on` snd) seqx
--对可变(mutable)变量的读写
incRef :: IORef Int -> IO ( )
val <- readIORef var