我的练习有问题。我一直试图解决它很长一段时间寻找东西,但我无法。
定义功能:
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,是一个“列表自然数”,表示为基数为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,它将被数学代替)。
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
有什么想法吗?
答案 0 :(得分:2)
您需要编写一个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
答案 1 :(得分:2)
我不是很擅长哈斯克尔,但也许这可以帮助你;
add::[Int]->[Int]->[Int]
add x y = add' 0 x y
我们定义了一个将使用add&#39;的函数add。添加两个列表主要的想法是&#34;保存&#34;携带并仔细处理角落案件。这里的携带保存在&#34;变量&#34;休息
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)