SICP 习题 (1.26) 解题总结
2014-02-26 00:27
176 查看
SCIP 习题1.26是对expmod过程的讨论。
我不知道这道题对你来说是否简单,我个人是觉得比较简单。
题目说的是一个叫Louis Reasoner的人将expmod 过程实现成下面这个样子:
注意其中的关键是将:
改成了:
这个改动看上去很小,其实影响很大。
如果对前面有关应用序的讨论和“折半法”还有印象的话,解这道题问题不大。
原来的expmod过程之所以可以在对数步数内完成,是因为将两次变换转成了一次变换,如今使用下面的代码把一次变换有变成了两次变换:
因为按应用序的规则,所有参数是计算出结果再代入,而不同的参数是分别计算的,即使两个参数的公式是一样的,系统也会计算两次。而这里的参数又恰好是递归调用,本来递归调用一次的简单递归变成了递归调用两次的树形递归,计算效率就变的差很多了。
好,到这里就解题结束!
我不知道这道题对你来说是否简单,我个人是觉得比较简单。
题目说的是一个叫Louis Reasoner的人将expmod 过程实现成下面这个样子:
(define (expmod base exp m) (cond (( = exp 0) 1) ((even? exp) (remainder (* (expmod base (/ exp 2) m) (expmod base (/ exp 2) m)) m) (else (remainder (* base (expmod base (- exp 1) m)) m))))
注意其中的关键是将:
(square (expmod base (/ exp 2) m))
改成了:
(* (expmod base (/ exp 2) m) (expmod base (/ exp 2) m))
这个改动看上去很小,其实影响很大。
如果对前面有关应用序的讨论和“折半法”还有印象的话,解这道题问题不大。
原来的expmod过程之所以可以在对数步数内完成,是因为将两次变换转成了一次变换,如今使用下面的代码把一次变换有变成了两次变换:
(* (expmod base (/ exp 2) m) (expmod base (/ exp 2) m))
因为按应用序的规则,所有参数是计算出结果再代入,而不同的参数是分别计算的,即使两个参数的公式是一样的,系统也会计算两次。而这里的参数又恰好是递归调用,本来递归调用一次的简单递归变成了递归调用两次的树形递归,计算效率就变的差很多了。
好,到这里就解题结束!
相关文章推荐
- WCF 使用 Entity Framework 配合 Unity 进行 IOC AOP 的实现
- GridView简单使用
- cocos2dx项目中使用cocostudio ui编辑器的导出文件
- IOS开发之dispatch_once创建单例
- Windows脚本初探之WScript与CScript的区别
- 单元测试之道——基于junit的java单元测试 的读书笔记与思考
- 黑马程序员------for语句练习题
- 4年成为一个产品线的架构师!我操,我他妈太慢了!
- 字符串的处理。Split(分割),Substring(截取),Contains(包含),Replace(替换),StartsWith,EndsWith
- SWT/JFACE的table中加入控件 事件监听
- 有什么样的羽毛球品牌可供选择?
- tablefooterview的显示问题 解决方案
- 打听nofollow标签能力做好网站seo优化
- LLVM language 参考手册(译)(3)
- BT5R3被最新的Kali替代!!
- 构造和为指定值的表达式:±1±2±3±4±5=3 确定符号
- 求解(树的子结构问题-何海涛100题)
- 安装多个VS 出现这个问题
- 【前端盲点】事件的几个阶段你真的了解么???
- 通过init-connect + binlog 实现MySQL审计功能