标题说明了很多,这就是功能:
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(当我们右转时)记录该路径并将它们放入我们一起编号列表,最后我们将返回。
问题是,我无法想出这个列表通过递归持续存在的方法,因为它不作为参数。任何想法如何做这样的事情?
答案 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, []
;;