Haskell 学习笔记-10:高精度除法、排列枚举算法实现

练习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 语言编程,因为基本语句太细小,容易陷入只见树木不见森林的境地,容易出现设计缺陷。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

许野平

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

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

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

打赏作者

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

抵扣说明:

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

余额充值