【问题标题】:Scheme Recursive Function方案递归函数
【发布时间】:2013-09-22 01:30:48
【问题描述】:

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

【问题讨论】:

  • 这不是格式正确或可运行的代码。这个案例相当简单,但您能否为每个人的方便进行调整,特别是如果新用户发现这个问题,它也对他们有用。
  • smooth n k = Exists i In (k,k-1,...,2) SuchThat (n%i==0)isprime p = p&gt;=2 &amp;&amp; not (smooth p [sqrt p])。名字的选择是不幸的:smooth numbers 是别的东西。反向测试顺序更好 - 数字更可能具有较小的因素而不是较大的因素。

标签: recursion scheme primes


【解决方案1】:

如果我们将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 是“平滑的”
  • 否则,从k 中减去1 并继续尝试

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

【讨论】:

    【解决方案2】:

    如果您尝试写下每个电话,则更容易理解。例如:

    (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
    

    【讨论】:

      【解决方案3】:

      如果n 的除数介于2 和k 之间,则smooth n k 为真。

      实际上相当于一个循环:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-18
        • 1970-01-01
        • 2013-08-04
        • 1970-01-01
        相关资源
        最近更新 更多