Есть несколько способов сделать это с буфером или форматом с правильной сложностью.
Во-первых, более императивная версия, вероятно, с буфером
let string_repeat_n_time s n =
let b = Buffer.create (String.length s * n) in
for i = 1 to n do
Buffer.add_string b s
done;
Buffer.contents b
Буфер сделан для эффективного повторного добавления, поэтому они являются правильной структурой данных.
Более функциональной версией было бы использование рекурсии с Format.fprintf
(Format
по сути улучшенная версия Printf
)
let string_n_times s n =
let rec repeat ppf n =
if n = 0 then Format.fprintf ppf "%!"
else
Format.fprintf ppf "%s%a" s repeat (n-1) in
Format.asprintf "%a" repeat n ;;
Этот код использует Buffer
под капотом, поэтому сложность та же, что и раньше. Если мы сделаем буфер явным, у нас может быть императивный код, использующий принтер формата
let string_n_times s n =
let b = Buffer.create (String.length s * n) in
let ppf = Format.formatter_of_buffer b in
for i = 1 to n do
Format.fprintf ppf "%s" s
done;
Format.fprintf ppf "%!" (* flush *);
Buffer.contents b
, который может быть полезен, если мы добавляем в буфер что-то более сложное, чем строка.