Lisp 幂和

Lisp 幂和,lisp,Lisp,定义一个函数“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)

定义一个函数“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))))

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

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

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

请改用生成函数
(1-m)
,该函数会减小m的值,如果需要,也可以使用
(-m1)

因此,新函数将是这样的,而且这是无尾递归,因此对于大m和n,这将需要很多时间,但出于您的需要,它应该可以工作,并且此函数的格式更好,请在编写lisp函数时使用fromatting,以便于阅读

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

和幂函数中有一个参数顺序错误。stand lisp函数
-
在给定两个参数时,从第一个参数中减去第二个参数,即
(-1 m)
将从1中减去m,而不是从m中减去1,正如您可能预期的那样,因此您的结果将是一个负整数,并且永远不会达到基本情况
(=1 m)
。要使代码正常工作,您必须将参数交换为
-
,因此
(-m1)
,或者您可以使用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,事实上,使用连字符连接多个单词标识符名称,而不是下划线(如C中所用)或驼背式大小写,可以说是更好的lisp风格(Java中使用的sumPower)第二,右括号通常不是写在单独的一行上,而是与右括号前的最后一个表达式在同一行上,正如我在上面的更正版本中所做的那样。这些只是惯例,如果您愿意,您可以遵循它们,但不必遵守。

为什么不使用高阶函数和循环macro?我认为这样更具可读性:

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

这段代码很难阅读。你需要对它进行格式化。谢谢你。我犯了一个愚蠢的错误。我是Lisp新手,在OO语言之后很难使用它。谢谢你的建议和信息。我推荐实用的Common Lisp作为指南,它教你Common Lisp的大部分功能,至少是最常用的功能。顺便说一下,Lisp支持面向对象编程。