【发布时间】:2016-06-19 17:48:23
【问题描述】:
是否有任何优雅的函数式方法可以从控制台输入读取 N 个字符串? F# for fun and profit 建议避免使用 for 循环,所以我使用了递归,但它看起来又丑又长。
代码说明:我需要从控制台读取几个字符串(确切的数字在控制台输入的第一行中指定),将它们连接起来并转换为整数数组。
let rec recReadline n =
match n with
| 0 -> ""
| _ -> let x = n - 1
" " + Console.ReadLine() + recReadline x
let getArrayOfIntFromConsole =
let x = Console.ReadLine() |> int |> recReadline
let trimmedString = x.Trim()
let numArray = trimmedString.Split ' ' |> Array.map(int)
numArray
我正在学习 f#,对于菜鸟问题抱歉。
更新1
感谢您的回复!这是来自黑客级别的任务:https://www.hackerrank.com/challenges/diagonal-difference。起初我决定将输入和算法逻辑分开,并创建了这篇文章。我对问题的上下文描述不够清楚,建议使用 Array.Init。它对我没有帮助,因为输入字符串由许多用空格分隔的整数组成。我用 Array.Init 将一个回复标记为正确答案,因为它是我糟糕的问题的正确答案。
我决定在一个函数中读取控制台和计算,它对我来说没问题。 我的最终代码:
open System
let rec recDiagDif recCounter primaryDiagSum secondDiagSum =
match recCounter with
| 0 -> primaryDiagSum - secondDiagSum |> abs
| _ -> let arrayInt = Console.ReadLine().Split ' ' |> Array.map(int)
recDiagDif (recCounter-1)
(primaryDiagSum + arrayInt.[arrayInt.Length - recCounter])
(secondDiagSum + arrayInt.[recCounter-1])
[<EntryPoint>]
let main argv =
let matrixSize = Console.ReadLine() |> int
printf "%A" (recDiagDif matrixSize 0 0)
0
如果您知道如何改进代码,请随时发表评论。
【问题讨论】:
-
不,这是来自 hr 的任务:hackerrank.com/challenges/diagonal-difference
-
您可能希望将您的
Console.ReadLine() |> int包装在try...with |> System.FormatException -> printfn "Invalid number!"中以捕获错误输入。
标签: f#