Lisp循环代码问题咨询:实现a<15时乘b并返回>15的a
Lisp循环逻辑调试指导
你的代码如下:
(defun add-them(a b) (loop (if(< a 15) (setq a (* a b)) (write a) ) (when(> a 15) (return a)) ) ) (print (add-them 3 5))
针对你要实现的逻辑(循环检查a是否小于15,是则乘b;当a大于15时返回),给你几个调试方向:
- 先看边界条件处理:当a等于15的时候,你的
if分支会执行write a而不是乘法,之后when (> a 15)的条件也不满足,循环会一直跑下去。想想你需要对等于15的情况做什么处理?是继续乘b还是直接返回? - 检查
if分支的必要性:你的目标是返回最终的a值,write a这个操作是不是多余的?它只会在a不小于15的时候输出,但这时候你还没返回,反而可能导致不必要的输出。 - 梳理循环执行顺序:每次循环先执行
if里的操作,再判断是否返回。那第一次循环后a变成15,接下来的循环里既不会修改a,也不会触发返回,直接进入死循环。你需要调整判断条件的阈值,或者调整操作的顺序。 - 测试小案例:比如调用
(add-them 3 5),手动走一遍循环流程,看看每一步a的值变化,就能发现哪里卡住了。 - 思考Lisp的
loop特性:loop可以用更简洁的语法表达循环逻辑,比如用while或者until子句,不过先把基础逻辑跑通再优化写法也可以。
内容的提问来源于stack exchange,提问作者oglilprettythug
相关产品推荐
相关产品推荐

