给定字母表["a"; "b"; "c"]
我想将所有长度为25的序列转储到文件。 (字母可以重复的序列;它不是一个置换)的问题是,我得到一个Stack overflow during evaluation (looping recursion?)
当我尝试使用下面的代码:在ocaml中生成大量字母时堆栈溢出
let addAlphabetToPrefix alphabet prefix =
List.map (function letter -> (prefix^letter)) alphabet;;
let rec generateWords alphabet counter words =
if counter > 25 then
words
else
let newWords = List.flatten(List.map (function word -> addAlphabetToPrefix alphabet word) words) in
generateWords alphabet (counter + 1) newWords;;
generateWords ["a"; "b"; "c"] 0 [""];; (* Produces a stack overflow. *)
是否有这样做的更好的办法?我正在考虑首先生成整个列表,然后将整个列表转储到一个文件,但是我是否必须重复生成partials列表然后转储?会做一些懒惰的帮助?
为什么发生堆栈溢出? AFAICT,我的generateWords
函数是尾递归的。问题是我生成的words
列表变得太大而不适合内存?
ocaml优化尾递归吗? – 2011-03-30 23:38:17
@Moron:当然是的! – 2011-03-30 23:48:07
@Jeff:有趣!真的,我不知道ocaml是关于什么的。就这一点而言,我所知道的语言似乎并没有试图优化尾递归:-) – 2011-03-30 23:51:11