【问题标题】:Let being called multiple times in recursion让在递归中被多次调用
【发布时间】:2014-12-09 21:12:53
【问题描述】:

我正在尝试声明一个局部变量以在递归函数中使用,但每次函数递归时似乎都会调用我的 let 。我希望调用一次 let 函数来声明一个变量并将其赋值为 nil,然后我想在我的递归函数中更新这个局部变量的值,而不是在每次递归时擦除它。

这是我的代码的简化框架。

(defun recursive-function (l1 l2)
    (let ((?x nil))
    (cond (...
           ...
           ... ;trying to update value of ?x here with (setf ?x 5)
           (recursive-funtion (rest l1)(restl2)) ;recursive call made
           ))))

【问题讨论】:

  • 如果您有其他编程语言(例如 C)的经验,考虑类比 void foo() { int x = 1; x++; printf("%d",x); foo(); } 可能会有所帮助。您希望每次都能看到2 打印出来。 (除非您将 x 声明为 static,但 Common Lisp 没有这种意义上的静态变量。)

标签: recursion lisp common-lisp let


【解决方案1】:

你写的正是你说你不想要的;递归函数内部的一个局部变量,应该在每次传递时更新它。如果我对您的理解正确,您需要执行类似的操作

(defun recursive-function (l1 l2)
  (let ((?x nil))
    (labels ((actual-recursion (a b)
               (cond (...
                      ...
                      ...
                      (actual-recursion (rest a) (rest b))))))
      (actual-recursion l1 l2))))

这样每个递归调用都不会创建?x 的新绑定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 2018-04-10
    • 2015-08-14
    • 2012-08-29
    • 1970-01-01
    相关资源
    最近更新 更多