函数firstnprimes
应该返回第一个n
素数。参数是素数的n
,nlist
来自2-m整数的列表。 slist
是解决方案列表,最初为空,并添加到每个对firstnprimes的调用并重新构建。
它的工作原理是从列表中删除第一个数字,然后使用nlist
从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)))))))
答案 0 :(得分:1)
您对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操作来实现这个功能。
答案 1 :(得分: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)
但是第一个元素仍然必须是素数