Recursion 方案递归函数

Recursion 方案递归函数,recursion,scheme,primes,Recursion,Scheme,Primes,有人能给我解释一下下面的函数是如何递归工作的吗。我可以理解更简单的递归示例,但我不理解(平滑n(-k1))如何在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)

有人能给我解释一下下面的函数是如何递归工作的吗。我可以理解更简单的递归示例,但我不理解
(平滑n(-k1))
如何在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))))))
(定义(划分a和b)
(=(模b a)0))
(定义(平滑n k)
(和(>=k2)
(或(k/n)
(平滑n(-k1(()()))
(定义(ISPP)
(如果(

我写了一个
isprime
函数,它不使用
1
作为素数,但我仍然不太理解上面的函数是如何工作的/它是如何与这个例子一起工作的。

如果我们将
平滑
重写如下,可能更容易理解-它是一个完全等价的形式,但是使用
cond
而不是

(define (smooth n k)
  (cond ((< k 2)
         #f)
        ((divides k n)
         #t)
        (else
         (smooth n (- k 1)))))
(定义(平滑n k)
(cond(
基本上,程序规定:

  • 如果
    k
    小于2,则
    n
    不是“平滑的”
  • 如果
    k
    正好除以
    n
    ,则
    n
    是“平滑的”
  • 否则,从
    k
    中减去
    1
    ,然后继续尝试

换句话说:如果
n
除了自身和1之外还有任何除数,我们称之为“平滑”。显然,编写一个程序来测试一个数字是否为素数是很容易的,根据它的“平滑度”——如果一个数字大于
2
,并且它不是平滑的(意思是:除了它本身和
1
,它没有除数)。这就解释了为什么我们只需要测试一个数的平方根的除数就可以确定它是否是素数。

如果我们将
平滑的
重写如下,可能会更容易理解-它是一种完全等价的形式,但是使用
cond
而不是

(define (smooth n k)
  (cond ((< k 2)
         #f)
        ((divides k n)
         #t)
        (else
         (smooth n (- k 1)))))
(定义(平滑n k)
(cond(
基本上,程序规定:

  • 如果
    k
    小于2,则
    n
    不是“平滑的”
  • 如果
    k
    正好除以
    n
    ,则
    n
    是“平滑的”
  • 否则,从
    k
    中减去
    1
    ,然后继续尝试

换句话说:如果
n
除了自身和1之外还有任何除数,我们称之为“平滑”。显然,编写一个程序来测试一个数字是否为素数是很容易的,根据它的“平滑度”——如果一个数字大于
2
,并且它不是平滑的(意思是:除了它本身和
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

如果你试着写下每一个电话,你会更容易理解。例如:

(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

如果
n
的除数在2和
k之间,则
smooth nk
为真

实际上,它只相当于一个循环:

for i from k to 2 :
    if i divides n, return True

如果
n
的除数在2和
k之间,则
smooth nk
为真

实际上,它只相当于一个循环:

for i from k to 2 :
    if i divides n, return True

这是格式不正确或无法运行的代码。这个例子很简单,但是你能为每个人的方便而调整它吗?特别是如果新用户发现这个问题,它也会对他们有用。
smooth n k=k存在于(k,k-1,…,2)中,例如(n%i==0)
isprime p=p>=2&¬(平滑p[sqrt p])
。名字的选择是不幸的:是其他的东西。相反的测试顺序更好——数字的因子可能更小,而不是更大。这不是正确格式化或可运行的代码。这个例子很简单,但是你能为每个人的方便而调整它吗?特别是如果新用户发现这个问题,它也会对他们有用。
smooth n k=k存在于(k,k-1,…,2)中,例如(n%i==0)
isprime p=p>=2&¬(平滑p[sqrt p])
。名字的选择是不幸的:是其他的东西。相反的测试顺序更好——数字更可能具有较小的因子而不是较大的因子。