如何从 Haskell 中的两个列表(+额外条件)中添加值
How to add values from two lists (+extra condition) in Haskell
这个练习我遇到了问题。很长一段时间以来,我一直在努力解决这个问题,寻找东西,但我做不到。
定义函数:
addLnat :: [Int] -> [Int] -> [Int]
mulLnat :: [Int] -> [Int] -> [Int]
addLnat 将两个数组中的数字相加,例如
addLnat [4,5,6] [8,5,2] -> [2,1,9]
as [4+8给出2个进位1, 5+5+1给出1个进位1, 6+2+1 = 9]
Lnat,是一个 "list natural number",表示为以 10 为基数的数字列表,最低位在前。所以数字 654 是 [4,5,6]。
我得到的是:
addLnat :: [Int] -> [Int] -> [Int]
addLnat _ [] = []
addLnat [] _ = []
addLnat (x:xs) (y:ys) = (if (x+y) > 9 then x+y-10 else (x+y)):(addLnat xs ys)
我加号忽略进位。不知道如何解决。
如有任何帮助,我们将不胜感激。
我已根据 user5402 评论改进了解决方案,因此创建了 addLnat' cr xs ys,但是当我将携带作为参数传递时,它无法加载 - 最有可能我的语法错误:(
(cr暂时为0,以后会被maths代替)
addLnat' c (x:xs) (y:ys) = d : addLnat' cr xs ys
where d = if c+x+y < 9 then x+y else c+x+y-((quot (c+x+y) 10)*10)
cr = 0
有什么想法吗?
您需要编写一个接受进位参数的 addLnat 版本:
addLnat' c (x:xs) (y:ys) = d : addLnat c' xs ys
where d = if c+x+y > 9 then ... else ...
c' = ... the next carry bit ...
还有很多细节和极端情况需要考虑,但这是基本思路。
最后,
addLnat xs ys = addLnat' 0 xs ys -- initially the carry is 0
我不是很擅长 haskell 但也许这会有所帮助;
add::[Int]->[Int]->[Int]
add x y = add' 0 x y
我们在那里定义了一个函数 add,它将使用 add' 来添加两个列表。主要思想是 "save" 携带并仔细处理极端情况。这里carry保存在"variable" rest
add'::Int->[Int]->[Int]->[Int]
add' 0 x [] = x
add' rest (x:[]) (y:[]) = [(r `mod` 10),(r `div` 10)]
where r = x+y+rest
add' y (x:xs) [] = add' (r `div` 10) ((r `mod` 10):xs) []
where r = x+y
add' rest (x:xs) (y:ys) = (r `mod` 10) : (add' (r `div` 10) xs ys)
where r = x+y+rest
列表 x 必须大于列表 y 但这不是问题
add [5,7,8] [4,3,2] => [9,0,1,1] (correct)
add [1,2,3] [4,5,6] => [5,7,9,0] (correct)
这个练习我遇到了问题。很长一段时间以来,我一直在努力解决这个问题,寻找东西,但我做不到。
定义函数:
addLnat :: [Int] -> [Int] -> [Int]
mulLnat :: [Int] -> [Int] -> [Int]
addLnat 将两个数组中的数字相加,例如
addLnat [4,5,6] [8,5,2] -> [2,1,9]
as [4+8给出2个进位1, 5+5+1给出1个进位1, 6+2+1 = 9]
Lnat,是一个 "list natural number",表示为以 10 为基数的数字列表,最低位在前。所以数字 654 是 [4,5,6]。
我得到的是:
addLnat :: [Int] -> [Int] -> [Int]
addLnat _ [] = []
addLnat [] _ = []
addLnat (x:xs) (y:ys) = (if (x+y) > 9 then x+y-10 else (x+y)):(addLnat xs ys)
我加号忽略进位。不知道如何解决。 如有任何帮助,我们将不胜感激。
我已根据 user5402 评论改进了解决方案,因此创建了 addLnat' cr xs ys,但是当我将携带作为参数传递时,它无法加载 - 最有可能我的语法错误:( (cr暂时为0,以后会被maths代替)
addLnat' c (x:xs) (y:ys) = d : addLnat' cr xs ys
where d = if c+x+y < 9 then x+y else c+x+y-((quot (c+x+y) 10)*10)
cr = 0
有什么想法吗?
您需要编写一个接受进位参数的 addLnat 版本:
addLnat' c (x:xs) (y:ys) = d : addLnat c' xs ys
where d = if c+x+y > 9 then ... else ...
c' = ... the next carry bit ...
还有很多细节和极端情况需要考虑,但这是基本思路。 最后,
addLnat xs ys = addLnat' 0 xs ys -- initially the carry is 0
我不是很擅长 haskell 但也许这会有所帮助;
add::[Int]->[Int]->[Int]
add x y = add' 0 x y
我们在那里定义了一个函数 add,它将使用 add' 来添加两个列表。主要思想是 "save" 携带并仔细处理极端情况。这里carry保存在"variable" rest
add'::Int->[Int]->[Int]->[Int]
add' 0 x [] = x
add' rest (x:[]) (y:[]) = [(r `mod` 10),(r `div` 10)]
where r = x+y+rest
add' y (x:xs) [] = add' (r `div` 10) ((r `mod` 10):xs) []
where r = x+y
add' rest (x:xs) (y:ys) = (r `mod` 10) : (add' (r `div` 10) xs ys)
where r = x+y+rest
列表 x 必须大于列表 y 但这不是问题
add [5,7,8] [4,3,2] => [9,0,1,1] (correct)
add [1,2,3] [4,5,6] => [5,7,9,0] (correct)