函数bigAdd(添加两个int列表)

时间:2012-10-27 11:17:02

标签: ocaml

我需要帮助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的类型以及它们的功能应该是什么?我很困惑。

1 个答案:

答案 0 :(得分:1)

问题的关键是要了解函数f a x以及变量baseargs应该是什么。这可能不是您第一次遇到List.fold_left,所以我建议您使用List.fold_left查看以前的练习,并在上面添加您对上述变量的看法。如果您无法提出任何代码,请用英语解释您对它们的理解。

您需要先了解f。完成后,您会清楚地看到f需要baseargs。 要了解f,请考虑如何逐手手动添加。

你肯定不会将列表转换为int,bigAdd的整点是处理大整数,大于最大int

关于辅助功能的附注:

  • removeZero很好
  • padZero多次调用List.length,这很慢。您应该计算要添加的零的数量,然后在不调用List.length的情况下将它们全部添加。
  • [0]@l1替换为0 :: l1