【问题标题】:What is the difference between the two summation functions in Common Lisp, thanksCommon Lisp中的两个求和函数有什么区别,谢谢
【发布时间】:2018-10-27 00:44:56
【问题描述】:

两个代码示例都是求和公式:

代码示例 1

(defund sigma (func n)
        (cond ((= n 1)(funcall func 1)
        (t (+ (sigma func(1- n))
           (funcal func n))))))

代码示例 2

(defund sigma(n)
        (cond ((= n 1)1)
        (t (+ n(sigma func(1- n))))

【问题讨论】:

  • 这些函数都不会计算你所说的它们所做的。第二个函数引用了一个未定义的变量func。您的缩进毫无希望,使代码极难阅读。您没有指定这是哪种语言。我不知道defund 应该是什么。如果您希望有人回答,我强烈建议您解决此问题。
  • defund 不是 Common Lisp 中的标准运算符;你能提供一个来自哪个库的引用,或者在你的问题中添加一些关于它的文档吗?
  • 您的第二个defund 似乎没有将func 作为参数,只是n。然而它引用了func 并且似乎将它传递给了它自己。这可能是神秘defund的一些特征;在常规 defun 下,这是错误的:函数 sigma 只能用一个参数调用。

标签: lisp common-lisp elisp


【解决方案1】:

两个代码示例都是求和公式

不,他们没有。当第二个对数字求和时,第一个以数字作为参数调用一个函数并对结果求和。 在数学符号中的 sigma 之后,它将有 f(i) 而不仅仅是 i。在高阶函数术语中,它是一个术语函数。以下是使用10 的一些示例:

(sigma (lambda (v) 1) 10) ; ==> 10 in CL I'd use (sigma (constantly 1) 10)
(sigma #'1+ 10)           ; ==> 65
(sigma #'identity 10)     ; ==> 55

第二个只会产生第三个例子:

(sigma 10) ; ==> 55

PS:您的函数有语法错误和拼写错误,我刚刚忽略了。您需要先修复这些问题才能正常工作。最难的可能是第一个 cond 术语中缺少结尾括号,这使得cond 只有一个术语,而第二个函数也传递了func,这没有意义,因为它的版本只接受一个参数。

【讨论】:

    猜你喜欢
    • 2016-02-18
    • 2012-03-25
    • 2011-04-20
    • 2010-10-07
    • 2012-06-28
    • 2014-07-12
    • 2012-01-16
    • 1970-01-01
    相关资源
    最近更新 更多