我仍然在自己如何设计程序的练习中,但已经设法再次陷入困境。这次是问题11.4.7:
开发功能 是-未除尽-以&lt; = 1。它消耗了一个 自然数[&gt; = 1],我和自然 数字m,其中i <米如果m不是 可以被1之间的任何数字整除 (独家)和我(包括), 功能产生真实;否则,它 输出是假的。
使用is-not-divisible-by&lt; = i来定义 素数?,消耗自然 数字并确定是否 它是素数。
第一部分我没有太多时间:
;; 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的值相同,然后按照不可分割的方式进行操作&lt; =我这样做。但我认为作者打算让我以其他更简单的方式做到这一点。 (我甚至不知道如何做我所描述的,哈哈。)
这个问题确实破坏了我的屁股,所以任何帮助或提示,如果可以的话,都会很棒!
答案 0 :(得分:3)
素数是一个不能除以小于任何数字的数字。您已经实现了“不能除以任何小于”的部分:
(define (prime? n)
(is-not-divisible-by<=i (sub1 n) n))
答案 1 :(得分:1)
(素数?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
答案 2 :(得分:0)
没有必要将所有数字从n-1分割为2来检查素数。您只需要检查(楼层(sqrt n))。所以更快的方法(特别是对于大数字),也关注未定义(素数?1)问题,是:
(define (prime? n)
(is-not-divisible-by<=i (floor (sqrt n)) n))