Scheme递归函数

时间:2013-09-17 14:34:08

标签: recursion scheme primes

有人可以给我一个关于以下函数如何递归工作的解释。我可以理解更简单的递归示例,但我不明白(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作为素数,但我仍然不太明白上述函数如何工作/它如何与这个例子一起工作。

3 个答案:

答案 0 :(得分:4)

如果我们按以下方式重写smooth也许会更容易理解 - 它是一个完全等效的形式,但使用cond代替andor

(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