【问题标题】:Tail-recursive programs in F# [duplicate]F#中的尾递归程序[重复]
【发布时间】:2020-05-23 16:08:41
【问题描述】:

您好,我正在尝试做这个练习,但不太明白。我在 F# 中得到以下代码

type A<’a> = | D of ’a * bool
             | E of A<’a> * A<’a>

let rec g acc x = match x with
             | E(y,z) -> g (g acc z) y
             | D(a,true) -> a::acc
             | _ -> acc;;

let h x = g [] x;;

现在的练习是讨论 g 是否是尾递归函数,并提供 g 和 h 的基于延续的尾递归变体的声明。 希望有人能帮忙!

【问题讨论】:

    标签: f# f#-interactive


    【解决方案1】:

    g 不是尾递归的,因为它首先需要解析外部 g 中的内部 g 调用,基本上使用堆栈直到内部调用已解决。

    应用 CPS 这可以重写为

    let rec g acc x cont = 
      match x with
        | E(y,z) -> g acc z (fun acc->g acc y id)
        | D(a,true) -> a::acc |> cont
        | _ -> acc |> cont
    

    并像这样称呼

    let h x = g [] x id
    

    Continuations 作为函数的参数传递,你接下来要解决什么。例如,在节点类型 E 的情况下,我们求解 z,然后要求求解作为延续 y。延续在终结情况下解决D

    id 基本上是最后一次调用的标识函数,因为我们不需要做任何事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 2011-04-13
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多