这不是家庭作业。在以下代码中:
(defparameter nums '())
(defun fib (number)
(if (< number 2)
number
(push (+ (fib (- number 1)) (fib (- number 2))) nums))
return nums)
(format t "~a " (fib 100))
由于我对 Common Lisp 缺乏经验,我不知道为什么该函数不返回值。我试图打印斐波那契数列的第一个“n”值,例如 100。
谢谢你。
您的函数无条件返回nums
(但前提是return
存在被调用的变量)。要了解原因,我们可以将其格式化为:
(defun fib (number)
(if (< number 2)
number
(push (+ (fib (- number 1)) (fib (- number 2))) nums))
return
nums)
如果number
小于2
,则它无number
用地计算表达式,并丢弃结果。否则,它将(+ ....)
表达式的结果推送到nums
列表中。然后它无用地评估return
,丢弃结果。如果调用的变量return
不存在,那就是错误情况。否则,它会进行评估nums
,这就是返回值。
在 Common Lisp 中,有一个return
操作符用于终止和返回匿名命名块(名称为符号的块nil
)。如果您使用 定义命名函数defun
,则存在一个非匿名的不可见块:它与该函数具有相同的名称。在这种情况下,return-from
可以使用:
(defun function ()
(return-from function 42) ;; function terminates, returns 42
(print 'notreached)) ;; this never executes
某些标准的控制流和循环结构会建立一个隐藏的匿名块,因此return
可以使用:
(dolist (x '(1 2 3))
(return 42)) ;; loop terminates, yields 42 as its result
如果我们使用(return ...)
但没有封闭的匿名块,那就是一个错误。
该表达式(return ...)
与 just 不同return
,后者计算以符号命名的变量return
,并检索其内容。
不清楚如何修复您的fib
功能,因为需求未知。将值推入全局列表的副作用通常不属于这样的数学函数,它应该是纯的(无副作用)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句