0

该函数firstnprimes应该返回第一个n素数。参数是n素数的数量,nlist一个 2-m 整数的列表。和slist是解决方案列表,最初为空,每次调用 firstnprimes 时都会添加和重构。

它的工作原理是从列表中删除第一个数字,然后从nlistwith中删除该数字的所有倍数listminusnonprimes;我知道这是有效的。问题是我无法控制这个动作,如果slist' 的长度等于你想要的素数数量,我会计算每次通过的次数,那么你就完成了。

代码:

(define firstnprimes
  (lambda (n nlist slist)
   (let ((slist (cons (car nlist) slist)))
    (if (zero? n)
        slist
        (firstnprimes (- n 1) (listMinusNonprimes (car nlist) (car nlist) nlist) slist)))))


(define listminusnonprimes
     (lambda (num d lst)
       (if (null? lst)
           '()
           (if (= d (car lst))
               (listminusnonprimes num (+ num d) (cdr lst))
               (cons (car lst) (listminusnonprimes num d (cdr lst)))))))
4

2 回答 2

1

你的定义listminusnonprimes是错误的。想象一下调用(listminusnonprimes 3 3 '(3 5 7 9 11 ...))(因为这会在您删除所有倍数后发生2)。Now3被删除,递归调用(listminusnonprimes 6 3 '(5 7 9 11 ...)),但6不存在,所以调用什么也不做,结果是(3 5 7 9 11 ...)

我建议使用 mod 操作来实现这个功能。

于 2012-07-24T01:26:18.403 回答
0

你不需要(let ((slist (cons (car nlist) slist)))。此外,如图所示使用 append 而不是 cons

(define firstnprimes
  (lambda (n nlist slist)
    (if (zero? n)
        slist
        (firstnprimes (- n 1) (listminusnonprimes (car nlist) (car nlist) nlist) (append slist (list (car nlist)))))))

所以,

(firstnprimes 2 '(2 4 7 9 21 36) '()) => '(2 7)
(firstnprimes 3 '(2 4 7 9 21 36) '()) => '(2 7 9)

但是,您的实施存在很多问题。首先,列表必须按升序排列。此外,列表必须以素数开头。此外, 中的素数个数nlist必须小于或等于n(firstnprimes 4 '(2 4 7 9 21 36) '()) => '(2 7 9 21)这是错误的

这是您的概念的更好的实现。

(define firstnprimes
  (lambda (n nlist slist)
    (if (or (zero? n) (null? nlist))
        slist
        (firstnprimes (- n 1) (listminusnonprimes (car nlist) (car nlist) nlist) (append slist (list (car nlist)))))))


(define listminusnonprimes
     (lambda (num d lst)
       (if (null? lst)
           '()
           (if (< d (car lst))
               (listminusnonprimes num (+ num d) lst)
               (if (= d (car lst))
                   (listminusnonprimes num (+ num d) (cdr lst))
                   (cons (car lst) (listminusnonprimes num (+ num d) (cdr lst))))))))

现在,

(firstnprimes 2 '(2 4 7 9 21 36) '()) => '(2 7)
(firstnprimes 3 '(2 4 7 9 21 36) '()) => '(2 7 9)
(firstnprimes 4 '(2 4 7 9 21 36) '()) => '(2 7 9)

但是第一个元素仍然必须是素数

于 2012-07-24T04:18:22.540 回答