<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))


    主站蜘蛛池模板: 在线观看永久免费视频网站| 最近免费中文字幕4| 国产乱子伦精品免费女| 亚洲女女女同性video| 成人性生交大片免费看无遮挡 | 亚洲欧美aⅴ在线资源| 久久这里只有精品国产免费10| 亚洲人成电影青青在线播放| 1区2区3区产品乱码免费| 亚洲天堂福利视频| 国产成人免费网站| 337P日本欧洲亚洲大胆精品| 国产jizzjizz视频免费看| 免费精品国自产拍在线播放| 免费a级毛片18以上观看精品| 一区二区三区在线免费| 亚洲av无码一区二区三区网站 | 免费看男女下面日出水来| 亚洲AV无码无限在线观看不卡| 四虎成人免费网址在线| 免费大片av手机看片| 久久亚洲精品视频| 57pao一国产成永久免费| 亚洲国产精品无码久久久秋霞1| va亚洲va日韩不卡在线观看| 丁香花在线观看免费观看图片| 久久亚洲熟女cc98cm| 成人永久免费福利视频网站| 一级成人a免费视频| 久久久久亚洲Av无码专| 全免费一级午夜毛片| 91视频免费网站| 亚洲人成影院在线高清| 亚洲AV无码乱码在线观看性色扶| 三年片免费高清版 | 波多野结衣免费视频观看| 中文在线观看免费网站| 亚洲AV成人影视在线观看| 丝袜熟女国偷自产中文字幕亚洲| 亚洲视频免费播放| 一级做a爰片久久毛片免费陪|