2

我正在尝试使用递归检查数字是否为素数。我被要求使用递归辅助函数,但我不确定应该如何实现它。

我想我知道算法,但我从未尝试在 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

)

使用递归辅助函数的好方法是什么?

谢谢!

4

2 回答 2

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))))

有很多方法可以实现这个过程,并且有很多可能的优化;以上应该足以让您入门。

于 2019-01-18T17:31:53.470 回答
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 ) )))

我更喜欢这个版本。

于 2019-01-18T18:24:20.640 回答