2017-03-18 61 views
-3

我想将函数met_devant_et_acc变成一个尾递归函数,但我不知道如何重写它。 met_devant_et_acc l h应该返回一个列表,其中包含列表l的所有列表以及所有这些列表中的元素h作为第一个元素。尾递归Ocaml程序

例如:met_devant_et_acc [ [1;2] ; [3;4] ][ [9;1;2] ; [9;3;4] ; [1;2] ; [3;4] ]

let rec met_devant_et_acc l h = match l with 
    | [] -> [[]] 
    | a::t -> (met_devant h l) @ l;; 

功能met_devant放元素h在每个列表的头列表l

例如:met_devant h [ [ ]; ['x';'e']]回报[ ['h'] ; ['h';'x';'e'] ]

这里的代码met_devant

let rec met_devant h l = match l with 
    | [] -> l 
    | a::b -> List.map (ajoute h) l;; 

功能ajoute添加元素h到列表l

let ajoute t l = match l with 
    | [] -> l 
    | a::b -> t::l;; 
+0

你解释呢,但是不知道met_devant_et_acc应该什么met_devant来实现的,也不知道为什么要让它尾递归。 –

+0

您正在显示'met_devant_et_acc'的代码,其中不包含递归调用。如果你需要'met_devant'的帮助,你应该显示该函数的代码,并解释为什么它看起来没有工作。 –

+0

我刚刚重新编辑我的文章(再次)。对不起,我是该网站的新成员,我需要一点时间才能解决,但感谢您帮助我这样做。 – TheScientist

回答

0

此功能是写在F#的头,但它可能会在ocaml的编译,也许小的修改。该函数不附加原始列表。

以相反的顺序收集结果的原因是,我认为预先计算比追加更有效,然后在循环后进行反转。

let prependToLists lists element = 

    let rec loop (shrinkList, growList) = 
     match shrinkList with 
     | [] -> ([], growList) 
     | headList :: tailLists -> 
      let newGrowList = (element::headList)::growList 
      loop (tailLists, newGrowList) 

    let emptyList, resultList: int list list * int list list = loop (lists, []) 
    List.rev resultList 

// let test = []      // [] 
// let test = [[]]     // [ [ 555 ] ] 
// let test = [ [123] ]    // [ [ 555; 123 ] ] 
let test = [ [7]; []; [3;5] ] // [[555;7]; [555]; [555;3;5]] 
let prependedLists = prependToLists test 555 
1
let met_devant_et_acc h l = 
    let rec aux acc = function 
    | [] -> acc 
    | a::t -> aux ((h::a)::acc) t 
    in 
    aux [] (List.rev l) @ l 

或者

let met_devant_et_acc h l = 
    List.fold_left (fun acc a -> (h::a)::acc) [] (List.rev l) @ l 

测试:

# met_devant_et_acc 9 [ [1;2] ; [3;4] ];; 
- : int list list = [[9; 1; 2]; [9; 3; 4]; [1; 2]; [3; 4]] 
# met_devant_et_acc 9 [];; 
- : int list list = [] 
# met_devant_et_acc 9 [[]];; 
- : int list list = [[9]; []] 
+0

List.fold_left函数做什么?我从来没有用过它 – TheScientist

+0

@DanRob对不起,我迟到的回应,List.fold_left f a [b1; ...; bn]是f(...(f(f a b1)b2)...)bn。 List.fold_left是尾递归的,但不是List.fold_right。 –