LISP中的递归和尾递归

    首先解释一下概念:

    递归:是指在函数的定义中使用函数自身的方法。递归一词还较常用于描述以自相似方法重复事物的过程。

     尾递归:在计算机科学里,尾调用是指一个函数里的最后一个动作是一个函数调用的情形:即这个调用的返回值直接被当前函数返回的情形。这种情形下称该调用位置为尾位置。若这个函数在尾位置调用本身(或是一个尾调用本身的其他函数等等),则称这种情况为尾递归,是递归的一种特殊情形。

    通常的递归会不断的进行函数的压栈等操作,效率有时候会比较低。在一些先进的编译器中可以对尾递归进行优化,从而不用减轻传统递归的效率低下问题。我们看看神奇的LISP语言如何实现递归和尾递归。

(defun factor-1 (n)
 "Calculate the factor of n"
 (if (= n 0)
  1
  (* n (factor-1 (- n 1)))))
  上述函数编写很简单。首先解释一下这个程序,其中defun是定义函数的关键字。LISP的任何函数调用都是用括号的形式。函数声明结束后的一对双引号的内容表示这个函数的文档。可以使用(documentation factor-1)的形式提取出来。LISP的函数名字基本没有任何限制,不像一般语言对可用的符号存在限制。一般常量使用+XX+,宏使用*XX*,普通参数就使用一般的名字。LISP的命名style是利用横线-,而不是下划线或者匈牙利的方式。这个语句的意思是,如果n是0,则直接返回1,否则返回n*factor-1(n-1)。

(defun factor-2 (n)
  "Tail recursive edition"
  (factor-help n 1))

(defun factor-help (n m)
 "Tail recursive help function of factor-2"
 (if (= n 0)
  m
  (progn
   (factor-help (- n 1) (setf m (* m n))))))
  其中定义了两个函数。factor-2 (n)表示计算阶乘的函数,factor-help(n m)表示辅助会函数。通过它来实现尾递归的计算。

你可能感兴趣的:(CLISP,递归,lisp,LISP)