2012-10-27 42 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函數,我更新以上 –