【问题标题】:lisp program to calculate the sum of n numberslisp程序计算n个数字的总和
【发布时间】:2013-03-06 17:29:13
【问题描述】:
(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.

【问题讨论】:

  • 你得到什么错误?
  • @JackManey 感谢您的回复,这是我得到的错误:` 错误:调用 ((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) 进行一些阅读和实验 - 这是您的考试!

标签: lisp


【解决方案1】:

有什么问题:

(apply '+ '(1 3 2))

??

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

(sum '(1 3 2))

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

【讨论】:

  • 如何更改此代码以便用户可以输入 n 个参数
【解决方案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))

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 2022-07-07
      相关资源
      最近更新 更多