我没有在这个 autolisp 中阶乘
i did not factorial in this autolisp
我尝试在这段代码中进行阶乘,但我没有得到答案。
(defun fact(n)
(if (= n 0)
(setq n 1)
(setq pr (* n ( fact (- n 1))))
(print pr)
)
问题是您为代码中的 if
表达式提供了太多参数。 if
语句最多接受 3 个参数:
- 一个测试表达式
- 一个'then'表达式
- 一个可选的 'else' 表达式
在您的代码中,您提供了 4 个参数:
(= n 0)
(setq n 1)
(setq pr (* n ( fact (- n 1))))
(print pr)
您还缺少右括号。
要更正您的代码,可以将最终的 print
表达式移到 if
表达式之外,并且 pr
变量应声明为局部变量,即:
(defun fact ( n / pr )
(if (= n 0)
(setq n 1)
(setq pr (* n (fact (- n 1))))
)
(print pr)
)
但是,虽然代码在语法上是正确的,但您现在会收到错误:
; error: bad argument type: numberp: nil
这是因为,当 n
为 0 时,变量 pr
未定义,因此 print
表达式将 return nil
,导致与递归调用的 return 相乘失败。
然而,虽然可以修改代码以在 n=0
时定义 pr
,但实际上并不需要此变量,代码可能变为:
(defun fact ( n )
(if (< 0 n) (* n (fact (1- n))) 1)
)
该函数现在将 return 计算出的阶乘的值:
_$ (fact 5)
120
我尝试在这段代码中进行阶乘,但我没有得到答案。
(defun fact(n)
(if (= n 0)
(setq n 1)
(setq pr (* n ( fact (- n 1))))
(print pr)
)
问题是您为代码中的 if
表达式提供了太多参数。 if
语句最多接受 3 个参数:
- 一个测试表达式
- 一个'then'表达式
- 一个可选的 'else' 表达式
在您的代码中,您提供了 4 个参数:
(= n 0)
(setq n 1)
(setq pr (* n ( fact (- n 1))))
(print pr)
您还缺少右括号。
要更正您的代码,可以将最终的 print
表达式移到 if
表达式之外,并且 pr
变量应声明为局部变量,即:
(defun fact ( n / pr )
(if (= n 0)
(setq n 1)
(setq pr (* n (fact (- n 1))))
)
(print pr)
)
但是,虽然代码在语法上是正确的,但您现在会收到错误:
; error: bad argument type: numberp: nil
这是因为,当 n
为 0 时,变量 pr
未定义,因此 print
表达式将 return nil
,导致与递归调用的 return 相乘失败。
然而,虽然可以修改代码以在 n=0
时定义 pr
,但实际上并不需要此变量,代码可能变为:
(defun fact ( n )
(if (< 0 n) (* n (fact (1- n))) 1)
)
该函数现在将 return 计算出的阶乘的值:
_$ (fact 5)
120