lisp程序计算n个数之和

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

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

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

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

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

该函数无法接受传递给它的3个参数,因此出现错误。

有什么问题:

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.
?


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

要准确获取所需内容:

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

(sum '(1 3 2))
这将获取任意数量的参数并递归计算它们的和。例如:

(和数12 3)=>6

使用迭代而不是递归:

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

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

你会遇到什么错误?@JackManey感谢你的回答,这就是我遇到的错误:`error:Call((LAMBDA(#:N)(DECLARE(SPECIAL:SOURCE#)(LAMBDA-NAME SUM-N-NUMBERS))(BLOCK#:SUM-N-NUMBERS(IF#1#))1 3 2)的参数数错误。1(中止)返回到级别1。2返回到调试级别1。3返回到0级。4返回顶部循环级别0。`@JackManey我已经编辑了我的问题,以便很容易读取错误。现在,您需要以正确的方式格式化Lisp函数…(1)了解在其他语言中您可能认为是操作或标点符号的字符可以组成Lisp中的有效符号(2)用空格和(3)分隔符号不要滥用这样一个事实,即您的Lisp阅读器似乎通过使用一致的大小写将字母字符转换为大写。(4)进行一些阅读和实验-这是您的考试!如何更改此代码,以便用户可以输入n个参数
(defun sum-n-numbers (&rest nums)
    (if (null nums) 0 
        (+ (car nums) (apply #'my-sum (cdr nums)))))
(defun sum-n-numbers (&rest nums)
    (loop for num in nums summing num))