原 Haskell 学习笔记-09:练习代码重构

返回去看前几天写的代码,感觉有些 low,重新写一下。

1、三个数排序,提供一个易读性较好的方案。

sortThreeNum x y z
    | x <= y && y <= z = (x, y, z)
    | x <= z && z <= y = (x, z, y)
    | y <= x && x <= z = (y, x, z)
    | y <= z && z <= x = (y, z, x)
    | z <= x && x <= y = (z, x, y)
    | otherwise = (z, y, x) 

2、搜索,给出目标在列表中的索引.。

search x []         = -1
search x (y:ys)  
    | x == y        = 0
    | otherwise     = 1 + search x ys

3、比较排序。最笨的排序方法,前几天还觉得很难,现在感觉顺手多了。所以函数式编程,经验很重要,写的代码多了,就不觉得难了。原来的代码 15 行,这一次 6 行搞定。

sort []             = []
sort (x:[])         = [x]
sort (x:xs) 
    | x < head ys   = x:ys
    | otherwise     = head ys : sort (x : tail ys)  
    where ys = sort xs

学习一门语言,除了多练习、多总结,没其他好办法。再写两个计算圆周率的计算方法,前几天不知道怎样写,今天搞定。圆周率 pi 满足下面公式:

π4=113+1517+...π4=1−13+15−17+...

算法1:利用递归计算级数之和。

pi1 =
    let 
        pi' 0 = 0.0
        pi' n 
            | odd n     = pi' (n - 1) + 1 / (fromIntegral (2*n-1))
            | otherwise = pi' (n - 1) - 1 / (fromIntegral (2*n-1))
    in 4 * pi' 1000000

算法2:利用列表推导式计算级数之和。

pi2 = sum [4.0/(fromIntegral x)|x <- [1,5..2000000]] - sum[4.0/(fromIntegral x)|x <- [3,7..2000000]]

我发现,与数学有着极深渊源的函数式程序设计,其实不擅长复杂数学运算,现阶段解决复杂数学问题,还是靠 C 语言吧。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许野平

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值