0

f base と arg に正確に何を入れる必要があるかなど、bigAdd について助けが必要です。大きな追加は、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)

引数が本来あるべきものであると確信していますが、ベースはおそらく間違っており、f の書き方がわかりません。リストの追加部分は、このスケルトンのどこから来るのでしょうか? 最初にリスト内のそれぞれを int に変換してから、それらを追加して int リストに戻すか、直接追加しますか。

f、base、およびargsの型と、それらの関数がどうあるべきかを誰かが私に説明できますか? 私は困惑している。

4

1 に答える 1

1

問題のポイントは、関数と変数がどうあるべきかを理解することf a xです。これはおそらく との初めての出会いではないので、以前の の演習を見直し、上記の変数に関するあなたの考えを質問に追加することをお勧めします。コードが思い浮かばない場合は、それらについて理解していることを英語で説明してください。baseargsList.fold_leftList.fold_left

まず理解する必要がありますf。完了すると、とfとして何が必要かが明確にわかります。を理解するには、手で 1 桁ずつ加算する方法を考えてみてください。baseargsf

リストを int に変換することは絶対にありません。最大のポイントはbigAdd、 maximum よりもはるかに大きな巨大な整数を処理することintです。

補助機能に関する補足事項:

  • removeZeroいいね
  • padZeroが数回呼び出しList.lengthていますが、これは遅いです。代わりに、追加するゼロの数を計算してから、 を呼び出さずにすべて追加する必要があり List.lengthます。
  • に置き換え[0]@l1ます0 :: l1
于 2012-10-27T11:45:35.713 に答える