我试图以优雅和富有表现力的方式解决这个简单问题。通常,我会从两个列表的末尾开始,添加相应的元素并存储进位来计算下一个数字。但是,我正在努力通过递归来解决这个问题,并且不使用reverse
函数。在Haskell中添加存储为0和1的列表的两个二进制数,而不使用反向
这是我第一次尝试:
binarySum :: [Int] -> [Int] -> [Int]
binarySum ls ls'
= let (res, c) = binarySum' ls ls' in c : res
where
binarySum' [x] [y]
= let (s, c) = add x y in ([s], c)
binarySum' (x : xs) (y : ys)
= (s : res, c')
where
(res, c) = binarySum' xs ys
(s, c') = add' x y c
(其中添加,并添加”功能执行所需的操作)
结果列表看起来是正确的,但以相反的顺序。我不知道如何继续,因为我选择在辅助函数中随同进位一起返回的对中创建结果(通常我会执行类似s : binarySum'...
的操作)。
此外,我觉得代码太混乱了,不像应该那样优雅。
任何帮助,非常感谢!
存储在写序二进制数是比较尴尬的,因为你需要知道,为了知道第一位的位值的整个列表的长度。使用缺点时,反转是代表它们的优雅方式。 – luqui
Conal Elliott对二进制补充[这里]有一个非常抽象的处理,如果你喜欢这样的话。 – luqui
你对'add''的定义是什么?你确定你得到了'(结果,携带)'而不是相反吗? – gallais