【发布时间】:2021-03-13 10:02:17
【问题描述】:
我想写一个函数f将二进制列表转换为整数,比如:
f :: [Integer] -> Integer
f [] = 0
f list = (last list) * 2^(length list -1) + f (init list)
例如f [1,1,1,1,0,0,1,0] = 79中,第一个列表元素代表2^0,最后一个列表元素代表2^7。
我可以用高阶函数而不是显式递归来编写这个函数吗?
【问题讨论】:
-
是的,您可以使用
foldl完成此操作。 -
这就是我的想法,但是我如何在 foldl 中处理(长度列表 -1)?
-
忘记求幂和
length。想想abcd = 1*d + 2*c + 2*2*b + 2*2*2*a = 1*d + 2*(c + 2*(b + 2*a)))。 -
@Sambud_Ger:你不需要长度,如果你每次乘以2,然后加上值,最终得到
2^n。 -
molbdnilo 指的是Horner's method。
标签: function haskell higher-order-functions