С учетом алфавита ["a"; "b"; "c"]
Я хочу выгрузить все последовательности длиной 25 в файл.(Буквы могут повторяться в последовательности; это не перестановка.) Проблема в том, что я получаю Stack overflow during evaluation (looping recursion?)
, когда пытаюсь использовать следующий код:
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. *)
Есть ли лучший способ сделать это?Я думал о том, чтобы сначала сгенерировать весь список, а затем вывести весь список в файл, но нужно ли многократно генерировать списки партиалов, а затем создавать дамп?Поможет ли что-нибудь ленивое?
Почему именно происходит переполнение стека?AFAICT, моя generateWords
функция является рекурсивной.Неужели проблема в том, что генерируемый мной список words
становится слишком большим, чтобы поместиться в память?