递归中保留变量:如何在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
相关产品推荐
相关产品推荐

