练习1.2在Peter Norvig的人工智能编程范式中

时间:2015-05-20 19:14:48

标签: lisp common-lisp

在Peter Norvig的人工智能编程范式的练习1.2中,读者被要求

  

编写一个指数函数,或将数字提升为整数   功率。例如:(功率3 2)= 3 ^ 2 = 9。

提供的解决方案是:

  (defun power (x n)
    (cond ((= n 0) 1)
          ((evenp n) (expt (power x (/ n 2)) 2))
          (t (* x (power x (- n 1))))))

当然这是对的。现在我觉得有点愚蠢,但是他不是使用他实现的功能的内置版本吗?为什么要使用power实施expt? 或者exptpower之间有什么区别?

1 个答案:

答案 0 :(得分:2)

看起来他只是用这个来解决一个数字的最简单的情况,而不是用于所有一般情况。这可能是因为这是在本书的早期,在他讲授如何绑定局部变量之前,所以他不想写:

(defun power (x n)
  (cond ((= n 0) 1)
        ((evenp n)
         (let ((temp (power x (/ n 2)))
           (* temp temp)))
        (t (* x (power x (- n 1))))))

它不能使用(power (power x (/ n 2)) 2),因为这会导致无限递归。虽然可以通过添加另一个基本案例来处理:

(defun power (x n)
  (cond ((= n 0) 1)
        ((= n 2) (* x x))
        ((evenp n) (power (power x (/ n 2)) 2))
        (t (* x (power x (- n 1))))))