如何用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
原创粉丝点击