在 F# 中连接字符串的次数
Concatenating strings in F# number of times
我正在尝试将一个字符串连接一定次数,但我觉得我通过使用高阶函数作弊了一点(或者至少实际上没有理解应该如何完成)功能:
let repeat s n =
String.replicate n s |> printfn "%s"
repeat "a" 10
显然给了我 "aaaaaaaaaa",但如果没有高阶函数,我怎么能这样做呢?我觉得这是一个非常简单的问题,但我似乎无法解决它,F#语法或思维方式对我来说仍然很麻烦。
如果你只是想要一个递归的解决方案,这个怎么样?
let rec repeat s n =
match n with
| _ when n <= 0 -> ""
| _ -> s + (repeat s (n-1))
repeat "a" 10
或更 "classic" 带有 if 表达式的样式:
let rec repeat s n =
if n <= 0 then
""
else
s + (repeat s (n-1))
repeat "a" 10
这是使用列表理解和折叠的一种方法,这是递归的函数:
[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 WhosebugException.
[for i in 1..100000 -> "oijdfsaoijdoyasjd"] |> List.fold (+) "" // no stack overflow
repeat2 "oijdfsaoijdoyasjd" 100000 // no stack overflow
但是为大量的 gen2 GC 和几分钟做好了准备。运行时间。
我正在尝试将一个字符串连接一定次数,但我觉得我通过使用高阶函数作弊了一点(或者至少实际上没有理解应该如何完成)功能:
let repeat s n =
String.replicate n s |> printfn "%s"
repeat "a" 10
显然给了我 "aaaaaaaaaa",但如果没有高阶函数,我怎么能这样做呢?我觉得这是一个非常简单的问题,但我似乎无法解决它,F#语法或思维方式对我来说仍然很麻烦。
如果你只是想要一个递归的解决方案,这个怎么样?
let rec repeat s n =
match n with
| _ when n <= 0 -> ""
| _ -> s + (repeat s (n-1))
repeat "a" 10
或更 "classic" 带有 if 表达式的样式:
let rec repeat s n =
if n <= 0 then
""
else
s + (repeat s (n-1))
repeat "a" 10
这是使用列表理解和折叠的一种方法,这是递归的函数:
[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 WhosebugException.
[for i in 1..100000 -> "oijdfsaoijdoyasjd"] |> List.fold (+) "" // no stack overflow
repeat2 "oijdfsaoijdoyasjd" 100000 // no stack overflow
但是为大量的 gen2 GC 和几分钟做好了准备。运行时间。