【问题标题】:What is wrong with this OCAML function?这个 OCAML 函数有什么问题?
【发布时间】:2015-02-17 01:42:19
【问题描述】:

这是我的原始代码。

let rec reverse l =
   match l with 
   | [] -> []
   | (h::t) -> (reverse t) :: h

【问题讨论】:

    标签: ocaml reverse cons


    【解决方案1】:

    cons :: 运算符将元素作为左侧参数,将列表作为右侧参数。在这里,你做相反的事情是行不通的。

    在列表末尾的元素处添加元素的正确方法是使用列表连接:

    let rec reverse l =
      match l with
      | [] -> []
      | h :: t -> (reverse t) @ [h]
    

    尽管该代码不是最优的,您可能希望将其设为 tail recursive

    【讨论】:

    • 如何使这个函数尾递归?由于我刚开始使用 Ocaml,我还不太了解尾递归的概念
    • 嗯,尾递归的想法是你的函数的递归调用将永远是你的函数执行的“最后一个”动作。用 C 语言来说,您对该函数的调用始终采用return myfun () 的形式。这里你函数的最后一次调用是@。尾递归通常通过向函数添加“累加器”参数来实现,该参数将存储中间结果并由终端案例返回(这里终端案例是[])。
    • 不是尾递归并不是reverse 提议的函数的最严重违规者。它的主要问题是它的论点大小的二次复杂性。尾递归版本是线性的。
    猜你喜欢
    • 1970-01-01
    • 2017-03-26
    • 2014-06-29
    • 2011-02-13
    • 2011-04-24
    • 2011-08-26
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多