SICP 1.20体会

1.20 主要是让大家体会两种运算序的差别的。

网上找了一些答案,都是死展开的。 大家是搞IT的, 死展开就不搞IT的做法。

先考虑应用序列

我们得到

gcd(206, 40) -> gcd(40, 6) -> gcd(6, 4) -> gcd(4,2)->gcd(2,0)  总共4次递归调用,每次递归做一次取余数运算。

那么, 正则序列怎么知道呢? 一种办法是完全按步骤做法, 这是计算机思维。 搞IT的就要换数学思维。

先看看规律, 206-> 40-> 6-> 4 -> 2   存在某种序列关系。我们设定一个序列A,表示求该数所需的余数次数,那么必然有

A[0] = 0, A[1] = 0, A[2] = 1, A[3]  = 1+ A[1] + A[2], A[n]  = 1 + A[n-1] + A[n-2] 为什么?

因为 An = r(A[n-1], A[n-2]) 按照正则求值规则,我们先要展开A[n-1],A[n-2], 最后再计算A[n]。必然有该公式。

接下来考虑如何用A来求答案。

通过代码可以知道, 前面的递归, 只有if 里用到了b, 最后一次递归, 用到了a

所以展开次数为

A[1] + A[2] + A[3] + A[4] + A[5]  + A[4]  = 0 + 1 + 2 + 4 + 7 + 4  = 18次

同样的,通过A可以求得任何两个数的正则展开次数。

时间: 2024-11-03 20:12:59

SICP 1.20体会的相关文章

C开发者眼中的SICP学习

谈谈自己看SICP的一些体会 第一章  构造过程抽象 这一章其实和C语言完全等价, 不打算深入学习LISP的完全可以快速略过. 基本上没有什么大的价值. 这一章最核心的价值就是下面3句话, 理解了这一章就算看完了. 语言的原型系统 ·如何组合 ·如何提供高层抽象 这3句话是所有语言的核心. 基本上适用所有人. 为什么有人3天学会Java, 有人3年. 关键就在你是否深入理解语言的这3点. 学习任何语言都是直接奔这个主题.所以,有些查字典的完全可以跳过.任何语言, 3天足够入门了. 后面的递归和迭

JAVASE(十五) 泛型 :泛型用例、自定义泛型类、通配符

1.泛型在集合中的使用 1.1 在集合中使用泛型之前的例子 ? 为什么要有泛型(Generic)? 1. 解决元素存储的安全性问题2. 解决获取数据元素时,需要类型强转的问题 ? ? 1.2 在集合中使用泛型例子1 List<String> list = new ArrayList<String>(); list.add("aaaa"); List<Integer> list2 = new ArrayList<Integer>(); li

u近一年很变态个v分

http://ypk.39.net/search/all?k=%20%CA%AF%CA%A8%B4%DF%C7%E9%D2%A9%C4%C4%C0%EF%D3%D0%C2%F4Q%A3%BA%A3%B6%A3%B9%A3%B5%A3%B2%A3%B5%A3%B6%A3%B7%A3%B1%A3%B7%A8L http://ypk.39.net/search/all?k=%A1%FD%CF%C9%D3%CE%B4%DF%C7%E9%D2%A9%C4%C4%C0%EF%D3%D0%C2%F4Q%A3%

SICP 习题 (2.20)解题总结: 不确定数量参数

SICP 习题 2.20 引入了一种新的函数调用方式,就是带 . 符号的不确定参数调用方式. 题中也讲到了, Scheme支持这种调用方式,如果我们把方法定义成下面这个样子 (define (my-method first-p . others-p) ;-.. ) 我们就可以在调用方法my-method时传入大于2的任何数量的参数,比如: (my-method 1 2 3 4 5 6) 这时my-method获得两个变量,first-p是1,而others-p是一个list,成员有2 3 4 5

TIOBE2017年4编程开发语言排名和20年经验体会

可以访问链接查看详细排名 https://www.tiobe.com/tiobe-index/ 每月一次的语言热门排行榜又发布了,当然国外的语言热门程度和国内还是有一定的区别,不过也可以作为参考,大家一起说下自己工作的语言,给想要学习的同学做一些借鉴,我先说下我了解和熟悉的一些语言.首先声明不保证观点都正确,只是根据我近20年的学习和研发经验得出的体会,我也不会认为哪种语言最好,只是每种语言有不同的应用场景. 先说下我各种开发使用语言的背景,这样你也能判断出我那些体会是有价值的. 先说我现在工作

SICP 1.23-1.26体会

1.23 代码改动很简单, 关键是时间. 电脑上算了一下, 100000000以下全是0, 开始还以为代码写错了. 最后没办法, 用1e10 1e11来计算, 发现比 1e11 1e12快1.2-1.5之间.比2小.想了半天也给不出很合理的解析. 开始以为是对3 5 7 取余数 比 4 6 8 要慢, 测试了一下,发现也不是这么一回事.网上有人怀疑是函数调用花了一定时间做if 判断, 老实说这东西性能影响也不应有这么大. 现在唯一想到的,就是编译器做了一些优化,导致性能不完全取决于调用次数. 这

SICP 习题1.1 -1.15体会

下午没事, 开始做题, 花了3个多小时, 做到了1.15. 主要都花在了14题上, 下界的证明想了1个小时还是无法证明,只能暂时放弃, 明天看看算法导论再尝试下. 1.1 没啥好说的, 就是让你熟悉环境 1.2 没啥好说的, 就是让你转换思维,将中缀思维转换为前缀思维. 这个的确有点反人类.大概也是lisp最让人不爽的吧. 1.3 就是让你熟悉cond使用的,也没啥好说 1.4 有点惊喜, 的确比C语言更牛.运算符和变量函数等价了. 1.5 让大家体会下应用序的副作用. 很久前,刚开始编程就死在

【SICP练习】7 练习1.20

练习1.20 这道题要求我们分别在正则序和应用序的情况下来研究书中的gcd函数,并且还要算出实际执行remainder运算的次数. 题目中先问的正则序后问的应用序,但由于应用序比较简单,我们先来看看应用序: (gcd 206 40) (gcd 40 6) (gcd 6 4) (gcd 4 2) (gcd 2 0) 2 因此(gcd 206 40)共调用了5次remainder函数. 再来看看正则序的情况: (gcd 206 40) (gcd 40 (remainder 206 40)) (gcd

生活体会2014.11.20

昨天计划了一下到年底要做的事情,到年底的时候是非常忙碌的.昨天看解析几何曲面,看的着实头疼,开始看动漫到很晚.我不过分指责自己,因为每个人都会有懒散的时候,自己应该安排好自己的作息,昨天睡的太晚,今天9点20起床,现在心很累,很乏.只有自己有规律的生活了,自己的身体才能活到80岁.我把自己的年龄设置到80岁,60岁前工作,后面的时间自由自由的去生活.我还是准备把网开了,自己以前担心网会冲了我的生活,会不珍惜时间,自从手机能撑网以后,自己睡觉时间越来越短,作息时间越来越不规律,此次把网开了,一是希