【问题标题】:LISP Loop through listLISP 循环遍历列表
【发布时间】:2015-03-29 16:47:57
【问题描述】:

我有一个函数“power”,它给我数字的平方,而其他函数需要对列表中的每个数字的平方求和。但它告诉我未定义的函数,我真的无法让它工作。

(defun power (x)
  (if (numberp x) (* x x) 0)
)
(defun sum (l)
  (loop for i in l do(setq s(+ (power (i)) s)))
    print s)

【问题讨论】:

  • 什么是(ii)?函数调用?为什么? print s 是什么?试着记住如何在 Lisp 中编写函数调用。还要考虑什么应该是函数调用,什么不是。
  • 什么(ii)?你的意思是力量(i)?这是一个函数调用。
  • 但不是在 Lisp 中。 power (i) 不是 Lisp 中的函数调用。 Lisp 中函数调用的语法是什么?
  • prints s 应该打印 s 的值 .... 但它不起作用...
  • 你会如何编写函数调用?

标签: loops lisp common-lisp


【解决方案1】:

例子:

CL-USER 12 > (loop for i in '(1 2 3 4) sum (power i))
30

CL-USER 11 > (reduce #'+ '(1 2 3 4) :key #'power)
30

CL-USER 14 > (defun sum (l &aux (sum 0))
               (dolist (i l sum)
                 (incf sum (power i))))
SUM

CL-USER 15 > (sum '(1 2 3 4))
30

【讨论】:

    【解决方案2】:

    它给你这个错误是因为你把 i 放在括号中(编译器将其视为函数调用)...(power (i))...,而它应该是 ...(power i)...。至于打印只是忽略打印语句和 让函数返回 s 的值,如下所示。

    (defun power (x)
      (if (numberp x) (* x x) 0)
    )
    (defun sum (l)
      (setq s 0)
      (loop for i in l do
         (setq s (+ (power i) s)))
       s)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 2018-10-26
      • 2013-09-04
      • 2019-04-15
      相关资源
      最近更新 更多