我产生随机数的列表:生成列表导致堆栈溢出
let gen n =
let rec pom l n =
match n with
| 0 -> l
| _ ->
let el = Random.int 20000000
in pom (el::l) (n-1)
in
pom [] n
let lo = gen 1000000
我得到的是
Fatal error: exception Stack_overflow
为什么?我使用的是尾递归(和累加器)
编辑:
你说的没错,在堆栈溢出在这两类。
但是,如果我的代码有一百亿行,那么用这种方式调试它会很痛苦。我想在这里使用ocamldebug,就像学习经验一样。我这样跑ocamldebug:
(ocd) r
Loading program... done.
Time: 88089944
Program end.
Uncaught exception: Stack_overflow
(ocd) b
Time: 88089943 - pc: 52 - module Pervasives
214 | hd :: tl -> <|b|>hd :: (tl @ l2)
(ocd) bt
#0 Pc: 52 Pervasives char 7700
#1 Pc: 64 Pervasives char 7715
#2 Pc: 64 Pervasives char 7715
#3 Pc: 64 Pervasives char 7715
#4 Pc: 64 Pervasives char 7715
#5 Pc: 64 Pervasives char 7715
#6 Pc: 64 Pervasives char 7715
// and so it goes on forever
这不告诉我为什么我的程序崩溃了。我怎么能用ocamldebug进行调试?
(元:我应该张贴它一个单独的线程,或者我应该留在这里)
您正在使用哪种配置? (在T40,1GB,Ubuntu 12.0x -utop版本1.18.1(使用OCaml版本4.02.1);没有问题,甚至有10多个,让lo = gen 10000000 ;;)。 –
华硕R556LB,8G内存,薄荷17.2肉桂,OCaml 4.01 – marmistrz
我有堆栈溢出不在gen,但在quick_sort。 –