我正在尝试计算与 Haskell 输入数字后的下一个最接近的素数,我已经编写了 2 个函数isPrime
和nextPrime
这是我的代码:
isPrime :: Int -> Bool
isPrime x | x < 2 = False
| otherwise = prime (2:[3,4..(x-1)])
where
prime (y:z)
| x < y ^ 2 = True
| x `mod` y == 0 = False
| otherwise = prime z
nextPrime :: Int -> Int
nextPrime n | isPrime n == True = n
| otherwise = nextPrime n
where
n = n + 1
我遇到的问题是我在运行时收到此错误:* 异常:"<<"循环">>"
不知道怎么了,是无限循环吗?
您无法更改 Haskell 中变量的值。这意味着您无法执行
n = n + 1
因为这会改变 n
的值。在 Haskell 中,n
是一个名称,它始终引用使用它的函数中的相同值。如果n
以3
开头,n
将始终3
。你可以做到,
next = n + 1
然后也改变
| otherwise = nextPrime n
到
| otherwise = nextPrime next
这不会改变任何变量的值,而是使用新值创建一个新变量——这是你在 Haskell 中经常做的事情!
只需将nextPrime
的定义更改为
nextPrime :: Int -> Int
nextPrime n | isPrime n = n -- don't need to compare to True here
| otherwise = nextPrime (n+1)
当你尝试定义n = n + 1
时,你会生成一个无限回归,因为运行时会尝试将其扩展为
n = n + 1
= (n + 1) + 1
= ((n + 1) + 1) + 1
= ...
幸运的是,编译器能够检测到这种无限回归并警告您!