algorithm - 学习 F# - 打印质数

标签 algorithm f# primes

昨天我开始利用空闲时间研究 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/

相关文章:

c# - 如何快速定位图片中的空白(例如白色)

entity-framework - 将 Automapper 与 F# 实体类型提供程序结合使用

parsing - 如何解析 FParsec 中的同类列表?

string - 压缩特里实现?

ruby - 按相似性对字符串进行分组

F# - 联合案例名称中的句点

Java数据类型问题

Haskell 类型错误

c++ - isPrime 函数的改进

algorithm - 如何在恒定时间内从稀疏表中删除行/列?