原 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 = 1 1 3 + 1 5 1 7 + . . .

算法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 语言吧。

猜你喜欢

转载自blog.csdn.net/quicmous/article/details/80722383