0

関数firstnprimesは最初のn素数を返すことになっています。引数はn素数の数で、nlist2-m の整数のリストです。andslistは解リストで、最初は空で、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)。今3は削除され、再帰的に を呼び出しますが(listminusnonprimes 6 3 '(5 7 9 11 ...))6存在しないため、呼び出しは何もせず、結果は(3 5 7 9 11 ...)です。

mod 操作を使用してこの関数を実装することをお勧めします。

于 2012-07-24T01:26:18.403 に答える
0

You don't need (let ((slist (cons (car nlist) slist))). Also, use append instead of cons as shown

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

So,

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

Lots of problems with your implementation though. First, the list has to be in increasing order. Also, the list has to start with a prime number. Also, the number of prime numbers in the nlist has to be less than or equal to n. (firstnprimes 4 '(2 4 7 9 21 36) '()) => '(2 7 9 21) which is wrong

Here is a slightly better implementation of your concept.

(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))))))))

Now,

(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)

But the first element still has to be prime though

于 2012-07-24T04:18:22.540 に答える