2012-03-24 88 views
3

我想知道如何編寫一個函數,將給定列表中的給定列表除以給定列表中的子列表,交換這些列表並返回結果列表。OCaml:交換列表中的元素

例如:

swap([1;3;5;6],2) => [5;6;1;3] 

我想這是我開發的代碼是正確的?

let rec swap (l,n) = 
let rec loop t (count,laux) = 
      match t with 
      | h::t when count < n -> loop t (count+1, h::laux) 
      | h::t -> h::[email protected] List.rev laux 
      | []->[] 
in 
    loop l (0,[]) 

;;;

回答

3

你快到了。問題是你的函數處理的情況下,當長度爲l大於或等於n不正確。

模式[]並不意味着輸入列表爲空;這意味着我們到了名單的盡頭。你應該做的是按照相反的順序返回累加器acc

重新排列模式那麼一點點基礎的情況下是第一位的:

let rec swap (l, n) = 
    let rec loop xs count acc = 
      match xs with 
      | _ when count = n -> xs @ List.rev acc 
      | [] -> List.rev acc 
      | h::t -> loop t (count+1) (h::acc) 
    in loop l 0 []