亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
123下一頁(yè)
最近訪問(wèn)板塊 發(fā)新帖
查看: 15266 | 回復(fù): 28
打印 上一主題 下一主題

Sieve of Eratosthenes 的 Haskell/Scheme 實(shí)現(xiàn) [復(fù)制鏈接]

論壇徽章:
95
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-05 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-17 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-18 06:20:002015亞冠之阿爾艾因
日期:2015-09-18 10:35:08月度論壇發(fā)貼之星
日期:2015-09-30 22:25:002015亞冠之阿爾沙巴布
日期:2015-10-03 08:57:39程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-05 06:20:00每日論壇發(fā)貼之星
日期:2015-10-05 06:20:002015年亞冠紀(jì)念徽章
日期:2015-10-06 10:06:482015亞冠之塔什干棉農(nóng)
日期:2015-10-19 19:43:35程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-21 06:20:00每日論壇發(fā)貼之星
日期:2015-09-14 06:20:00
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2008-09-21 00:31 |只看該作者 |倒序?yàn)g覽
Sieve of Eratosthenes 算法描述見 http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

Haskell 實(shí)現(xiàn)如下:

  1. sieve :: [Integer] -> [Integer]
  2. sieve (x:xs) = x : sieve xs'
  3.              where xs' = filter (\y -> y `mod` x /= 0) xs

  4. primes = 2 : sieve [3,5..]
復(fù)制代碼


加了平方優(yōu)化后的版本

  1. sieve :: [Integer] -> [Integer]
  2. sieve (x:xs) = x : sieve (xs' ++ xs''')
  3.              where
  4.                 (xs', xs'') = break (>= x*x) xs
  5.                 xs''' = filter (\y -> y `mod` x /= 0) xs''

  6. primes = 2 : sieve [3,5..]
復(fù)制代碼


實(shí)際上,第二個(gè)版本有嚴(yán)重的性能問(wèn)題(break 會(huì)導(dǎo)致大量的內(nèi)存操作)以至于還沒有第一個(gè)快。

真正優(yōu)化的版本(by win_hate):

  1. isPrime :: Integer -> [Integer] -> Bool
  2. isPrime p (x:xs)
  3.     | x*x > p           = True
  4.     | p `mod` x == 0    = False
  5.     | otherwise         = isPrime p xs

  6. primes = 2 : [ p | p <- [3,5..], isPrime p primes ]
復(fù)制代碼


BTW,這個(gè)還可以再稍加優(yōu)化。

[ 本帖最后由 MMMIX 于 2009-5-20 14:15 編輯 ]

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2008-09-21 01:20 |只看該作者
lazy scheme


  1. (define (integers n)
  2.   (cons n (integers (+ n 1))))

  3. (define (sieve seq)
  4.   (let ((p (car seq)))
  5.   (cons p (sieve
  6.            (filter (lambda (x) (not (= 0 (modulo x p)))) (cdr seq))))))
  7.            
  8. (define primes (sieve (integers 2)))
復(fù)制代碼

> (list-ref primes 50)
233

論壇徽章:
95
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-05 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-17 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-18 06:20:002015亞冠之阿爾艾因
日期:2015-09-18 10:35:08月度論壇發(fā)貼之星
日期:2015-09-30 22:25:002015亞冠之阿爾沙巴布
日期:2015-10-03 08:57:39程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-05 06:20:00每日論壇發(fā)貼之星
日期:2015-10-05 06:20:002015年亞冠紀(jì)念徽章
日期:2015-10-06 10:06:482015亞冠之塔什干棉農(nóng)
日期:2015-10-19 19:43:35程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-21 06:20:00每日論壇發(fā)貼之星
日期:2015-09-14 06:20:00
3 [報(bào)告]
發(fā)表于 2008-09-21 01:59 |只看該作者

回復(fù) #2 win_hate 的帖子

我覺著 integers 的定義可以優(yōu)化下
PLT Scheme 實(shí)現(xiàn)(需要在 DrScheme 中將語(yǔ)言設(shè)為 Module)

  1. #lang lazy

  2. (define (integers n)
  3.   (cons n (integers (+ n 2))))

  4. (define (sieve seq)
  5.   (let ((p (car seq)))
  6.   (cons p (sieve
  7.            (filter (lambda (x) (not (= 0 (modulo x p)))) (cdr seq))))))
  8.            
  9. (define primes (cons 2
  10.                      (sieve (integers 3))))
復(fù)制代碼


  1. > (list-ref primes 50)
  2. 233
復(fù)制代碼

[ 本帖最后由 MMMIX 于 2008-9-21 10:51 編輯 ]

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2008-09-21 10:15 |只看該作者
一個(gè)帶平方優(yōu)化的版本


  1. (define odd
  2.   (letrec ((f (lambda (n)
  3.              (cons n (f (+ n 2))))))
  4.     (f 3)))

  5. (define primes
  6.   (cons 2 (filter primes? odd)))

  7. (define (primes? n)
  8.   (define (f ps)
  9.     (let ((p (car ps)))
  10.       (cond ((> (* p p) n) #t)
  11.             ((= (modulo n p) 0) #f)
  12.             (else (f (cdr ps))))))
  13.   (f primes))
復(fù)制代碼

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2008-09-21 10:17 |只看該作者
原帖由 MMMIX 于 2008-9-21 01:59 發(fā)表
我覺著 integers 的定義可以優(yōu)化下
PLT Scheme 實(shí)現(xiàn)

#lang lazy

(define (integers n)
  (cons n (integers (+ n 2))))

(define (sieve seq)
  (let ((p (car seq)))
  (cons p (sieve
         ...


說(shuō)得對(duì),用奇數(shù)列相當(dāng)于在選材上先 filter 了一次。

那個(gè) #lang lazy 在 mzscheme 中好用嗎?我這里試了不行。

[ 本帖最后由 win_hate 于 2008-9-21 10:34 編輯 ]

論壇徽章:
95
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-05 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-17 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-18 06:20:002015亞冠之阿爾艾因
日期:2015-09-18 10:35:08月度論壇發(fā)貼之星
日期:2015-09-30 22:25:002015亞冠之阿爾沙巴布
日期:2015-10-03 08:57:39程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-05 06:20:00每日論壇發(fā)貼之星
日期:2015-10-05 06:20:002015年亞冠紀(jì)念徽章
日期:2015-10-06 10:06:482015亞冠之塔什干棉農(nóng)
日期:2015-10-19 19:43:35程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-21 06:20:00每日論壇發(fā)貼之星
日期:2015-09-14 06:20:00
6 [報(bào)告]
發(fā)表于 2008-09-21 10:50 |只看該作者
原帖由 win_hate 于 2008-9-21 10:17 發(fā)表
那個(gè) #lang lazy 在 mzscheme 中好用嗎?我這里試了不行。

mzscheme 不清楚(應(yīng)該也行),我向來(lái)都是直接用 DrScheme 的
在 DrScheme 中應(yīng)該把語(yǔ)言設(shè)為 Module,然后通過(guò) #lang 選擇具體要用的語(yǔ)言,這也是推薦的作法。

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2008-09-21 11:21 |只看該作者
謝謝!


用模塊之后可以了,但對(duì)整個(gè)體系還是很模糊。要找個(gè)時(shí)間把 PLT 的文檔好好看一看才行。


  1. (module nth (lib "lazy.ss" "lazy")
  2.   
  3.   (define odd
  4.     (letrec ((f (lambda (n)
  5.                   (cons n (f (+ n 2))))))
  6.       (f 3)))
  7.   
  8.   (define primes
  9.     (cons 2 (filter primes? odd)))
  10.   
  11.   (define (primes? n)
  12.     (define (f ps)
  13.       (let ((p (car ps)))
  14.         (cond ((> (* p p) n) #t)
  15.               ((= (modulo n p) 0) #f)
  16.               (else (f (cdr ps))))))
  17.     (f primes))
  18.   
  19.   (define (nth-prime n)
  20.     (! (list-ref primes n)))
  21.   
  22.   (provide nth-prime))
復(fù)制代碼

論壇徽章:
95
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-05 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-17 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-18 06:20:002015亞冠之阿爾艾因
日期:2015-09-18 10:35:08月度論壇發(fā)貼之星
日期:2015-09-30 22:25:002015亞冠之阿爾沙巴布
日期:2015-10-03 08:57:39程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-05 06:20:00每日論壇發(fā)貼之星
日期:2015-10-05 06:20:002015年亞冠紀(jì)念徽章
日期:2015-10-06 10:06:482015亞冠之塔什干棉農(nóng)
日期:2015-10-19 19:43:35程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-21 06:20:00每日論壇發(fā)貼之星
日期:2015-09-14 06:20:00
8 [報(bào)告]
發(fā)表于 2008-09-21 16:21 |只看該作者
原帖由 win_hate 于 2008-9-21 11:21 發(fā)表
謝謝!


用模塊之后可以了,但對(duì)整個(gè)體系還是很模糊。要找個(gè)時(shí)間把 PLT 的文檔好好看一看才行。


其實(shí)用 #lang 也是可以的,不過(guò)直接用 (list-ref primes 50) 是沒有輸出的,但是可以用 (display (list-ref primes 50)) 顯示結(jié)果。

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2008-09-21 17:44 |只看該作者
我不是很明白你的意思。

如果直接選 lazy scheme,是可以運(yùn)行的。我回的第一貼用的就是這個(gè)環(huán)境



如果把語(yǔ)言選為 module,則得到一條錯(cuò)誤。



可能我模塊那里沒寫對(duì)?

[ 本帖最后由 win_hate 于 2008-9-21 17:49 編輯 ]

論壇徽章:
95
程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-05 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-17 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-09-18 06:20:002015亞冠之阿爾艾因
日期:2015-09-18 10:35:08月度論壇發(fā)貼之星
日期:2015-09-30 22:25:002015亞冠之阿爾沙巴布
日期:2015-10-03 08:57:39程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-05 06:20:00每日論壇發(fā)貼之星
日期:2015-10-05 06:20:002015年亞冠紀(jì)念徽章
日期:2015-10-06 10:06:482015亞冠之塔什干棉農(nóng)
日期:2015-10-19 19:43:35程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-10-21 06:20:00每日論壇發(fā)貼之星
日期:2015-09-14 06:20:00
10 [報(bào)告]
發(fā)表于 2008-09-21 18:28 |只看該作者
原帖由 win_hate 于 2008-9-21 17:44 發(fā)表


如果把語(yǔ)言選為 module,則得到一條錯(cuò)誤。


估計(jì)是版本的問(wèn)題,我看你用的還是 3.72, 我測(cè)試時(shí)用的是 4.1

collects/lazy/lang/reader.ss 這個(gè)文件在我這是有的,內(nèi)容很簡(jiǎn)單:

  1. (module reader syntax/module-reader
  2.   lazy)
復(fù)制代碼

[ 本帖最后由 MMMIX 于 2008-9-21 18:31 編輯 ]
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP