我需要帮助bigAdd,就像我应该为f base和arg准备的那样。大添加假定接收2个int数组并将总和输出到另一个int数组,如
# bigAdd [9;9] [1;0;0;2];;
- : int list = [1;1;0;1]
# bigAdd [9;9;9;9] [9;9;9];;
- : int list = [1;0;9;9;8]
我到目前为止
let rec padZero l1 l2 =
if List.length l1 > List.length l2 then (padZero l1 ([0]@l2))
else if List.length l2 > List.length l1 then (padZero ([0]@l1) l2)
else (l1, l2)
let rec removeZero l = match l with
|[]->
|h::t-> if h == 0 then removeZero t else l
let bigAdd l1 l2 =
let add (l1, l2) =
let f a x = failwith "to be implemented" in
let base = failwith "to be implemented" in
let args = failwith "to be implemented" in
let (_, res) = List.fold_left f base args in
res
in
removeZero (add (padZero l1 l2))
编辑:所以现在我有
let bigAdd l1 l2 =
let add (l1, l2) =
let f a x = failwith "to be implemented" in
let base = 0 in
let args = List.combine l1 l2 in
let (_, res) = List.fold_left f base args in
res
in
removeZero (add (padZero l1 l2)
我很确定args是它应该是什么,但基础可能是错误的,我不知道如何写f。列表的添加部分究竟来自这个骨架?我是否首先将列表中的每个转换为int,然后添加它们并将其转换回int列表或直接添加它们,如果是的话,如何以及在骨架中的位置。
有人可以向我描述f,base和args的类型以及它们的功能应该是什么?我很困惑。
答案 0 :(得分:1)
问题的关键是要了解函数f a x
以及变量base
和args
应该是什么。这可能不是您第一次遇到List.fold_left
,所以我建议您使用List.fold_left
查看以前的练习,并在上面添加您对上述变量的看法。如果您无法提出任何代码,请用英语解释您对它们的理解。
您需要先了解f
。完成后,您会清楚地看到f
需要base
和args
。
要了解f
,请考虑如何逐手手动添加。
你肯定不会将列表转换为int,bigAdd
的整点是处理大整数,大于最大int
。
关于辅助功能的附注:
removeZero
很好padZero
多次调用List.length
,这很慢。您应该计算要添加的零的数量,然后在不调用List.length
的情况下将它们全部添加。[0]@l1
替换为0 :: l1
。