You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归中保留变量:如何在Lisp递归函数中输出初始传入值

递归函数中保留初始值的解决方法

你的代码问题在于每次递归调用cprog时,let都会创建新的d绑定,最后递归到x=5时,当前层的d就是5,所以只会打印5。这里完全不需要用到gensym——gensym的作用是生成唯一符号避免命名冲突,和当前的变量作用域问题无关。

下面提供两种常用的修改方案:

方案一:添加可选参数传递初始值

通过新增一个可选参数,在第一次调用时默认绑定初始值,后续递归始终传递这个初始值:

(defun cprog (x &optional (initial-x x))
  (if (< x 5)
      (cprog (1+ x) initial-x)
      (print initial-x)))

方案二:使用内部递归函数

在外层let中保存初始值,内部定义递归函数直接访问这个外层变量:

(defun cprog (x)
  (let ((initial-x x))
    (labels ((recurse (current-x)
               (if (< current-x 5)
                   (recurse (1+ current-x))
                   (print initial-x))))
      (recurse x))))

两种方案都能实现“打印传入的初始值”的需求,比如调用(cprog 1)会输出1,调用(cprog 3)会输出3。

内容的提问来源于stack exchange,提问作者Mattias Smedstad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 10:52:41