haskell代码片段

-- 经典的菲波纳契数列的函数定义,求每一个位置上的数值
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 ( )

incRef var = do
    val <-
readIORef var
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值