Конкатенация строк в F# количество раз

Я пытаюсь объединить строку с определенным количеством раз, но мне кажется, что я немного обманул (или, по крайней мере, на самом деле не понял, как это должно быть сделано), используя функцию более высокого порядка:

let repeat s n = 
String.replicate n s |> printfn "%s"

repeat "a" 10

Очевидно, дает мне "aaaaaaaaaa", но как я мог сделать это без функции более высокого порядка? Я чувствую, что это очень простая проблема, но я не могу обойти ее, синтаксис F# или способ мышления все еще проблематичен для меня.

2 ответа

Решение

Если вы просто хотите рекурсивное решение, как насчет этого?

let rec repeat s n =
    match n with
    | _ when n <= 0 -> ""
    | _ -> s + (repeat s (n-1))

repeat "a" 10

или в более "классическом" стиле с выражением if:

let rec repeat s n =
    if n <= 0 then
        ""
    else
        s + (repeat s (n-1))

repeat "a" 10

И вот один из способов использования списочного понимания и свертывания, который является функцией go для рекурсии:

[for i in 1..10 -> "a"] |> List.fold (+) ""

Хвост Рекурсивная версия

let repeat2 s n =
    let rec loop acc n =
        match n with 
        | _ when n > 0 -> loop (acc + s) (n - 1)
        | _ -> acc
    loop "" n

repeat "oijdfsaoijdoyasjd" 100000 // Process is terminated due to StackruException.
[for i in 1..100000 -> "oijdfsaoijdoyasjd"] |> List.fold (+) "" // no stack overflow
repeat2 "oijdfsaoijdoyasjd"  100000 // no stack overflow

Но подготовлено для огромного количества gen2 GC и несколько минут. времени выполнения.

Другие вопросы по тегам