SICP中习题1.23,检查素数的时候,编程遇到的一个问题

习题中介绍说,如果一个数已经检查了是否能被2整除,如果可以,就没必要检查2的倍数是否是素数了(肯定不是)。于是想到,给出任意的一个数n,我们可以先检查它是否可以被n/2以下的整数整除,若可以被整除,则肯定不是素数。如果不被整除,那么继续执行代码中的find-divisor。

用lisp语言,以下代码的问题是:当我输入一个数n,比如10,我要检查它是否是10/2 = 5到1的倍数,发现不是,则不需要继续判断10这个数了。让它加1,为11,发现11是不能被1~11/2的数整除的,则返回11.

(define (next test-divisor)
  (is-right-number test-divisor (/ test-divisor 2)))
(define (is-right-number b count)
  (cond ((= count 1) b)
        ((= 0 (remainder b count)) (is-right-number (+ b 1) (/ (+ b 1) 2)))
        (else
         (is-right-number b (- count 1)))))

整体的代码如下:为检查素数的方法,但是上面的代码有个问题,貌似程序是以正则序进行解释的,假设我们输入10,第一步肯定是不符合,让10加1,然后变成11,但是在remainder b count这步的时候,count居然依旧是11/2,而不是我预期的5.

解决就是将有理数转换为整数,但是如何进行转换现在还不知道。可恶的Google一直链接不到www.google.com/hk。

(define (smallest-divisor n)
  (find-divisor n 2))
(define (find-divisor n test-divisor)
  (cond ((> (square test-divisor) n) n)
        ((divides? test-divisor n) test-divisor)
        (else
         (find-divisor n (next test-divisor)))))
(define (square x) (* x x))
(define (divides? a b)
  (= (remainder b a) 0))
(define (prime? n)
  (= n (smallest-divisor n)))
(define (next test-divisor)
  (is-right-number test-divisor (/ test-divisor 2)))
(define (is-right-number b count)
  (cond ((= count 1) b)
        ((= 0 (remainder b count)) (is-right-number (+ b 1) (/ (+ b 1) 2)))
        (else
         (is-right-number b (- count 1)))))


如何解决呢?

相关信息

更多
您的回应...

相关话题

查看全部

也许你感兴趣

换一批

热门标签

更多