CLISP如何不使用setf等命令式变量输出小于上限的斐波那契序列
问题原因
- 原有代码将上限参数同时用作递归步长计数器,每次调用执行
(1- n)操作导致上限值不断被修改,当判断a < n时使用的已经不是最初传入的上限阈值,最终触发终止条件时漏掉了小于原始上限的89。 - 条件判断逻辑结构错误,原有代码的括号配对与分支逻辑不符合需求,错误将终止条件和递归触发条件写反。
修复后代码
(defun fibonacci (limit &optional (a 0) (b 1)) (if (>= a limit) nil (cons a (fibonacci limit b (+ a b)))))
实现说明
- 全程不对上限参数
limit做修改,递归调用时直接传递原始值作为阈值判断依据,完全不需要使用set/setq/setf等命令式变量声明语句,通过可选参数传递斐波那契计算的中间状态,符合纯函数式实现要求。 - 终止条件设为当前计算值
a大于等于上限时返回空,否则就将当前值加入结果序列,继续递归计算下一个斐波那契数。 - 调用
(fibonacci 100)即可得到预期输出(0 1 1 2 3 5 8 13 21 34 55 89)。
内容的提问来源于stack exchange,提问作者Budgetninja
相关产品推荐
相关产品推荐

