Lisp力量之和

时间:2015-04-14 15:16:58

标签: lisp

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

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

(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))))

3 个答案:

答案 0 :(得分:0)

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

  

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

再次开始,所以是一个可重复的无限循环,你永远不会到达1所以这是溢出的情况

改为使用减少m值的构建函数(1- m),如果需要,则使用(- m 1)

所以新的功能将是这样的,这也就是没有尾递归所以对于大m和n它将花费很多时间,但是为了你的需要它应该工作,并且这个功能更好的格式化,请采取在编写lisp函数以便于阅读时解决问题

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

答案 1 :(得分:0)

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

(1- m)

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

答案 2 :(得分:0)

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

(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)))