OCaml:如何执行使用尾部递归的程序?

OCaml:如何执行使用尾部递归的程序?,ocaml,tail-recursion,Ocaml,Tail Recursion,我正在使用尾部递归编写一个函数,但我不知道如何执行。 通常,我使用ocaml QuicksortTail.ml Qsort,但当我对包含70000个元素的列表执行时,会显示错误: 致命错误:异常堆栈\u溢出“ 我的oCaml是4.01。@RichouHunter在我看来是正确的 为了完整起见,下面是一个顶级会话,显示您的代码工作正常: $ rlwrap ocaml OCaml version 4.03.0 # let rec trev l r = match l wit

我正在使用尾部递归编写一个函数,但我不知道如何执行。 通常,我使用ocaml QuicksortTail.ml Qsort,但当我对包含70000个元素的列表执行时,会显示错误:

致命错误:异常堆栈\u溢出“


我的oCaml是4.01。

@RichouHunter在我看来是正确的

为了完整起见,下面是一个顶级会话,显示您的代码工作正常:

$ rlwrap ocaml
        OCaml version 4.03.0

# let rec trev l r =
    match l with
        | [] -> r
        | x::xs -> trev xs (x::r);;
val trev : 'a list -> 'a list -> 'a list = <fun>
# let rev l = trev l [];;
val rev : 'a list -> 'a list = <fun>

# let rec range accum m n = if m > n then accum else range (n :: accum) m (n - 1);;
val range : int list -> int -> int -> int list = <fun>

# let big = range [] 1 70000;;
val big : int list =
  [1; 2; 3; ...]
# let revbig = rev big;;
val revbig : int list =
  [70000; 69999; 69998; ...]
$rlwrap-ocaml
OCaml版本4.03.0
#让我们再看一遍=
匹配
|[]->r
|x::xs->trevxs(x::r);;
val trev:'列表->'列表->'列表=
#设rev l=trev l[];;
val rev:'列表->'列表=
#设rec range accum m n=如果m>n,则accum else range(n::accum)m(n-1);;
val范围:整数列表->整数->整数->整数列表=
#设大=范围[]1 70000;;
val big:int列表=
[1; 2; 3; ...]
#让revbig=revbig;;
val revbig:int列表=
[70000; 69999; 69998; ...]

正如@RichouHunter所说,运行尾部递归代码没有什么特别的事情。

尾部递归是一种特殊的递归,其中递归调用是函数中的最后一个调用。它不是一种执行模式,因此您不需要向解释器或编译器传递任何特定的标志来启用或禁用尾部递归。它是是程序的静态属性

当调用处于尾部位置时,(它是否为递归调用并不重要),OCaml编译器将发出一个不使用堆栈空间的代码。解释器也是如此。调用不会占用堆栈空间,因此您可以执行几乎无限次的尾部调用,而不会导致堆栈溢出


由于堆栈溢出,这意味着有些东西不是尾部递归的。您刚才显示的代码很好,并且完全是尾部递归的,因此实际上是其他一些代码引发了异常。不是您的
rev

您的程序在我的机器上运行良好。请注意,您不必做任何特殊的操作来使用它在所有递归函数中,它是编译器在适用时自动完成的优化。是的,它是有效的,但当我执行一个70000的列表时,错误就消失了displayed@JulianaSouza生成长列表的代码可能不是尾部递归的。您能告诉我们如何生成70000个元素的列表吗?正如Anton所建议的,这可能是错误发生的地方。@RichouHunter,问题就在这里!谢谢!
$ rlwrap ocaml
        OCaml version 4.03.0

# let rec trev l r =
    match l with
        | [] -> r
        | x::xs -> trev xs (x::r);;
val trev : 'a list -> 'a list -> 'a list = <fun>
# let rev l = trev l [];;
val rev : 'a list -> 'a list = <fun>

# let rec range accum m n = if m > n then accum else range (n :: accum) m (n - 1);;
val range : int list -> int -> int -> int list = <fun>

# let big = range [] 1 70000;;
val big : int list =
  [1; 2; 3; ...]
# let revbig = rev big;;
val revbig : int list =
  [70000; 69999; 69998; ...]