函数的迭代

来源:百度知道 编辑:UC知道 时间:2024/09/22 19:31:02
教一下,详细点,谢谢!

迭代相当于其他语言中的循环,由于LISP语言一切均为函数,所以其迭代也是通过函数实现的。

迭代也是一种主要的函数定义手段,尤其是熟悉象PASCAL这样的过程型语言的用户,可能更习惯于使用迭代而不是递归。使用迭代往往比使用递归效率高和节省内存,但有些问题使用递归要比使用迭代简单、明了。如上面定义过的COUNTATOMS函数,若只单纯地使用迭代,其定义要复杂得多。而且递归是"纯"的LISP定义手法,迭代只是为了增加更多的定义手段才增加到LISP中来的。
最常用到的迭代,是通过PROG函数实现的,PROG函数本身没有什么具体的含义,它只起到一种可以进行迭代的媒介作用。在PROG函数内,可以使用GO函数转到某个给定的标号,也可以通过RETURN函数退出PROG,并使得PROG的返回值为RETURN的参量值。
例如,使用PROG迭代定义阶乘函数:
这里给出的是使用迭代方法,而非递归方法定义的阶乘函数。
(DEFUN N!(n)
通过PROG函数实现迭代,其中的((result 1))定义了一个局部变量result,其初始值为1。该变量只在PROG函数内部有效。在这里变量result用于记录计算的结果。
(PROG((result 1))
LOOP为循环标记,可以通过GO函数返回到这里。LOOP只是一个标记,也可以使用其他的符号表示。这种标记只可以在PROG(或者其他与PROG类似的函数)内部使用。
LOOP
通过条件函数COND定义,当n为0或为1时,回送结果result。其中函数RETURN是跳出PROG的函数。
(COND((= n 0)(RETURN result))
((=n 1)(RETURN result))
其他情况下,将n乘以result,并使得n等于n-1,通过GO函数,跳转到LOOP处,循环执行。
(T(SETQ result(* n result))
(SETQ n(- n 1))
(GO LOOP)))))
紧跟在PROG后面的表,说明了result是一个局部变量,其初始值为1,下面的LOOP是一个标号,当n=0或n=1时,通过RETURN