赋值是定义函数decimal :: [Int] -> Int
,其中正整数列表是给出十进制数,以便列表[1,4,3,1,9]
返回Integer
14319.我将使用fold
函数。
我真的没有好主意从这里开始,所以我只需要朝着正确的方向努力,但我正在考虑Horner计划。谢谢!
答案 0 :(得分:4)
在折叠中,您从左侧开始向右侧移动。当您使用列表中的下一个元素时,您将已有的元素乘以10并将新元素添加到该元素。
因此,如果您使用0对foldl进行种子处理并且具有[1,2,3],则您的函数会将当前(0)乘以10(也为0),然后再添加1.继续,将当前(1)乘以10(得到10)并加2(12)。最后为3,12 * 10 = 120,120 + 3 = 123。
这应该很容易编码:)
答案 1 :(得分:3)
也许这个等式可以指导你。
答案 2 :(得分:1)
由于这是一个家庭作业,让我们停止建议您将此表达式扩展为某个列表,并尝试提取经常性关系:
x_0 * 10 ^ n + x_1 * 10 ^(n-1)+ ... + x_n * 10 ^ 0 =(((x_0 * 10 + x_1)* 10 + x_2)...)* 10+ x_n
如果将此与折叠进行比较,您将看到一个折叠与此模式匹配两个参数的特定函数。
答案 3 :(得分:-3)
这是我的变种
import Data.List
decimal :: [Int] -> Int
decimal xs = foldl' (\sum (pos,x) -> (sum + x*(10^(l-pos)))) 0 $ zip [1..] xs where
l = length xs
*Main> decimal [1,4,3,1,9]
14319
在Haskell
中,你有非常强大的武器 - 列表处理功能。其中一项功能是foldl
(我们使用严格版本的foldl
,foldl'
)它的类型
foldl :: (a -> b -> a) -> a -> [b] -> a
这个函数接受三个参数,一个累积的agrument,一个处理的列表,以及最感兴趣的,
使用accumulator和list元素执行任何操作并返回结果的函数。折叠是非常重要的功能,因此您应该阅读有关它的详细信息{。3}}
但是,有一个问题,我们有三个变量我们的等式:列表元素处理(x
),总列表长度(n
)和处理元素的位置(k
)。但是我们只能遍历foldl
一个元素。
我们如何遍历每个元素的位置?让我们从Int
形成元组,其中第一个元素是一个位置,第二个元素是一个值。这是一个标准技巧,zip
函数可以帮助我们:
zip [1..] [1,4,3,4,6]
[(1,1),(2,4),(3,3),(4,4),(5,6)]
我们将元组列表传递给foldl
函数,foldl
为列表的每个元素调用lambda function
(\sum (pos,x) -> (sum + x*(10^(l-pos))))
,将结果汇总到sum
< / p>