首页 > 代码库 > SICP 习题1.1 -1.15体会
SICP 习题1.1 -1.15体会
下午没事, 开始做题, 花了3个多小时, 做到了1.15。
主要都花在了14题上, 下界的证明想了1个小时还是无法证明,只能暂时放弃, 明天看看算法导论再尝试下。
1.1 没啥好说的, 就是让你熟悉环境
1.2 没啥好说的, 就是让你转换思维,将中缀思维转换为前缀思维。 这个的确有点反人类。大概也是lisp最让人不爽的吧。
1.3 就是让你熟悉cond使用的,也没啥好说
1.4 有点惊喜, 的确比C语言更牛。运算符和变量函数等价了。
1.5 让大家体会下应用序的副作用。 很久前,刚开始编程就死在C语言的 if ( a || b)上。老实说,个人很讨厌这种编译器优化技术。
1.6 和1.5类似
1.7 这个题目很有意思, 让大家深入体会迭代的收敛条件有多重要。事实上, 书本没有展开讲, 迭代的初始化条件也很重要。
比如, 1.0就只能得到正数根, -1.0就能得到负数根。所有, 没有写明约束条件的话, 写的代码都是错的。
解法就是将收敛条件 改为 (新的迭代值 - 旧的迭代值 ) / (旧的迭代值) 的绝对值 < 0.001
1.8 主要是让你体会没有高阶函数, 反复做Ctrl +C Ctrl+V 有多呕心。
1.9 这个题目在MIT的视频上讲得比书本好多了, 建议看视频。 递归和迭代的本质区别就是, 递归必须将消息(结果)传回调用者, 而迭代则完全不需要。
1.10 数学题, 主要思路是先从低纬度开始递归,再不断提高到高纬度。
1.11 就是让你练练手,看看不是真学会了。
1.12 主要目的是让大家体会如何总结递归公式。 不过,老实说这本书重点也不在教会大家如何写递归。
1.13 这个题目有点意思, 搞过高中数学竞赛的估计一下就能反应过来,看到Fn = Fn-1 + Fn-2, 我们应该立即想到 x^2 = x +1
显然, theta 和 r 均为这个方式式的2个根。余下的证明就转化为验证 F0 和F1是不是满足公式了。
1.14 第一步是归一化, 与具体是什么常数无关,所以我们可以转为为最小货币为1元。 线性空间就是求解树的最大层数, 很显然最长的树为一直选1的树, n。
关于时间复杂度, 其实就是转化树的节点数。F(n, m) m为货币种类数
先考虑的是就1种货币,显然节点数为n, 即为0(n)
然后考虑2种货币, 节点数就为 F(n, 2) = F(n, 1) + F(n-1, 1) + ... + F(1, 1) 容易猜出来为O(n的2次方)
那么对m,是不是为n的m次方呢。 关于上界, 用数学归纳法,很好证明。 现在就死在下界的证明上了。想了1个小时,还是无头绪。
1.15 比较简单,尾递归, 实质是迭代, 迭代次数为 以3为底的对数 log3 (x * 10)
SICP 习题1.1 -1.15体会