常见的lisp函数中的表达式和arithemetics

时间:2012-10-08 18:45:36

标签: list functional-programming lisp common-lisp

我正在尝试编写一个函数,使得P(x)对于任何整数x都有一个包含三个元素的列表,即n的正方形,立方体和四次幂但我仍然坚持我如何组合然后制作一个功能,例如我有方形,立方体和功率4功能 这是我的职能

(defun p(x) (* x x))

(defun p(x) (* x x x))

(defun p(x) (expt x x) //thought i am not sure about this one

如果我在执行程序后有一个function p(x)列表,有没有办法让我的结果(即(4 27 256))列表看起来像( 2 3 4)?考虑到mapcar function虽然我不确定如何能够解决这个问题。有什么建议?

3 个答案:

答案 0 :(得分:4)

是的,mapcar可能是一种方法。

;; a simple solution.
(defun expt-list (n powers)
  (mapcar #'(lambda (x) (expt n x)) powers))

;; a bit more complex, so you  don't compute powers of the same 
;; base multiple times.
(defun expt-list-memoize (n powers)
  (let ((hash (make-hash-table)))
    (mapcar #'(lambda (x)
                (let ((y (gethash x hash)))
                  (if y y (setf (gethash x hash) (expt n x)))))
            powers)))

答案 1 :(得分:1)

Common Lisp中有一个奇怪之处,就是必须要识别:如果你想通过符号引用一个函数,你必须用(函数p)或缩写#'p

鉴于

(defun p(x) (* x x))

你可以用

计算一个方格列表

CL-USER> (mapcar #'p (list 1 2 3 4))

(1 4 9 16)

答案 2 :(得分:0)

这里的要求有点模糊,但如果意图是,如果(expt-list 2 3 4)之类的调用已经返回了每个数字的列表,例如:

(expt-list 2 3 4)
=> (4 27 256)

会有以下几点:

(defun expt-list (&rest list-of-n)
  "return a list of each 'n' in LIST-OF-N raised to its own power"
  (loop for n in list-of-n collect (expt n n)))

诀窍?