-2
(defun sum-n-numbers(n)(if(=n 1)
1
(+N(sum-n-numbers(-n 1))))) 

编辑 2: 上面的代码运行,但是当我为输出键入 (SUM-N-NUMBERS 1 3 2) 时,它不起作用并且出现错误。 我知道这个简单的代码也可以由自动计算数字总和的 inbuild lisp 函数 (+ 1 3 2) 执行,但我有一个考试问题,要求使用 defun 函数计算 n 个数字的总和.(defun sum-n-numbers(n) (if(=n 1) 1 (+N(sum-n-numbers(-n 1)) )
)
)

编辑1:这是我得到的错误:

Error: Call ((LAMBDA (#:N) (DECLARE (SPECIAL:SOURCE #) (LAMBDA-NAME SUM-N-NUMBERS))                  (BLOCK #:SUM-N-NUMBERS (IF # 1 #))) 1 3 2) has the wrong number of arguments.
1 (abort) Return to level 1.
2 Return to debug level 1.
3 Return to level 0.
4 Return to top loop level 0.
4

3 回答 3

2

有什么问题:

(apply '+ '(1 3 2))

??

(defun sum (numbers)
  (if (null numbers)
      0
      (+ (first numbers) (sum (rest numbers)))))

(sum '(1 3 2))

没测试。我手头没有 lisp 解释器。

于 2013-03-06T18:14:36.593 回答
2

要得到你想要的:

(defun sum-n-numbers (&rest nums)
    (if (null nums) 0 
        (+ (car nums) (apply #'my-sum (cdr nums)))))

这将采用任意数量的参数并递归计算它们的总和。例如:

(sum-n-numbers 1 2 3) => 6

使用迭代,而不是递归:

(defun sum-n-numbers (&rest nums)
    (loop for num in nums summing num))

从用户的角度来看,它们是相同的,只是它们内部的工作方式略有不同。我已经测试了这两种方法以确保它们有效。

于 2013-07-19T17:01:14.687 回答
0

您编写的函数接受一个参数并将数字之和从 1 返回到参数(请注意,它永远不会返回 - 理论上 - 并且会因堆栈溢出而失败 - 实际上 - 对于负参数)。

该函数不能接受你传递给它的 3 个参数,所以你得到了一个错误。

于 2013-03-06T18:11:28.920 回答