使用自然递归在Scheme中查找素数

时间:2010-07-27 16:13:19

标签: recursion racket

我仍然在自己如何设计程序的练习中,但已经设法再次陷入困境。这次是问题11.4.7:

  

开发功能   是-未除尽-以&lt; = 1。它消耗了一个   自然数[&gt; = 1],我和自然   数字m,其中i <米如果m不是   可以被1之间的任何数字整除   (独家)和我(包括),   功能产生真实;否则,它   输出是假的。

     

使用is-not-divisible-by&lt; = i来定义   素数?,消耗自然   数字并确定是否   它是素数。

第一部分我没有太多时间:

;; A natural number [>=1] is either 1. 1 or 
;; 2. (add1 n) where n is a natural number [>=1].

;; is-not-divisible-by<=i : N[>=1] N -> boolean
(define (is-not-divisible-by<=i i m)
  (cond
    [(= i 1) true]
    [else (cond
            [(= (remainder m i) 0) false]
            [else (is-not-divisible-by<=i (sub1 i) m)])]))
(is-not-divisible-by<=i 3 6) ; expected: false.
(is-not-divisible-by<=i 6 7) ; expected: true.

但我在使用自然递归时无法看到如何使用一个变量来执行此操作。我想过使用列表,但这也存在同样的问题。

我能看到的唯一解决方案就是给出另一个变量 - 让我们说x--与n的值相同,然后按照不可分割的方式进行操作&lt; =我这样做。但我认为作者打算让我以其他更简单的方式做到这一点。 (我甚至不知道如何做我所描述的,哈哈。)

这个问题确实破坏了我的屁股,所以任何帮助或提示,如果可以的话,都会很棒!

3 个答案:

答案 0 :(得分:3)

素数是一个不能除以小于任何数字的数字。您已经实现了“不能除以任何小于”的部分:

(define (prime? n)
  (is-not-divisible-by<=i (sub1 n) n))

答案 1 :(得分:1)

(素数?1)得到“除以零”错误。

这是原始代码的修改版本。它现在处理(素数?1)问题。

(define (prime? p)
  (define (non-divisible-by n d)
    (cond
     ((= d 1) #t)
     (else (if(= (remainder n d) 0)
          #f
          (non-divisible-by n (- d 1))))))
  (if (= p 1)
      #t
      (non-divisible-by p (- p 1))))

现在(素数?1)返回#t

答案 2 :(得分:0)

没有必要将所有数字从n-1分割为2来检查素数。您只需要检查(楼层(sqrt n))。所以更快的方法(特别是对于大数字),也关注未定义(素数?1)问题,是:

(define (prime? n)
  (is-not-divisible-by<=i (floor (sqrt n)) n))