返回去看前几天写的代码,感觉有些 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 满足下面公式:
算法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 语言吧。