验证OCaml函数是尾递归 [英] Verify that an OCaml function is tail-recursive
本文介绍了验证OCaml函数是尾递归的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何判断OCaml是否识别特定函数为尾递归?特别是,我想知道OCaml编译器是否识别短路运算符和尾递归
How can I tell if OCaml recognizes a particular function as tail-recursive? In particular, I want to find out if the OCaml compiler recognizes Short-circuited operators and tail recursion
由于Jeffrey的回答如下,我尝试使用简单的函数
Thanks to Jeffrey's answer below, I tried this with the simple function
let rec check_all l =
match l with
| [] -> true
| hd :: tl ->
hd && check_all tl
而且它的确优化为:
camlTest__check_all_1008:
.cfi_startproc
.L102:
cmpl $1, %eax
je .L100
movl (%eax), %ebx
cmpl $1, %ebx
je .L101
movl 4(%eax), %eax
jmp .L102
.align 16
.L101:
movl $1, %eax
ret
推荐答案
从OCaml 4.03开始,尽管在更改文件,您可以在函数应用程序中使用 @tailcall
,如果不是这样,编译器将发出警告。
Starting from OCaml 4.03, and despite the typo in the Changes file, you can use @tailcall
in a function application and the compiler will warn if it is not the case.
(f [@tailcall])xy
警告如果fxy
不是尾调用
示例:
$ cat tailrec.ml
let rec f a x = if x <= 1 then a else (f [@tailcall]) (a * x) (x - 1)
let rec g x = if x <= 1 then 1 else x * (g [@tailcall]) (x - 1)
$ ocaml tailrec.ml
File "tailrec.ml", line 3, characters 40-63:
Warning 51: expected tailcall
这篇关于验证OCaml函数是尾递归的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文