私は、スキームのSag of Eratosthenesの実装をWebで検索していましたが、多くのコンテンツが出てきましたが、完了する必要があるようなものはありませんでした。Eratosthenesスキームのふるい
ほとんどのアルゴリズムは、静的な終了または反復を使用しています。これは私の言語の知識が不足しているため、皆さんに助けを求めてくれました。
1つの引数(Sieveまでの数値)を取り、再帰のみを使用し、#t
(真)または#f
(偽)の数値の「短所」のリストを持つSieveの実装が必要です。
だから、基本的なアルゴリズムは、次のような行く:
- 2からリストを作る - 真
- を開始する各番号のinputed数が再帰的に通過し、2偽 で割り切れる各番号をマーク唯一の素数をリスト
出力例:
>(ERAT篩20)
((2。 #tを) (3。#tを) (4。#fを) (5。#tを) (6。#fを) (7。#tを) (8。#fを) (9# F) (10。#fを) (11。#tを) (12。#fを) (13。#tを) (14。#fを) (15。#fを) (16。#fを) (17。#tを) (18。#fを) (19。#tを) (20。は#f))
あなたも徹底的にコードを説明するコメントを持つことができた場合は、それは非常に高く評価されます。
ありがとうございました!
は改訂::: だから私はさらに私の質問を説明するためのスキームを少し学んだ...
を。これは、リストを作ります。
(define (makeList n)
(if (> n 2)
(append (makeList (- n 1)) (list (cons n (and))))
(list (cons 2 (and)))))
これは、除数の各倍数がfalseになっているリストを返します。
(define (mark-off-multiples numbers divisor)
(if (null? numbers)
'()
(append
(list (cons (car (car numbers))
(not (zero? (modulo (car (car numbers)) divisor)))))
(mark-off-multiples (cdr numbers) divisor))))
は今、これは動作するはずのように、私はそれを介して手動で3回行ってきたようで、私はとのトラブルを抱えている機能ですが、その私が必要なものを返さない理由を私は理解できません。関数名が示唆するよう
(define (call-mark-off-multiples-for-each-true-number numbers)
(if (null? numbers)
'()
(if (cdr (car numbers))
(append (list (car numbers))
(call-mark-off-multiples-for-each-true-number
(mark-off-multiples (cdr numbers) (car (car numbers)))))
(append (list (car numbers))
(call-mark-off-multiples-for-each-true-number
(cdr numbers))))))
である私はそれを行うにしようとしてる、まだダウンリスト真のマークされた各番号のマーク・オフ倍数を呼び出します。したがって、((3.#t)(4.#t)(5.#t))
を渡した後、mark-off-multiples
を2に呼び出して(3.#t)(4.#f)(5.#t)
を返し、(2.#t)
を追加します。そして、それが再び(3.#t)(4.#f)(5.#t)
に渡して自分自身を呼び出し、(4.#f)(5.#t)
を返すリストのCDRとマーク・オフ倍数を呼び出し、リストを下にいっている...私は、返されます
出力はすべてtruesとリストです。
これはうまくいけば、私の苦境をよく理解するのに役立ちます。
一般的に言えば、質問に答えた回答を受け入れることになっています。他に何が足りないのか教えてください。私は答えを修正します。 –