好的,我一直在学习 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 is NOT a number。”
我试过使用 cond
而不是 if
但无济于事。
作为旁注,最令人困惑的是,我看到很多地方都是这样写代码的:
(defun fact(n)
(if (= n 1)
1
(* n (fact (- n 1)))))
这对我来说甚至没有意义,因为 1 只是漂浮在那里,周围没有括号。然而,稍微修改一下(在函数外写额外的行)我可以让它执行(同样令人困惑!)。
但这不是我想要的!我希望阶乘函数能够打印/返回值,而无需在其外部执行其他代码。
我做错了什么?
最佳答案
实际上需要使用 FINISH-OUTPUT
刷新可移植代码中的 I/O 缓冲区 - 否则 Lisp 可能想要读取一些内容,但尚未打印提示。您最好将 SETQ
替换为 LET
,因为 SETQ 不引入变量,它只是设置变量。
(defun factorial (n)
(if (= n 1)
1
(* n (factorial (- n 1)))))
(write-line "Please enter a number...")
(finish-output) ; this makes sure the text is printed now
(let ((x (read)))
(format t "~D! is ~D" x (factorial x)))
关于recursion - Common-Lisp 中的递归阶乘函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47602677/