以F#连接字符串的次数

时间:2016-10-28 07:13:37

标签: f# concat

我正在尝试将字符串连接一定次数,但我觉得我已经通过使用更高阶函数欺骗了一点(或者至少没有真正理解它应该如何完成):

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

repeat "a" 10

显然给了我“aaaaaaaaaa”,但是如果没有高阶函数我怎么能这样做呢?我觉得这是一个非常简单的问题,但我似乎无法绕过它,F#语法或思维方式对我来说仍然很麻烦。

2 个答案:

答案 0 :(得分:3)

如果您只想要一个递归解决方案,那该怎么样?

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

repeat "a" 10

或带有if-expression的更“经典”风格:

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

repeat "a" 10

答案 1 :(得分:2)

这里有一种使用list comprehension和fold的方法,这是递归函数:

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

Tail Recursive version

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 StackOverflowException.
[for i in 1..100000 -> "oijdfsaoijdoyasjd"] |> List.fold (+) "" // no stack overflow
repeat2 "oijdfsaoijdoyasjd"  100000 // no stack overflow

但是为大量的gen2 GC准备了几分钟。运行时