练习1 编写函数 divDecimal a b c,计算 a/b,保留 c 位小数。
divDecimal a b c = (div a b):(div3' (10*(mod a b)) b c)
where div3' a b 0 = []
div3' a b c = (div a b):(div3' (10*(mod a b)) b (c-1))
>> divDecimal 5 7 20
[0,7,1,4,2,8,5,7,1,4,2,8,5,7,1,4,2,8,5,7,1]
练习2 编写函数 array n list,从列表 list 中选取 n 个元素构全部排列。这个例子中,我使用了列表推导式、折叠 fold
、映射 map 等功能,简化了函数实现方法。
array 0 list = [[]]
array n list = foldl (++) [] [map (++[x]) (array (n-1) (listsub list x)) | x <- list]
where listsub list x = [e | e <- list, e /= x]
>> array 5 [1,2,3]
[]
>> array 1 [1,2,3]
[[1],[2],[3]]
>> array 2 [1,2,3]
[[2,1],[3,1],[1,2],[3,2],[1,3],[2,3]]
>> array 3 [1,2,3]
[[3,2,1],[2,3,1],[3,1,2],[1,3,2],[2,1,3],[1,2,3]]
>> array 3 [1,2,3,4,5]
[[3,2,1],[4,2,1],[5,2,1],[2,3,1],[4,3,1],[5,3,1],[2,4,1],[3,4,1],[5,4,1],[2,5,1]
,[4,1,3],[5,1,3],[1,2,3],[4,2,3],[5,2,3],[1,4,3],[2,4,3],[5,4,3],[1,5,3],[2,5,3]
,[4,1,5],[1,2,5],[3,2,5],[4,2,5],[1,3,5],[2,3,5],[4,3,5],[1,4,5],[2,4,5],[3,4,5]
如果不考虑计算效率,函数式编程还是非常不错的。今天最重要的一个感受,函数式编程使用了较为宏观的功能块实现算法,每个功能块,例如 map、fold 等,都能实现一个完整的功能,有着完整的意义,因此,构成的代码质量就比较高。C 语言编程,因为基本语句太细小,容易陷入只见树木不见森林的境地,容易出现设计缺陷。