函数的第一部分是一个简单的cond语句。它本身可以完美运行,但是在添加其余功能时会导致意外错误。
通过时出现问题: (博览会2 0) (博览会2 1) 该函数对于n的任何其他正值都可以完美工作。
(defun expo (b n)
(cond ((= n 0) 1)
((= n 1) b))
(defparameter m (* b b))
(defun expo_iter (a b)
(cond ((= a n) b)
((= (+ a 1) n) (* b (sqrt m)))
((expo_iter (+ a 2) (* b m)))))
(expo_iter 2 m)
当(expo 2 0)'lisp连接意外丢失,连接被远程对等断开。'以前从来没有这个错误,有什么想法吗?
答案 0 :(得分:3)
此功能有很多问题。
cond
格式不正确,因为它根本不执行任何操作。可能应该。defparameter
(或defvar
或defconstant
)。而是使用let
。defun
。而是使用labels
(或flet
)。使用非顶级defun
&c使得它看起来好像是从Scheme转换而来的,很糟糕吗?与Scheme相当的不会那么残酷,但仍然无法终止。
然后,如果您实际上考虑该函数的功能,您将看到它为何无法终止的原因,并且如果不消除尾部调用,将会很快导致堆栈溢出,或者最终会死亡通过内存耗尽,因为bignum会检查是否存在。只需考虑一下递归的基本情况是什么。垃圾cond
应该做什么?