lisp程序计算n个数的总和

时间:2013-03-06 17:29:13

标签: lisp

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

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

编辑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.

3 个答案:

答案 0 :(得分:2)

出了什么问题:

(apply '+ '(1 3 2))

...

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

(sum '(1 3 2))

没试过。我手边没有lisp口译员。

答案 1 :(得分: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))

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

答案 2 :(得分:0)

你编写的函数接受一个参数并返回从1到参数的数字之和(注意它永远不会返回 - 理论上 - 并且在实践中它会因堆栈溢出而失败 - 用于否定参数)。

该函数不能接受传递给它的3个参数,因此出错。