【发布时间】:2013-02-04 18:25:10
【问题描述】:
我对 Haskell(以及一般的函数式编程)非常陌生,我正在尝试一些基本练习来尝试理解该语言。我正在编写一个“朴素”的素数检查器,它将输入下的每个数字除以检查是否有余数。到目前为止,我学到的唯一结构是理解列表和递归函数,所以我仅限于此。这是我正在尝试的:
isprime 1 = False
isprime 2 = True
isprime n = isprimerec n (n-1)
isprimerec _ 1 = False
isprimerec n t = if (n `rem` t) == 0 then False else isprimerec n (n-1)
目的是用户将使用isprime n。然后isprime 将使用isprimerec 来确定该数字是否为素数。这是一种相当迂回的方式,但我对 Haskell 的了解有限,不知道其他方式。
当我尝试这个时会发生以下情况:
isprimerec 10 9
永远运行。我必须使用 Ctrl+C 来阻止它。
isprimerec 10 5
返回 False。 else 部分永远不会被评估,所以函数永远不会调用自己。
我不确定为什么会这样。此外,这是否接近于 Haskell 程序员解决这个问题的方式? (我不是说检查素数,我知道这不是这样做的方法。我只是作为练习这样做)。
【问题讨论】:
-
你可以用
isprime n = isprimerec n (n `div` 2)替换isprime n = isprimerec n (n-1),因为n不能被任何大于n/2的数整除 -
@CarlosLópez-Camey 我正在考虑这样做,但我担心它会返回浮点数而不是整数。那么
div是否只返回整数? -
是的,
div的类型是Integral a => a -> a -> a,而Prelude中Integral只有两个实例:Integer和Int(这个可以用:i Integral查在 ghci 中)