Lisp 幂和
定义一个函数“power”,它接受两个输入参数m和n,并返回m^n。然后,通过使用函数“power”,定义一个函数sum_power,它接受两个输入参数m和n并返回总和:(1^n+2^n+3^n+..+m^n) int第一个函数我计算第二个函数中给定参数的幂和幂。但程序给出了错误:程序堆栈溢出。重置。。。 我找不到我的错误。功能电源正确,我检查过了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)
(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支持面向对象编程。