zoukankan      html  css  js  c++  java
  • SICP 习题1.16-1.19体会

    首先反思一下, 昨天做1.14的时候犯了一个严重错误。思维定式了,导致花了非常多无用功。

    1.14的关键是要想到2个物理意义。 一个是广度优先, 也就是仅仅考虑问题递归树的第一层子数。那么必定有公式

    F(n,m) = F(n- c1, m) + ... + F(n-cm, m) + 1   c1..cm为货币价值, m为货币树。 

    利用这个公式,我们非常easy用数学归纳法证明存在一个參数C1,满足F(n,m) > C1 * n的m次方。

    可是,利用这个公式,我们是无法证明存在一个參数C2。满足F(n。m) < C2 * n的m次方。

    根本原因是犯了数学竞赛中不等式证明的常规错误。 如果条件太宽了。

    这样,就必须考虑第二个物理意义。  有第一种货币,和没第一种货币 2种集合。

    基于如果,我们能够设定第一种货币的价值为1。且为最小货币。 

    这样就得到了一个不同于上面广度优先的深度遍历公式。

    F(n,m) = n + F(n , m -1) +F(n -1, m-1) + ...+ F(0, m- 1) 分别相应第一种货币选择 0次,1次,..., n次

    由这个公式,我们是非常easy证明上界的。 但要用这个公式证明下界, 则非常难。


    1.16-1.19主要是讲怎样对数次求一个数的幂次方。

    坦率的说。 书本的解说不是那么让人easy理解。

    假设我们考虑二进制, 则问题就非常easy了。

    如果b为5。 则2进制为 101, a的5次方则为   (1) * a 的四次方 * (什么也不做)  *  a

    那么, 问题就非常明确了, 无论是迭代还是递归,干的都是一个事情, 从低位開始求b的二进制, 假设为1, 则做乘法。0就无视。

    每次将base平方。


    这4道题。 用后面的高阶函数来看的话,本质都是一样的。他们仅仅有算子的区别。

    即F函数的n次方, 等价于将n转化为2进制, 依次求f函数的平方运算。


    关于Fib数列。 书本的题目过于数学化, 我们换一个形式, 用数学工具矩阵来描写叙述就非常明确了。

    列矩阵[Fn+1 Fn]  = 矩阵A * 列矩阵Fn  Fn-1]

    矩阵A为  2 * 2的矩阵 [1 1 

                                    1 0]

    求Fib数列就转化为求A矩阵的n次方了。


    个人參考解答例如以下:

    1.16

    (define (expt b n)
        (define (even? n)
    (= (remainder n 2) 0))
        (define (square x) (* x x))
        (define (improve x)
    (if (even? x)
       (/ x 2)
       (/ (- x 1) 2)))
        (define (fast-expt-iter b counter product)
    (if (= counter 0)
       product
       (if (even?

    counter)
    (fast-expt-iter (square b) (improve counter) product)
    (fast-expt-iter (square b) (improve counter) (* product b)))))
        (fast-expt-iter b n 1.0))


    1.17 

    (define (mult-new a b)
        (define (even? b)
    (= (remainder b 2) 0))
        (define (double x) (+ x x))
        (define (halve x)
       (/ x 2))
        (define (fast-mult-new a b)
    (cond ((= b 0) 0)
         ((even? b) (double (fast-mult-new a (halve b))))
         (else (+ a (fast-mult-new a (- b 1))))))
        (fast-mult-new a b))


    1.18

    (define (mult-new a b)
        (define (even?

    b)
    (= (remainder b 2) 0))
        (define (double x) (+ x x))
        (define (halve x) (/ x 2))
        (define (improve x)
    (if (even?

    x)
       (halve x)
       (halve (- x 1))))
        (define (fast-mult-iter a counter product)
    (if (= counter 0)
       product
       (if (even? counter)
    (fast-mult-iter (double a) (improve counter) product)
    (fast-mult-iter (double a) (improve counter) (+ product a)))))
        (fast-mult-iter a b 0.0))


    1.19

    p' = p^2 + q^2

    q' = 2*p*q + q^2

    (define (fib n)
        (define (calc-p p q)
    (+ (* p p)
      (* q q)))
        (define (calc-q p q)
    (+ (* 2 p q)
      (* q q)))
        (define (fib-iter a b p q count)
    (cond ((= count 0) b)
         ((even? count)
          (fib-iter a
    b
    (calc-p p q)
    (calc-q p q)
    (/ count 2)))
         (else (fib-iter (+ (* b q) (* a q) (* a p))
         (+ (* b p) (* a q))
         p
         q
         (- count 1)))))
        (fib-iter 1 0 0 1 n))


  • 相关阅读:
    luogu P4587 [FJOI2016]神秘数
    luogu P4042 [AHOI2014/JSOI2014]骑士游戏
    luogu P2597 [ZJOI2012]灾难
    一则胡乱科普
    NJU Static Program Analysis 09: Pointer Analysis II
    NJU Static Program Analysis 08: Pointer Analysis I
    NJU Static Program Analysis 07: Interprocedural Analysis
    NJU Static Program Analysis 06: Data Flow Analysis IV
    LianYunGang OI Camp: Contest #2
    NJU Static Program Analysis 05: Data Flow Analysis III
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6961415.html
Copyright © 2011-2022 走看看