如何将元素添加到未将该列表作为参数传递的递归函数的列表中?

时间:2014-04-06 00:31:58

标签: list recursion tree ocaml binary-tree

标题说明了很多,这就是功能:

optimistic: dtree -> int * (int list)

let rec optimistic dt =
  match dt with
  | Decision(choiceL, costL, l, choiceR, costR, r) -> 
    if costL > costR then 0::xs; optimistic r - costR
    else 1::xs ; optimistic l - costL 
  | Chance(eventL, probL, l, eventR, probR, r) ->
    if optimistic l > optimistic r then 0::xs ; optimistic l
    else 1::xs ; optimistic r
  | Outcome -> value, x
;;

基本上,基于'route'我们取下二叉树,我们将使用0(当我们左转时)或1(当我们右转时)记录该路径并将它们放入我们一起编号列表,最后我们将返回。

问题是,我无法想出这个列表通过递归持续存在的方法,因为它不作为参数。任何想法如何做这样的事情?

2 个答案:

答案 0 :(得分:1)

我认为简短的回答是你应该有一个帮助函数 将列表作为参数。

如果您坚持使用命令式技术,则可以在遍历树时修改的更全局范围内具有可变列表值。 (即便如此,最好还是有一个辅助函数来避免将可修改列表放到最外层。)

答案 1 :(得分:0)

您应该将列表作为参数,但如果您不关心尾调用优化,可以写下:

let rec optimistic dt =
  match dt with
  | Decision(choiceL, costL, l, choiceR, costR, r) -> 
    if costL > costR then
      let c, t = optimistic r in
      c - costR, 0 :: t
    else
      let c, t = optimistic l in
      c - costL, 1 :: t
  | Chance(eventL, probL, l, eventR, probR, r) ->
    let cR, tR = optimistic r in
    let cL, tL = optimistic l in
    if cL > cR then
      cL, 0 :: tL
    else
      cR, 1 :: tR
  | Outcome -> 0, []
;;