Haskell 递归函数,用于查找数字是否为素数

Haskell 递归函数,用于查找数字是否为素数,haskell,primes,Haskell,Primes,我需要实现一个递归函数,如果数字是素数,则返回1,否则返回0。作业问题说我不能使用“%”mod。Haskell应该是这样的。。。我不确定 isprime x = prime(x sqrt(x)) prime x i = | i==1 = 1 | mod(x i)==0 = 0 | otherwise = prime(x i-1) mod num div | num<div = n | otherwise = mod

我需要实现一个递归函数,如果数字是素数,则返回1,否则返回0。作业问题说我不能使用“%”mod。Haskell应该是这样的。。。我不确定

isprime x = prime(x sqrt(x))

prime x i = | i==1 = 1
            | mod(x i)==0 = 0
            | otherwise = prime(x i-1)

mod num div | num<div = n
            | otherwise = mod(num-div div)
算法将返回以下内容:

Prime numbers between 0 and 31 
0, 1, 2, 3, 4, 6, 8, 12, 14, 18, 20, 24, 30,
Program ended with exit code: 0

我不知道哈斯克尔,我也不想给你答案,但我可以提供一种方法

如果检查从2到sqrt(n)的所有数字,并且没有一个是n的因子,那么n是素数

因此,使用以下伪代码的函数调用可能会起作用:

def isPrime(n):
   return isPrimeHelper(n,sqrt(n))

def isPrimeHelper(n,counter):
   if counter == 1 return True
   if n % counter == 0 return False
   else return isPrime(n,counter-1)

我不知道哈斯克尔,我也不想给你答案,但我可以提供一种方法

如果检查从2到sqrt(n)的所有数字,并且没有一个是n的因子,那么n是素数

因此,使用以下伪代码的函数调用可能会起作用:

def isPrime(n):
   return isPrimeHelper(n,sqrt(n))

def isPrimeHelper(n,counter):
   if counter == 1 return True
   if n % counter == 0 return False
   else return isPrime(n,counter-1)

你的基本想法很好。在Haskell中,您可以使用列表而不是迭代。以下是您需要了解的内容:

  • 安装并播放ghci
  • 如果您不知道如何在Haskell中做任何事情,请访问并学习Haskell,这对您非常有益
  • 列出理解。当你这样做的时候,你需要学习什么
    [n^2 | n Integer
    Integer->Float
    不要使用
    不安全的力量
    -这是不安全的,会严重破坏东西
  • 使用hoogle查找
    [Bool]->Bool
    。我为什么建议这样做?
    [Bool]
    会有什么帮助,你会怎么做?(再次修改列表理解。)
  • 一旦你发现了更多并尝试了一下,再来问一些更具体的问题
  • 一定要早点开始作业,尤其是如果你缺课的话

  • 你布置这个家庭作业不是因为系里一直在想办法决定102659473841923461是否是最好的,而是因为他们想让你学一些哈斯克尔语。不要试图在不学习的情况下解决问题——这只会让下一个作业更难!(这就是为什么我抵制住了翻译这个句子的诱惑。)Haskell的另一个答案是“伪代码”。

    您的基本想法很好。在Haskell中,您可以使用列表而不是迭代。以下是您需要了解的内容:

  • 安装并播放ghci
  • 如果您不知道如何在Haskell中做任何事情,请访问并学习Haskell,这对您非常有益
  • 列出理解。当你这样做的时候,要精简
    [n^2 | n Integer
    Integer->Float
    不要使用
    不安全的强制力
    -这是不安全的,会严重破坏事物
  • 使用hoogle查找
    [Bool]->Bool
    。我为什么建议这样做?
    [Bool]
    会有什么帮助,你会怎么做?(再次修改列表理解。)
  • 一旦你发现了更多并尝试了一下,再来问一些更具体的问题
  • 一定要早点开始作业,尤其是如果你缺课的话
  • 你布置这个家庭作业并不是因为系里一直在想办法决定102659473841923461是否是最好的,而是因为他们想让你学一些哈斯凯尔语。不要试图在不学习的情况下解决问题——这只会让下一个作业更难!(这就是为什么我抵制住了翻译的诱惑)“伪代码”在哈斯克尔的另一个答案中。)

    (显然,有一项关于家庭作业的新政策,也就是说,现在开始)

    基本上,您的代码几乎是正确的(1不是质数),没有一些语法问题

    isprime x = prime x (floor $ sqrt $ fromIntegral x)   where
      prime x i | i==1 && x > 1  = 1
                | x == i*div x i = 0
                | otherwise      = prime x (i-1)
    
    -- mod x i = x - i*div x i
    -- mod x i == 0 = x == i*div x i
    
    fromIntegral
    只是一个适配器,它允许我们使用
    Integral
    值作为
    sqrt
    的参数,而
    sqrt
    需要一个
    浮动的
    参数。在GHCi提示符下尝试使用
    :i sqrt
    :i Integral
    等(还可以阅读谷歌上的一些文档)

    但在算法上还有改进的地方。首先,最好从另一个方向尝试除数,从2到数字的
    sqrt
    ,因为任何给定的数字都可能有一个更小的因子,而不是一个更大的因子。其次,在尝试2之后,没有必要尝试任何其他偶数可除数,这给我们

    isprime x | x == 2          = 1
              | x < 2 || even x = 0
              | otherwise       = go 3
      where
        r = floor $ sqrt $ fromIntegral x
        go i | i > r          = 1
             | x == i*div x i = 0        -- really, | rem x i == 0 = 0
             | otherwise      = go (i+2)
    
    还有一些冗余:在我们测试了3之后,就不需要再测试它的倍数了(就像我们测试2和偶数一样)。我们只需要测试基本因子:

    isPrime x=x>1&&
    [rem x d/=0 | d(显然,有一项关于家庭作业的新政策,也就是说,就这样)

    基本上,您的代码几乎是正确的(1不是质数),没有一些语法问题

    isprime x = prime x (floor $ sqrt $ fromIntegral x)   where
      prime x i | i==1 && x > 1  = 1
                | x == i*div x i = 0
                | otherwise      = prime x (i-1)
    
    -- mod x i = x - i*div x i
    -- mod x i == 0 = x == i*div x i
    
    fromIntegral
    只是一个适配器,它允许我们使用
    Integral
    值作为
    sqrt
    的参数,而
    sqrt
    需要一个
    浮动的
    参数。在GHCi提示符下尝试使用
    :i sqrt
    :i Integral
    等(还可以阅读谷歌上的一些文档)

    但在算法上还有改进的地方。首先,最好从另一个方向尝试除数,从2到数字的
    sqrt
    ,因为任何给定的数字都可能有一个更小的因子,而不是一个更大的因子。其次,在尝试2之后,没有必要尝试任何其他偶数可除数,这给我们

    isprime x | x == 2          = 1
              | x < 2 || even x = 0
              | otherwise       = go 3
      where
        r = floor $ sqrt $ fromIntegral x
        go i | i > r          = 1
             | x == i*div x i = 0        -- really, | rem x i == 0 = 0
             | otherwise      = go (i+2)
    
    还有一些冗余:在我们测试了3之后,就不需要再测试它的倍数了(就像我们测试2和偶数一样)。我们只需要测试基本因子:

    isPrime x=x>1&&
    
    [rem x d/=0 | d在这里搜索
    [haskell]test prime
    ,你会发现你不是第一个尝试这个的人-偷一些想法,决定哪一个是最好的。我甚至不能开始,不知道递归是如何与haskell一起工作的,我只知道如何用C
    中的普通循环为(int i=2;i@Vitim.us这不是递归调用,而是一种迭代方法。“问题是我不能使用“%”mod“请告诉我”