昨天我开始利用空闲时间研究 F#。我想我会从打印出所有不超过 100 的质数的标准问题开始。这是我想出的...
#light
open System
let mutable divisable = false
let mutable j = 2
for i = 2 to 100 do
j <- 2
while j < i do
if i % j = 0 then divisable <- true
j <- j + 1
if divisable = false then Console.WriteLine(i)
divisable <- false
问题是我觉得我是从 C/C# 的角度来处理这个问题的,并没有接受真正的函数式语言方面。
我想知道其他人能想到什么 - 以及是否有人有任何提示/指示/建议。感觉F#好的内容目前在网上很难找到,我最后接触的函数式语言是HOPE大约5年前在大学。
最佳答案
这是 Sieve of Eratosthenes 的简单实现在 F# 中:
let rec sieve = function
| (p::xs) -> p :: sieve [ for x in xs do if x % p > 0 then yield x ]
| [] -> []
let primes = sieve [2..50]
printfn "%A" primes // [2; 3; 5; 7; 11; 13; 17; 19; 23; 29; 31; 37; 41; 43; 47]
此实现不适用于非常大的列表,但它说明了函数式解决方案的优雅之处。
关于algorithm - 学习 F# - 打印质数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1097411/