【发布时间】:2015-02-17 01:42:19
【问题描述】:
这是我的原始代码。
let rec reverse l =
match l with
| [] -> []
| (h::t) -> (reverse t) :: h
【问题讨论】:
这是我的原始代码。
let rec reverse l =
match l with
| [] -> []
| (h::t) -> (reverse t) :: h
【问题讨论】:
cons :: 运算符将元素作为左侧参数,将列表作为右侧参数。在这里,你做相反的事情是行不通的。
在列表末尾的元素处添加元素的正确方法是使用列表连接:
let rec reverse l =
match l with
| [] -> []
| h :: t -> (reverse t) @ [h]
尽管该代码不是最优的,您可能希望将其设为 tail recursive。
【讨论】:
return myfun () 的形式。这里你函数的最后一次调用是@。尾递归通常通过向函数添加“累加器”参数来实现,该参数将存储中间结果并由终端案例返回(这里终端案例是[])。
reverse 提议的函数的最严重违规者。它的主要问题是它的论点大小的二次复杂性。尾递归版本是线性的。