Recursion 用自然递归法求方案中的素数

Recursion 用自然递归法求方案中的素数,recursion,racket,Recursion,Racket,我仍在埋头练习如何自己设计程序,但还是设法再次陷入困境。这一次是问题11.4.7: 开发功能 不可被=1]、i和a整除 数字m,i

我仍在埋头练习如何自己设计程序,但还是设法再次陷入困境。这一次是问题11.4.7:

开发功能 不可被=1]、i和a整除 数字m,i
用法不能被整除素数是一个不能被任何小于自身的数整除的数。您已经实现了“不能被任何小于”部分:

(定义(素数?n)

(不能被整除素数是不能被任何小于其自身的数整除的数。您已经实现了“不能被任何小于其自身的数整除”部分:

(定义(素数?n)
(不能被整除)(素数?1)获得“被零除”错误

这是原始代码的一个修改版本。它现在处理(prime?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))))
现在(prime?1)返回#t

(prime?1)得到一个“零除”错误

这是原始代码的一个修改版本。它现在处理(prime?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

不必将所有数字从n-1除以2来检查素数。只需从(floor(sqrt n))检查素数。因此,一种更快的方法(特别是对于大数)也可以解决未定义(素数?1)问题,即:

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

(不可被整除)不必将所有数字从n-1除以2来检查素性。只需检查from(floor(sqrt n))。因此,一个更快的方法(特别是对于大数)也考虑了未定义(prime?1)问题,是:

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

(不可除byOh,jeeze,这很尴尬。我一直认为如果我这样做,每次递归调用函数时,两个n的值都会继续下降1。我没有想到(sub1 n)将被视为x,但被视为n,这一点意义都没有。非常感谢!这完全取决于你是从值(不能更改)还是变量(可以更改)的角度来思考……;)哦,天哪,那太尴尬了。我一直认为如果我这样做,每次递归调用函数时,两个n的值都会继续下降1。我没有想到(sub1 n)将被视为x,但被视为n,这一点意义都没有。非常感谢!这完全取决于你是从值(不能更改)还是变量(可以更改)的角度来思考……;)注意,如果1不是素数,则应返回
#f
。如果1不是素数,则应返回
#f