(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.
答案 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个参数,因此出错。