[英]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 = 3
且n/2 = 1
的情況下進行這種檢查,它將停止而不會到達t = 0
。
一些好處:
(t <= 2)
與(t == 2)
的檢查一樣有效 (n.toDouble/2).ceil.toInt
是非常低效的方法。 寫(n+1)/2
而不是進行2轉換(翻倍並返回int)更容易,更快捷。 n
( (n+1)/2
進行過多檢查,對於n/2
與ceil(n/2)
之間存在差異的奇數n
永遠不是最小的除數)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.