Functional programming CPS合并排序导致堆栈溢出
由于非尾部递归导致堆栈溢出,所以我使用continuations使大列表的排序变得可行 我以这种方式实现了排序(您可以在这里看到整个代码:) 然而,在指示的行中,我得到了堆栈溢出。 我做错了什么?Functional programming CPS合并排序导致堆栈溢出,functional-programming,ocaml,Functional Programming,Ocaml,由于非尾部递归导致堆栈溢出,所以我使用continuations使大列表的排序变得可行 我以这种方式实现了排序(您可以在这里看到整个代码:) 然而,在指示的行中,我得到了堆栈溢出。 我做错了什么?(@)OCaml的标准库不是尾部递归的merge函数使用了(@),这就是堆栈溢出的原因 list.mli说: val append : 'a list -> 'a list -> 'a list (** Catenate two lists. Same function as the in
(@)
OCaml的标准库不是尾部递归的<代码中的code>merge函数使用了(@)
,这就是堆栈溢出的原因
list.mli
说:
val append : 'a list -> 'a list -> 'a list
(** Catenate two lists. Same function as the infix operator [@].
Not tail-recursive (length of the first argument). The [@]
operator is not tail-recursive either. *)
但不幸的是,这一事实并未写入pervisives.mli中,其中(@)
真正声明:
val ( @ ) : 'a list -> 'a list -> 'a list
(** List concatenation. *)
这不好:-(我已经在OCaml开发页面上提交了一个问题
我将(@)
重新定义为funxy->rev_append(revx)y
,然后您的代码运行时没有堆栈溢出。更优雅的是,您可以用rev_append a l
替换(reva)@l
这样的代码
在下一版本的OCaml中,mli将被注释为“非尾部递归”。OCaml标准库的(@)
不是尾部递归。代码中的merge
函数使用(@)
,这是堆栈溢出的原因
list.mli
说:
val append : 'a list -> 'a list -> 'a list
(** Catenate two lists. Same function as the infix operator [@].
Not tail-recursive (length of the first argument). The [@]
operator is not tail-recursive either. *)
但不幸的是,这一事实并未写入pervisives.mli中,其中(@)
真正声明:
val ( @ ) : 'a list -> 'a list -> 'a list
(** List concatenation. *)
这不好:-(我已经在OCaml开发页面上提交了一个问题
我将(@)
重新定义为funxy->rev_append(revx)y
,然后您的代码运行时没有堆栈溢出。更优雅的是,您可以用rev_append a l
替换(reva)@l
这样的代码
pervisives.mli
中的p.S.(@)
将被注释为“非尾部递归”在OCaml的下一个版本中。快速排序过程是一个旧函数,在我必须重写的任何地方都没有使用。问题在于合并排序。我不明白。在您的代码中,merge\u sort
使用merge
,而merge
使用(@)
哪个是NTR。你试过我的修复方法吗?你是对的,我忘了我在merge中有附加项。谢谢!快速排序过程是一个旧函数,在我必须重写的任何地方都没有使用。问题是merge\u sort。我不明白。在你的代码中,merge\u sort
使用merge
,而merge
使用(@)
哪个是NTR。你试过我的修复方法吗?你是对的,我忘了我在合并中有附加项。谢谢!