【问题标题】:Lisp Sum of powerLisp 总和
【发布时间】:2015-04-14 15:16:57
【问题描述】:

定义一个函数“power”,它接受两个输入参数 m 和 n,并返回 m^n。然后,通过使用函数“power”,定义一个函数 sum_power,它接受两个输入参数 m 和 n 并返回总和:(1^n + 2^n + 3^n +.... + m^n)。

int 第一个函数我从第二个函数中的给定参数计算功率总和。但是程序给出错误:程序堆栈溢出。重启... 我找不到我的错误。我检查了功能电源是否正确。

(defun power(m n)
  (let ((result 1))
    (dotimes (count n result)
      (setf result (* m result)))))

(defun sum_power (m n)
  (if (= 0 m)
      0
      (+ (powern m) 
         (sum_power (1- m) n))))

【问题讨论】:

  • 这段代码很难阅读。您需要对其进行格式化。

标签: lisp


【解决方案1】:

好的,当你传递变量 m 时,问题是你的函数 sum_power 表达式(- 1 m) 第一次是无限循环,因为例如

对于 m = 5 第一次 (- 1 m) => -4 (新 m = -4) 第二次 (- 1 m) => 5(新 m = 5)

重新开始,所以是一个递归无限循环,你永远不会到达 1,所以这是溢出的情况

使用构建函数 (1- m) 来减少 m 的值,或者如果需要,使用 (- m 1)

所以新的函数会是这样的,而且这不是尾递归,所以对于大 m 和 n 会花费很多时间,但是根据您的需要它应该可以工作,并且这个函数格式更好,请采纳编写lisp函数时fromatting方便阅读

(defun sum_power (m n)
  (if (= 1 m)
      1
      (+ (power n m) (sum_power (1- m) n))

【讨论】:

  • 谢谢你成功了。我在那里犯了这么愚蠢的错误。
【解决方案2】:

您的 sum_power 函数中存在参数顺序错误。当给定两个参数时,stand lisp 函数- 从第一个参数中减去第二个参数 (- 1 m) 将从一个中减去 m 而不是从 m 中减去 1,正如您可能预期的那样,因此您的结果将是一个负整数并且您的基本情况(= 1 m) 永远无法联系到。为了使您的代码正常工作,您必须将参数交换为 - 因此 (- m 1) 或者您可以使用 lisp 函数 1- (1- m) 从其唯一参数中减去一个,因此您的代码的更正版本如下:

(defun sum_power (m n)
   (if (= 1 m)
       1
       (+ (power m n) (sum_power (1- m) n))))

在一个不相关的旁注中,lisp 允许在函数、变量和宏名称中使用比大多数其他语言更多的字符,因此您可以使用 sum-power 而不是 sum_power,事实上它可以说是更好的 lisp 样式连字符连接多词标识符名称,而不是下划线(如在 C 中使用)或驼峰式大小写(在 Java 中使用 sumPower)。其次,右括号通常不是写在单独的行上,而是与右括号之前的最后一个表达式在同一行,正如我在上面的更正版本中所做的那样。如果您愿意,这些只是您可以遵循的约定,但您没有义务遵守。

【讨论】:

  • 我是 Lisp 新手,在 OO 语言之后很难使用它。 TY 为您提供建议和信息。
  • 我推荐 Practical Common Lisp 作为指南,gigamonkeys.com/book 它教授了 Common Lisp 的大部分功能,至少是最常用的功能。顺便说一句,Lisp 支持 OO 编程。
【解决方案3】:

为什么不使用高阶函数和循环宏?我认为这种方式更具可读性:

(defun power (n m)
   (reduce #'* (loop for x below n collect m))

(defun sum-power (n m)
   (reduce #'+ (loop for x from 1 to m collect (power x n)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 2011-08-06
    相关资源
    最近更新 更多