有人可以给我一个关于以下函数如何递归工作的解释。我可以理解更简单的递归示例,但我不明白(smooth n (- k 1))
如何在这里的or语句中给出所需的值。
(define (divides a b)
(= (modulo b a) 0))
(define (smooth n k)
(and (>= k 2)
(or (divides k n)
(smooth n (- k 1)))))
(define (isprime p)
(if (< p 2)
#f
(not (smooth p (floor (sqrt p))))))
我编写了一个isprime
函数,它不使用1
作为素数,但我仍然不太明白上述函数如何工作/它如何与这个例子一起工作。
答案 0 :(得分:4)
如果我们按以下方式重写smooth
也许会更容易理解 - 它是一个完全等效的形式,但使用cond
代替and
,or
:
(define (smooth n k)
(cond ((< k 2)
#f)
((divides k n)
#t)
(else
(smooth n (- k 1)))))
基本上,程序说明:
k
小于2,则n
不是“平滑”k
完全划分n
,那么n
就是“顺利”1
中减去k
并继续尝试换句话说:如果n
除了自身有1除数,我们说它是“平滑的”。显然,根据其“平滑度”,编写一个测试数字是否为素数的过程很容易 - 如果数字大于2
则数字为素数并且它不是平滑的(意思是:它没有除此之外的除数和1
)。这个post解释了为什么我们只需要测试除数到数字的平方根以确定它是否为素数。
答案 1 :(得分:1)
如果您尝试记下每个电话,则更容易理解。例如:
(smooth 5 4)
(smooth 5 3)
(smooth 5 2)
(define (smooth 5 3)
(and (>= 4 2)
(or (divides 3 5)
(smooth 5 (- 3 1)))))
(define (smooth 5 2)
(and (>= 2 2)
(or (divides 2 5)
(smooth 5 (- 2 1)))))
(define (smooth 5 1)
(and (>= 2 1) # This returns false
#t))
(define (smooth 5 2)
(and #f #t))
(define (smooth 5 3)
(and #t #f))
(define (smooth 5 4)
(and #t #f))
#f
答案 2 :(得分:1)
smooth n k
的除数介于2和n
之间,则 k
为真。
它实际上只相当于一个循环:
for i from k to 2 :
if i divides n, return True