【发布时间】:2018-08-02 15:16:55
【问题描述】:
在 Doets 等人的 The Haskell Road to Logic, Math and Programming 一书中,在第 103 页,给出了
prime :: Integer -> Bool
prime n | n < 1 = error "not a positive integer"
| n == 1 = False
| otherwise = ldp n == n where
ldp = ldpf primes
ldpf (p:ps) m | rem m p == 0 = p
| p^2 > m = m
| otherwise = ldpf ps m
primes = 2 : filter prime [3..]
但是,这个函数的逻辑不是循环的吗?我的意思是我认为我对递归函数很满意,但我不认为这是一个递归函数。即使是这样,我也无法理解它的逻辑,所以我的问题是如何阅读这样一个函数的逻辑。
编辑:
我困惑的原因是prime函数使用了列表primes,但是要生成那个列表,我们也使用了函数prime,所以看起来有一个循环逻辑,或者我只是不理解带有惰性求值的递归函数。
【问题讨论】:
-
请将代码发布为文本而不是屏幕截图。它使阅读、本地测试和搜索变得更加容易。
-
哪部分让你觉得逻辑是循环的
-
@Carl 查看我的编辑。
-
Haskell 是懒惰的;跟踪对
prime 2的调用,并注意您在对ldpf的调用中从未实际使用过ps。这意味着对prime的递归调用在您真正需要之前不会真正进行。 -
Haskell 就是这么神奇。这是一个太复杂的函数,无法考虑,请先尝试了解这个斐波那契数列实现:
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)。请注意,它会生成一个 infinite 列表。
标签: haskell recursion primes lazy-evaluation