如何用sheme写迭代
来源:互联网 发布:天气预报软件哪个好 编辑:程序博客网 时间:2024/04/28 22:10
scheme解决问题的思路基本是用递归,看SICP,居然叫读者用迭代来解答练习题。
用惯了递归来写递归,现在换成用迭代,突然感觉到很别扭,不过还是有规律的。如下。
1.先确定目的函数f1的输入参数,
2.在f1函数体中抽象出一个函数f2,f2的输入参数至少包括一个计数器、一个保存计算结果的状态变量,外加f1的参数。然后确定计数器的初始值和结果状态变量的初始值。
3.在用尾递归来实现f2。在f2的终止测试语句中,测试计数器和f1参数。如果满足条件,就返回保存结果的状态变量,否则就改变计数器的值,然后将运算结果保存进保存结果的状态变量,然后递归逼近终止条件。
我们举个例子:用scheme来迭代实现求N!的结果。首先,我们先确定目的函数,以及计数器和结果变量的初始值。
这个很好确定。目的函数的输入参数肯定只有一个。因为1!=1,所以计数器的初始值为1,结果变量的初始值为1。代码如下:
#
(define product(lambda (n)pro-iter(1 1 n)))
接着,我们定义我们抽象出来的pro-iter函数:
#
(define pro-iter(lambda (counter pro n)(cond((> counter n) pro)#测试计数器(else (pro-iter (+ counter 1) (* pro counter) n))#尾递归,counter加1,不断逼近终止条件)))
用类似的思路,我们可以迅速写出幂函数的scheme迭代版本。
</pre><pre name="code" class="plain">#
(define expt(lambda (b n)(expt-iter 0 1 b n)))(define expt-iter(lambda (counter res b n)((= counter n) res)(else (expt-iter (+ counter 1) (* res b) b n))))
写出来的迭代其实还是一个递归函数。是不是感觉scheme写出来的迭代很怪异??
哈哈,因为scheme本来就是专为递归而生。
0 0
- 如何用sheme写迭代
- sheme
- 如何用2.0发信?
- 想知道socket如何用
- 如何用英语杀价?
- 如何用C画图
- 问如何用文件
- 如何用JSP编程
- 如何用PS切图
- ssl如何用
- 如何用FreeType写字
- 如何用计算机发财
- 如何用JAVA 对象?
- 如何用JDO查询
- 如何用tadodataset.append
- 如何用VS Debug
- 如何用SplitViewController控件
- 如何用php分页?
- 23个设计模式的简明教程
- 毕业生自传-7
- CentOS6.2安装配置Squid
- Android开发学习记录2
- 胜利大逃亡——BFS
- 如何用sheme写迭代
- scanf和getchar使用问题
- MFC窗口客户区全屏显示以及PICTURE控件全屏显示
- SqlServer 2008优化:Merge 和 Except
- jquery选择器 【radio checkbox】选择 【查找div下的表单具有某种属性的控件 :注意是div下】
- wcf学习--建立最简单的WCF服务
- ny 844 A+B Problem(V)
- Biorhythms——中国剩余定理
- P1035