给定一个字母表["a"; "b"; "c"]
,我想将长度为25的所有序列转储到文件中。(序列中的字母可以重复,它不是排列。)问题是,当我尝试使用以下代码时,会出现评估期间的堆栈溢出(循环递归?)
:
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. *)
有没有更好的方法来做这个?我在考虑先生成整个列表,然后将整个列表转储到文件中,但是我是否需要重复生成部分列表然后转储?将某些内容变为lazy是否有帮助?
为什么会发生堆栈溢出?据我所知,我的generateWords
函数是尾递归的。问题在于我正在生成的words
列表太大而无法放入内存吗?
#trace
来追踪generateWords
函数,以便更好地理解这个问题。我认为问题在于你正在生成一个巨大的列表(潜在的26^25个单词),因此自然会耗尽内存。再加上你是递归生成的,会产生许多中间结果。 - Jeff Mercado