【问题标题】:Exercise 1.2 in Peter Norvig's Paradigms of Artificial Intelligence ProgrammingPeter Norvig 的人工智能编程范式中的练习 1.2
【发布时间】:2015-08-02 05:18:12
【问题描述】:

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

编写一个函数来求幂,或者将一个数字提升为整数 力量。例如:(power 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))))))

这当然是正确的。现在我觉得有点傻,但他不是在使用他实现的功能的内置版本吗?为什么我要使用expt 来实现power? 或者exptpower 有什么区别?

【问题讨论】:

  • 你确定他没有使用power 而不是expt?有勘误网站吗?
  • 我找到了一个勘误网站norvig.com/paip-errata.html,但里面没有。
  • 你说得对,norvig.com/paip/intro.lisp是这样写的
  • 感谢链接,我也查了勘误,找了一个在线版本,但找不到。
  • 如果他使用 power 而不是 expt 它实际上会陷入无限循环,因为 (power x 2) 最终会调用 (power x 2)。

标签: lisp common-lisp


【解决方案1】:

看起来他只是将这个用于平方数字的最简单情况,而不是用于所有一般情况。可能是因为这本书太早了,还没教他怎么绑定局部变量,所以就不想写了:

(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))))))

【讨论】:

  • 谢谢,至少我现在知道我没有错过重点。这仍然是一个奇怪的例子。尤其是偶数根本不需要做优化,他最好直接省略。
  • 需要优化以获得 O(log n) 性能,如文档字符串中所述:这会在 log n 时间内执行,因为要检查偶数 n。
猜你喜欢
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 2018-04-13
  • 2017-06-18
相关资源
最近更新 更多