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

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

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

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    sicp 1.16解答

    Posted on 2007-05-11 08:51 dennis 閱讀(888) 評論(0)  編輯  收藏 所屬分類: 計算機科學與基礎
        此題充分展示了如何將遞歸轉化為迭代的技巧:定義一個不變量,要求它在迭代狀態之間保持不變!題目如下:
    寫一個過程求平方,并且只用對數個步驟。

    解答:
    考慮一個附加狀態a,如何保持ab**n(b**n表示b的n次方)在狀態改變間保持不變.
    1)當n是偶數:
    a(b2)n/2 = abn
    bn = (bn/2)2 = (b2)n/2
    在這個過程中回溯狀態的遷移:



        a ← a

        b ← b2

        n ← n
    /2

    2)當n是奇數:
    (ab)b(n-1) = abn
    回溯狀態的變遷:


        a ← a 
    * b

        b ← b

        n ← n
    -1

    就此可以寫出lisp過程了:
    (define (even? n) (= (remainder n 20))
    (define (square n) (
    * n n))
    (define (fast
    -expr b n)
      (define (iter a b n)
        (cond ((
    = n 0) a)
              ((even
    ? n) (iter a (square b) (/ n 2)))
              (
    else (iter (* a b) b (- n 1)))))
      (iter 
    1 b n))

    這道題目一開始我的解答完全錯了!-_-,我理解錯了題意,一直將指數對半折,這樣的步驟是n/2步而不是對數步驟,階仍然是(theta)(n):
    (define (fast-expt-iter b product counter)
      (cond ((
    = counter 0) product)
        ((even
    ? counter) (fast-expt-iter b (* (square b) product) (* 2 (- (/ counter 21)))) 
        
        (
    else
          (
    * b (fast-expt-iter b product (- counter 1)))
      )))
    (define (fast
    -exptt b n)
      (fast
    -expt-iter b 1 n))


    主站蜘蛛池模板: 91免费播放人人爽人人快乐| 亚洲国产精品久久久久秋霞小 | 91亚洲一区二区在线观看不卡| 国产免费福利体检区久久| 色播在线永久免费视频| 亚洲人成网站色在线观看| 成年在线网站免费观看无广告| 国产成人精品日本亚洲18图| 免费人成在线视频| 久久午夜夜伦鲁鲁片无码免费| 亚洲成AV人片在| 精品无码AV无码免费专区| 亚洲日本在线免费观看| 久久精品网站免费观看| 欧美激情综合亚洲一二区| 国产午夜鲁丝片AV无码免费| 牛牛在线精品观看免费正| 国产AV无码专区亚洲AV毛网站| 日韩免费无码视频一区二区三区 | 国产免费看插插插视频| 一级毛片正片免费视频手机看| 亚洲中文字幕无码日韩| 久草免费手机视频| 激情五月亚洲色图| 免费中文字幕在线| 九九美女网站免费| 亚洲av乱码一区二区三区 | 久久国产色AV免费看| 亚洲 暴爽 AV人人爽日日碰| 国产午夜影视大全免费观看| 国产免费播放一区二区| 91亚洲视频在线观看| 免费欧洲美女牲交视频| 精品国产污污免费网站| 亚洲人成人网毛片在线播放| 亚洲国产午夜中文字幕精品黄网站| 免费精品久久天干天干| 亚洲色欲色欲www在线播放| 中文字幕不卡亚洲| 99久久国产热无码精品免费| 香港一级毛片免费看|