【问题标题】:Finding a prime number in Scheme using natural recursion使用自然递归在 Scheme 中查找素数
【发布时间】:2010-07-27 16:13:18
【问题描述】:

我仍然在自己完成如何设计程序中的练习,但又被卡住了。这次是问题11.4.7:

开发功能 is-not-divisible-by=1]、i 和自然数 数字 m,其中 i

使用 is-not-divisible-by

第一部分我并没有太费劲:

;; 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 相同的值,然后按照 is-not-divisible-by

这个问题真的让我很头疼,所以如果可以的话,任何帮助或提示都会很棒!

【问题讨论】:

    标签: recursion racket


    【解决方案1】:

    素数是一个不能被任何小于它自己的数整除的数。您已经实现了“不能被任何小于的数除”部分:

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

    【讨论】:

    • 哦,天哪,真尴尬。我一直认为,如果我这样做,每次递归调用函数时,两个 n 的值都会继续下降 1。我不认为 (sub1 n) 会被视为 x,而是被视为 n,这根本没有多大意义。非常感谢!
    • 这完全取决于您是根据值(无法更改)还是变量(可以更改)来思考...nicollet.net/2010/01/quick-test ;)
    【解决方案2】:

    (prime? 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

    【讨论】:

    • 请注意,如果为 1,则应返回 #f,因为 1 不是素数。
    【解决方案3】:

    没有必要将所有数字从 n-1 除以 2 来检查素数。您只需要从 (floor (sqrt n)) 进行检查。因此,一种更快的方法(特别是对于大数),也考虑到未定义的(素数?1)问题,是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-19
      • 2017-08-15
      • 1970-01-01
      • 2016-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多