我没有在这个 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 个参数:

  1. 一个测试表达式
  2. 一个'then'表达式
  3. 一个可选的 'else' 表达式

在您的代码中,您提供了 4 个参数:

  1. (= n 0)

  2. (setq n 1)

  3. (setq pr (* n ( fact (- n 1))))

  4. (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