【发布时间】:2018-05-16 02:34:21
【问题描述】:
好的,我一直在学习 COMMON LISP 编程,并且正在开发一个非常简单的程序来计算给定整数的阶乘。很简单吧?
到目前为止的代码如下:
(write-line "Please enter a number...")
(setq x (read))
(defun factorial(n)
(if (= n 1)
(setq a 1)
)
(if (> n 1)
(setq a (* n (factorial (- n 1))))
)
(format t "~D! is ~D" n a)
)
(factorial x)
问题是,当我在 CodeChef 或 Rexter.com 上运行此程序时,我收到类似的错误:“NIL 不是数字。”
我尝试使用 cond 而不是 if 无济于事。
顺便说一句,最令人困惑的是,我见过很多地方写这样的代码:
(defun fact(n)
(if (= n 1)
1
(* n (fact (- n 1)))))
这对我来说甚至没有意义,1 只是漂浮在那里,周围没有括号。但是,只要稍加修改(在函数之外编写额外的行),我就可以让它执行(同样令人困惑!)。
但这不是我想要的!我希望阶乘函数可以打印/返回值,而无需在其外部执行其他代码。
我做错了什么?
【问题讨论】:
-
你的函数
factorialreturn有什么作用? -
其他问题:
x未定义,a未定义,write-line之后 I/O 缓冲区未清空。 -
对于调试,您可能需要查看回溯。此外,STEP 和 TRACE 可能会为您提供有关计算的见解。
标签: recursion input output lisp common-lisp