使用递归辅助函数检查素数

时间:2019-01-18 16:55:26

标签: recursion scheme racket primes primality-test

我正在尝试使用递归检查数字是否为质数。我需要使用递归辅助函数,但不确定如何实现。

我想我知道算法,但是我从未尝试过在Racket中使用递归帮助函数。这是我目前的想法:

  1. 查看n是否可被i = 2整除
  2. 设置i = i + 1
  3. 如果i^2 <= n继续。
  4. 如果没有i的值均分n,则它必须是素数。

这是我到目前为止所拥有的...

(define (is_prime n)
  (if (<= n 1)
      #f
      (if (= (modulo n 2) 0)
          #f

)

使用递归帮助器函数是什么好方法?

谢谢!

2 个答案:

答案 0 :(得分:4)

使用助手只是意味着您应该将程序分成较小的部分,并可能在单独的过程中用额外的参数封装循环-在Scheme循环中,经常通过递归调用来实现。一种实现is_prime过程的(简单)方法是:

(define (is_prime n)
  (cond ((<= n 1) #f)
        ((= n 2) #t)
        ((= (modulo n 2) 0) #f)
        (else (check 3 n))))

; recursive helper
(define (check i n)
  (cond ((> (* i i) n) #t)
        ((= (modulo n i) 0) #f)
        (else (check (+ i 2) n))))

有很多方法可以实现此过程,并且可以进行许多优化。以上应该足以让您入门。

答案 1 :(得分:0)

(define (isPrimeHelper x k)
  (if (= x k) #t
  (if (= (remainder x k) 0) #f
     (isPrimeHelper x (+ k 1)))))

(define ( isPrime x )
  (cond
    (( = x 0 ) #f)
    (( = x 1 ) #f)
    (( = x 2 ) #t)
     ( else (isPrimeHelper x 2 ) )))

I prefer this version.