<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢(mèng)蝶

    生活、程序、未來(lái)
       :: 首頁(yè) ::  ::  :: 聚合  :: 管理

    sicp 習(xí)題1.31,1.32,1.33解答

    Posted on 2007-05-14 15:10 dennis 閱讀(697) 評(píng)論(0)  編輯  收藏
        此題與1.32、1.33是一個(gè)系列題,沒(méi)什么難度,只不過(guò)把sum的加改成乘就可以了,遞歸與迭代版本相應(yīng)修改即可:
    ;(define (product term a next b)
    ;  (
    if (> a b)
    ;      
    1
    ;      (
    * (term a) (product term (next a) next b))))
    (define (product
    -iter term a next b result)
      (
    if (> a b)
          result
          (product
    -iter term (next a)  next b (* result (term a)))))
       分號(hào)注釋的是遞歸版本。利用product過(guò)程生成一個(gè)計(jì)算pi的過(guò)程,也是很簡(jiǎn)單,通過(guò)觀察公式的規(guī)律即可得出:
    (define (product term a next b)
      (product
    -iter term a next b 1))
    (define (inc x) (
    + x 2))
    (define (pi
    -term n)(/ (* (- n 1) (+ n 1)) (* n n)))
    (define (product
    -pi a b)
       (product pi
    -term a inc b))
    測(cè)試一下:

    > (* 4 (product-pi 3 1000))
    3.1431638424191978569077933

    再來(lái)看習(xí)題1.32,如果說(shuō)sum和product過(guò)程是一定程度的抽象,將對(duì)累積項(xiàng)和下一項(xiàng)的處理抽象為過(guò)程作為參數(shù)提取出來(lái),那么這個(gè)題目要求將累積的操作也作為參數(shù)提取出來(lái),是更高層次的抽象,同樣也難不倒我們:
    (define (accumulate combiner null-value term a next b)
      (
    if (> a b)
          null
    -value
          (combiner (term a) (accumulate combiner null
    -value term (next a) next b))))

    OK,其中combiner是進(jìn)行累積的操作,而null-value值基本值?,F(xiàn)在改寫(xiě)sum和product過(guò)程,對(duì)于sum過(guò)程來(lái)說(shuō),累積的操作就是加法,而基本值當(dāng)然是0了:
    (define (sum term a next b)
      (accumulate 
    + 0 term a next b))

    而對(duì)于product,累積操作是乘法,而基本值是1,因此:
    (define (product term a next b)
      (accumulate 
    * 1 term a next b))

    測(cè)試一下過(guò)去寫(xiě)的那些測(cè)試程序,比如生成pi的過(guò)程,可以驗(yàn)證一切正常!

    上面的accumulate過(guò)程是遞歸版本,對(duì)應(yīng)的迭代版本也很容易改寫(xiě)了:
    (define (accumulate-iter combiner term a next b result)
      (
    if (> a b)
          result
          (accumulate
    -iter combiner term (next a) next b (combiner result (term a)))))
    (define (accumulate  combiner null
    -value term a next b)
      (accumulate
    -iter combiner term a next b null-value))

    再看習(xí)題1.33,在accumulate的基礎(chǔ)上多增加一個(gè)filter的參數(shù)(也是一個(gè)過(guò)程,用于判斷項(xiàng)是否符合要求),在accumulate的基礎(chǔ)上稍微修改下,在每次累積之前進(jìn)行判斷即可:

    (define (filtered-accumulate combiner null-value term a next b filter)
      (cond ((
    > a b) null-value)
            ((filter a) (combiner (term a) (filtered
    -accumulate combiner null-value term (next a) next b filter))) 
            (
    else (filtered-accumulate combiner null-value term (next a) next b filter))))

    比如,求a到b中的所有素?cái)?shù)之和的過(guò)程可以寫(xiě)為(利用以前寫(xiě)的prime?過(guò)程來(lái)判斷素?cái)?shù)):
    (define (sum-primes a b)
      (filtered
    -accumulate + 0 identity a inc b prime?))

    測(cè)試一下:
    > (sum-primes 2 4)
    5
    > (sum-primes 2 7)
    17
    > (sum-primes 2 11)
    28
    > (sum-primes 2 100)
    1060


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 在线观看成人免费视频| 99re在线这里只有精品免费| 国产三级电影免费观看| 国产成人亚洲综合网站不卡| 成人AV免费网址在线观看| 亚洲系列中文字幕| 美女视频黄是免费的网址| 亚洲国产av美女网站| 在线观看免费人成视频| 亚洲午夜无码久久久久软件| 国产免费爽爽视频免费可以看| 亚洲日韩国产二区无码| 国产一区二区三区免费看| 一级毛片视频免费| 亚洲第一AAAAA片| 91精品国产免费久久久久久青草 | 国产国产人免费人成成免视频| 亚洲精品色婷婷在线影院| 中文字幕的电影免费网站| 无码乱人伦一区二区亚洲| 91精品视频免费| 美女免费精品高清毛片在线视| 精品亚洲一区二区三区在线播放| 久久er国产精品免费观看2| 亚洲网站免费观看| 国产美女a做受大片免费| 又硬又粗又长又爽免费看 | 狼友av永久网站免费观看| 国产精品亚洲色图| 亚洲精品无码永久在线观看你懂的 | 老司机午夜免费视频| 亚洲成a人片在线观看无码| 日本三级2019在线观看免费| 国产91成人精品亚洲精品| 亚洲av无码av制服另类专区| 成人免费视频一区二区三区| 久久久WWW成人免费精品| 亚洲va精品中文字幕| 国产亚洲色婷婷久久99精品91| 亚洲黄色免费网址| 有色视频在线观看免费高清在线直播|