函数firstnprimes应该返回第一个n素数。参数是从2-m个整数中抽取素数,nlist a list。slist是解决方案列表,最初是空的,每次调用firstnprimes都会被添加并重新构造。
它的工作方式是从列表中删除第一个数字,然后使用listminusnonprimes从nlist中删除该数字的所有倍数;我知道这是有效的。问题是我不能控制这个动作,我计算每一遍,如果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)))))))发布于 2012-07-24 09:26:18
您对listminusnonprimes的定义是错误的。想象一下调用(listminusnonprimes 3 3 '(3 5 7 9 11 ...)) (因为在删除2的所有倍数之后会发生这种情况)。现在3被删除了,您递归地调用(listminusnonprimes 6 3 '(5 7 9 11 ...)),但是6不在那里,所以调用什么也不做,结果是(3 5 7 9 11 ...)。
我建议使用mod操作实现此函数。
发布于 2012-07-24 12:18:23
你不需要(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)但是第一个元素仍然必须是质数
https://stackoverflow.com/questions/11621852
复制相似问题