محاسبه اعداد اول در stream

محاسبه اعداد اول به صورت functional در سکالا به کمک کتابخانه fs2

import fs2._
object Primes {
  def firstNPrimes(n: Int) =
    fs2.Stream.range(2, n + 1).filter(isPrime)

  private def isPrime(n: Int): Boolean =
    n >= 2 && (2 to math.sqrt(n).toInt).forall(n % _ != 0)
}

object Runner {
  def main(args: Array[String]): Unit =
    println(Primes.firstNPrimes(1000000).compile.toList)
}

5 Likes

چه قدر جالب
سعی میکنم کدی که خودم نوشتم با Clojure رو هم بزارم و نظر شما و @lxsameer رو در موردش بدونم.

2 Likes

نسخه بدون fs2

object Primes {
  def firstNPrimes(n: Int) =
    Stream.range(2, n + 1).filter(isPrime)

  private def isPrime(n: Int): Boolean =
    n >= 2 && (2 to math.sqrt(n).toInt).forall(n % _ != 0)
}

object Runner {
  def main(args: Array[String]): Unit ={
    println(Primes.firstNPrimes(1000000).toList)
  }

}
2 Likes

این کدیه که من نوشتم :cold_face: :grimacing:

(defn prime [number & [i]]
  (if i
    (if (not= i (/ (+ number 1) 2))
      (if (not= (rem number i) 0)
        (prime number (+ i 1))
        (println (str number " Not prime")))
      (println (str number " Is prime")))
    (prime number 2)))

در واقع اول چک کردم که آیا i بهش داده شده یا نه؟ اگه داده نشده خودش خودشو با number و 2 صدا میزنه و i که حالا 2 هستش باقی ماندش بر number بررسی میشه اگه 0 بود میگه عدد اول نیست اگه هم صفر نبود دوباره خودش رو با number و i + 1 صدا میزنه
من میخواستم همونجایی که نوشتم Not prime رو پرینت کنه، به جای پرینت کردن nil برگردونه و به جای Is prime هم true

1 Likes

در تفکر functional به جای اینکه در کد بنویسی چطور یک کار انجام بشه , فقط هدف تو بیان میکنی
این فرقه کد imperative با declarative هستش
ابزاری که باهاشون میتونی declarative کد بزنی :
map, flatmap, reduce, filter

نکته آخر در fp سعی میکنی تمامه کد داده pure باشه و در آخر effect داشته باشی مثل print …

5 Likes

http://blog.cleancoder.com/uncle-bob/2020/04/09/ALittleMoreClojure.html