2012-10-27 41 views
0

我需要帮助bigAdd,就像我应该为f基和arg所做的一样。大加应该取在2个INT阵列和输出总和到另一个int数组一样函数bigAdd(添加两个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) 

我很确定这个参数是它应该是什么,但是底座可能是错误的,我不知道如何编写f。列表的附加部分究竟来自于这个骨架?我是否将列表中的每一个转换为int型,然后将它们添加并转换回int列表或直接添加它们,如果是这样,在骨架中如何以及在哪里。

有人可以向我描述f,base和args的类型是什么,它们的功能应该是什么?我很困惑。

+0

你已经发布问题到Stackoverflow?如果是的话,最好使用同一个帐户。 – jrouquie

+0

我的其他帐户由于某种原因无法再提问,但我更新了以上问题 –

+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]@l10 :: l1
+0

我测试了removeZero和padZero哪些工作正常,但我真的很难理解bigAdd函数,我更新以上 –