首先反思一下, 昨天做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))

SICP 习题1.16-1.19体会的更多相关文章

  1. SICP 习题 (1.10)解题总结

    SICP 习题 1.10 讲的是一个叫“Akermann函数”的东西,去百度查可以查到对应的中文翻译,叫“阿克曼函数”. 就像前面的解题总结中提到的,我是一个数学恐惧者,看着稍微复杂一点的什么函数我就 ...

  2. SICP 习题 (1.41)解题总结

    SICP 习题1.41 看似和周边的题目没有关系,突然叫我们去定义一个叫double的过程,事实上这道题的核心还是高阶函数. 题目要求我们定义一个过程double,它以一个过程作为參数,这个作为參数的 ...

  3. SICP 习题 (1.7) 解题总结

    SICP 习题 1.7 是对正文1.1.7节中的牛顿法求平方根的改进,改进部分是good-enough?过程. 原来的good-enough?是判断x和guess平方的差值是否小于0.001,这个过程 ...

  4. SICP 习题 (1.14)解题总结

    SICP 习题 1.14要求计算出过程count-change的增长阶.count-change是书中1.2.2节讲解的用于计算零钱找换方案的过程. 要解答习题1.14,首先你需要理解count-ch ...

  5. SICP 习题 (1.8) 解题总结

    SICP 习题1.8需要我们做的是按照牛顿法求平方根的方法做一个求立方根的过程. 所以说书中讲牛顿法求平方根的内容还是要好好理解,不然后面这几道题做起来就比较困难. 反过来,如果理解了牛顿法求平方根的 ...

  6. SICP 习题 (1.9) 解题总结

    SICP 习题 1.9 开始针对“迭代计算过程”和“递归计算过程”,有关迭代计算过程和递归计算过程的内容在书中的1.2.1节有详细讨论,要完成习题1.9,必须完全吃透1.2.1节的内容,不然的话,即使 ...

  7. SICP 习题 (1.13) 解题总结

    SICP习题1.13要求证明Fib(n)是最接近φn/√5 的整数,其中φ=(1+√5)/2 .题目还有一个提示,提示解题者利用归纳法和斐波那契数的定义证明Fib(n)=(φn - ψn) / √5 ...

  8. SICP 习题 (2.7) 解题总结 : 定义区间数据结构

    SICP 习题 2.7 開始属于扩展练习,能够考虑不做,对后面的学习没什么影响.只是,假设上面的使用过程表示序对,还有丘奇计数你都能够理解的话,完毕这些扩展练习事实上没什么问题. 习题2.7是要求我们 ...

  9. SICP 习题 (2.6) 解题总结:丘奇计数

    SICP 习题 2.6 讲的是丘奇计数,是习题2.4 和 2.5的延续. 这里大师们想提醒我们思考的是"数"究竟是什么,在计算机系统里能够怎样实现"数".准备好 ...

  10. SICP 习题 (1.37)解题总结

    SICP 习题 1.37是一条非常长的题目,主要讲的是无穷连分式.无穷连分式对我来说又是一个陌生的概念,于是又去百度了一番,发现无穷连分式也是一个非常有意思的话题,涉及到无理数的表达.只是我建议大家还 ...

随机推荐

  1. html5 历史管理

    1.onhashchange:改变hash值来进行历史管理. <!DOCTYPE html> <html> <head> <meta charset=&quo ...

  2. 移动App服务端架构设计

      我从事手机app服务端开发现在已经是3个年头,自己也整理出了一套相对好用的服务架构,写出来,跟大家一起分享.如有不足,还请多指教. 一:基础流程图. 其实有一点还需要加上,就是对json的压缩和加 ...

  3. idea UML快捷键

  4. android 自定义view 前的基础知识

    本篇文章是自己自学自定义view前的准备,具体参考资料来自 Android LayoutInflater原理分析,带你一步步深入了解View(一) Android视图绘制流程完全解析,带你一步步深入了 ...

  5. [Luogu 2331] [SCOI2005]最大子矩阵

    [Luogu 2331] [SCOI2005]最大子矩阵 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 ...

  6. 【转载】cocos2dx 中 Android NDK 加载动态库的问题

     原文地址:http://blog.csdn.net/sozell/article/details/10551309 cocos2dx 中 Android NDK 加载动态库的问题 闲聊 最近在接入各 ...

  7. 20小时掌握网站开发(免费精品htmlcss视频教程)

    自己最近研发了一套新的htmlcss教程,并进行了授课实施,视频教程百度云下载链接如下: 视频及案例源码下载地址 本套教程视频需要安装屏幕录像专家软件才能观看,屏幕录像专家下载地址如下: 屏幕录像专家 ...

  8. matplotlib之pyplot 知识点滴

    以下是一些常用地址链接,请参考 matplotlib 官方网址 plt.plot()函数细节 Matplotlib 中文用户指南 4.6 编写数学表达式 Python seaborn matplotl ...

  9. py2exe打包遇到的问题

    py2exe打包python成.exe文件 打包过程和结果 1.创建setup脚本打包文件,其中设置打包的属性和方法.注意:尽量将被打包文件和此打包脚本放在同目录下(因为在尝试非同目录下时,出现了非可 ...

  10. jquery radio、 checkbox、 select 操作

    转载:http://www.haorooms.com/post/checkandselect $("input[id^='code']");//id属性以code开始的所有inpu ...