【问题标题】:re-write without using set, setf or setq不使用 set、setf 或 setq 重写
【发布时间】:2017-05-09 22:51:46
【问题描述】:

我需要一些帮助才能在不使用 SET、SETF 或 SETQ 的情况下用 common lisp 重写这个函数(我也不能使用循环),我希望有人能帮助我。 这是代码:

(defun apply-values (DictValues Monomial)
   (let ( (Coeff (monomial-coefficient Monomial))
          (Vars (varpowers Monomial))
          (Acc 1) )
     (mapcar (lambda(x)
               (setf Acc (* Acc (expt 
                                  (cdr (assoc (varpower-symbol x) DictValues))
                                  (varpower-power x))))) 
             Vars)
     (* Coeff Acc)))

我的问题在于以 mapcar 开头的那一行。

提前感谢您的帮助!

【问题讨论】:

  • 缩进,拜托!

标签: loops functional-programming lisp common-lisp clisp


【解决方案1】:

对列表的重复累积操作称为reduction

(defun apply-values (DictValues Monomial)
   (reduce #'*
           (mapcar 
               (lambda (x)
                   (expt (cdr (assoc (varpower-symbol x) DictValues))
                         (varpower-power x)))
               (varpowers Monomial))
           :initial-value (monomial-coefficient Monomial)))

使用适合情况的高阶函数允许函数式风格,而无需显式命名中间值。代码更清晰,更不容易被人工编码器出错。

【讨论】:

  • @user7337963 作为另一个练习,尝试摆脱中间地图车。
  • @coredump 非常好的建议!确实,OP 应该尝试一下,如果他们有问题,就问另一个问题。提示:这是关于用定制的 lambda 函数替换 #'*(在草率的伪代码中,reduce (combining a x) (map f xs) == reduce (combining a (f x)) xs)。详细信息在 CLHS 中(答案中的链接)。
猜你喜欢
  • 2010-10-26
  • 2010-11-01
  • 2019-04-09
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
相关资源
最近更新 更多