在递归函数中重新排序匹配子句

cha*_*Lgn 5 algorithm optimization recursion ocaml

我在学校有一些Ocaml课程,为了练习,我们必须编写函数长度.

我的老师向我们展示了Xavier Leroy如何编写他的功能:

let rec length_aux len = function
   [] -> len
 | a::l -> length_aux (len + 1) l

let length l = length_aux 0 l
Run Code Online (Sandbox Code Playgroud)

当我的老师向我们解释他为什么这样做长度函数时,他说他不知道为什么Xavier Leroy没有写:

let rec length_aux len = function
   a::l -> length_aux (len + 1) l
 | [] -> len

let length l = length_aux 0 l
Run Code Online (Sandbox Code Playgroud)

...为了使它更快(因为大多数情况下列表是非空的).

所以如果有人知道为什么第二个并不比第一个好,你能回答我吗?

谢谢.

Éti*_*lon 5

对于OCaml,这是相同的功能.模式匹配将被编译为测试列表是否为空,并跳转到一侧或另一侧.

C中的类似代码将在switch语句中重新排序.

  • 它不是"同时"而只是"优化".因为模式匹配比命令式if-else分支更具限制性和"更丰富",特别是因为简单模式不能产生副作用,因此执行顺序无关紧要,因此可以对其进行大量分析和优化. (2认同)