Конкатенация строк в 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 и несколько минут. времени выполнения.