簡體   English   中英

使用尾部遞歸在Scala中實現isPrime

[英]Implementing isPrime in Scala using tail recursion

我正在做一個練習,要求我使用尾部遞歸在scala中實現isPrime。 我確實有一個實現,但是在生成正確的基本案例時遇到了問題。

所以我的算法涉及檢查2到N / 2之間的所有數字,因為N / 2是N的最大因子。

def isPrime(n: Int): Boolean = {
    def isPrimeUntil(t: Int): Boolean = {
        if(t == 2) true
        else n % t != 0 && isPrimeUntil(t - 1)
    }

    isPrimeUntil(n/2)
}

因此,基本上,如果我想檢查15是否為質數,我將檢查從7到2的所有數字。

這是我的蹤跡:

isPrimeUntil(7) -> true && isPrimeUntil(6) -> true && isPrimeUntil(5) -> false && isPrimeUntil(4)

由於存在短路評估,因此該函數在此時返回false。

但是,對於檢查3是否為質數的基本情況,我的實現失敗。

3並不是您唯一的問題。 它還返回4 true 。您的基本情況應該是1 ,而不是2

   def isPrimeUntil(t: Int): Boolean = t == 1 || t > 1 && n%t != 0 && isPrimeUntil(t-1)

盡管Krzystof正確地指出了問題的根源是整數除法,但我不喜歡他的解決方案。 我相信正確的解決方法是將測試更改為

 if(t <= 2) true

n = 3n/2 = 1的情況下進行這種檢查,它將停止而不會到達t = 0

一些好處:

  • 幾乎所有現代硬件上的修改后的檢查(t <= 2)(t == 2)的檢查一樣有效
  • 恕我直言,它更好地傳達了邏輯
  • 這樣寫(n.toDouble/2).ceil.toInt是非常低效的方法。 (n+1)/2而不是進行2轉換(翻倍並返回int)更容易,更快捷。
  • 它不需要對所有奇數n(n+1)/2進行過多檢查,對於n/2ceil(n/2)之間存在差異的奇數n永遠不是最小的除數)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM