recursion - Common-Lisp 中的递归阶乘函数

标签 recursion input output lisp common-lisp

好的,我一直在学习 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/

相关文章:

javascript - Eloquent Javascript - ch4 - arraytoList - 递归

Python 字符串的所有可能组合

java - 使用递归将数组最小值的伪代码转换为 Java 代码

python - 多项式作为 Python 中的输入

jQuery - 从动态创建的输入中获取值

C语言读写文件的澄清

java - 为什么说我没弄错?

Python 3.4 程序从字符串生成子字符串集没有给出正确的输出

algorithm - CodeEval/序列转换代码超时

javascript - 在 HTML/JS/JQ 中通过按键更改 div 颜色