0

我需要有关 bigAdd 的帮助,比如我应该为 f 基数和 arg 输入什么。Big add 应该接受 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 的类型以及它们的功能应该是什么吗?我很混乱。

4

1 回答 1

1

问题的重点是了解函数和f a x变量应该是什么。这可能不是您第一次遇到,所以我建议您回顾以前的练习,并将您对上述变量的想法添加到您的问题中。如果您想不出任何代码,请用英语解释您对它们的理解。baseargsList.fold_leftList.fold_left

你需要先了解f。完成后,您将清楚地看到f需要什么baseargs。要理解f,请考虑如何逐个数字地手动进行加法。

您绝对不会将列表转换为 int,重点bigAdd是处理比最大值大得多的巨大整数int

关于辅助功能的旁注:

  • removeZero很好
  • padZero正在调用List.length几次,这很慢。您应该计算要添加的零的数量,然后将它们全部添加而不调用 List.length.
  • 替换[0]@l10 :: l1.
于 2012-10-27T11:45:35.713 回答