我是 SML 的新手。我正在嘗試創建一個函式,該函式使用埃拉托色尼篩法輸出小于或等于給定整數 n > 2 的所有素數的串列。我遇到了一個問題,但是輸出僅顯示為 [1]。我希望能夠輸入諸如 5 并得到 [1,3,5] 作為結果。
到目前為止,這是我的代碼,我很新,所以我知道它很可能沒有正確撰寫。
fun createList(ending) =
let
fun createListX(start, ending) =
if start = ending then []
else start :: createListX(start 1, ending)
in
createListX(1, ending 1)
end;
fun removeMult ([], n) = []
| removeMult (x::xs, n) =
if x mod n = 0 then
removeMult(xs, n)
else
x :: removeMult(xs, n);
fun sieve([], primes) = primes
| sieve(n::ns, primes) = sieve(removeMult(ns, n), n :: primes);
fun dosieve(n) = sieve(createList(n-1), []);
uj5u.com熱心網友回復:
您的removeMult功能運行良好。
您的sieve功能也可以完美運行。太完美了。
考慮一下當你打電話時會發生什么dosieve(10):
dosieve(10)
sieve(createList(9), [])
sieve([1,2,3,4,5,6,7,8,9], [])
從那里:
sieve(removeMult([2, 3, 4, 5, 6, 7, 8, 9], 1), 1 :: [])
sieve([], [1])
[1]
哎呀。您洗掉了 的所有倍數1,但當然它們都是.的倍數1。
也許是這樣的:
fun sieve([], primes) = primes
| sieve(1::ns, primes) = sieve(ns, 1 :: primes)
| sieve(n::ns, primes) = sieve(removeMult(ns, n), n :: primes);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/412382.html
標籤:
