在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
?
或者expt
和power
之间有什么区别?
答案 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))))))