【问题标题】:Recursion tracing in lisp... could use some advicelisp 中的递归跟踪......可以使用一些建议
【发布时间】:2020-08-13 01:53:24
【问题描述】:

有人能抽出一点时间帮助我理解为什么在 Lisp 中的这个小函数中始终评估为 true 吗?

(defun fob (n)
   (if (= n 10)
      'true
      (fob (+ n 1))))

继续评估跟踪到:

  0: (FOB 5)                                                                                                                                                                                  

    1: (FOB 6)                                                                                                                                                                                

      2: (FOB 7)                                                                                                                                                                              

        3: (FOB 8)                                                                                                                                                                            

          4: (FOB 9)                                                                                                                                                                          

            5: (FOB 10)                                                                                                                                                                       

            5: FOB returned TRUE                                                                                                                                                              

          4: FOB returned TRUE                                                                                                                                                                

        3: FOB returned TRUE                                                                                                                                                                  

      2: FOB returned TRUE                                                                                                                                                                    

    1: FOB returned TRUE                                                                                                                                                                      

  0: FOB returned TRUE 

我不明白为什么它返回“真”,即使显然 6 不等于 10。我只是读错了跟踪吗?任何帮助,将不胜感激。 :)

【问题讨论】:

  • 它递归地加 1 直到 n 与 10 匹配,此时返回 true 以支持递归调用。尝试用大于 10 的值调用它,看看会发生什么。
  • 所以基本上我读错了跟踪......如果我理解正确,它不会发送真正的递归调用,因为在每个递归调用它评估为真,这只是因为它确实在 n = 10 处评估为真,它表示整体为真?此外,使用大于 10 的数字调用它会使它像我预期的那样失控。我正在尝试理解递归,并制作了一个我知道会评估为 true 的非常简单的函数,以帮助理解正在发生的事情,而跟踪的输出让我失望了。
  • 有点。调用在两种情况下返回 true:(1) n = 10 在自身内部或 (2) 如果 n != 10,则使用 n+1 再次调用该函数并返回任何结果。如果某个子调用返回 true(即某个子调用中的 n = 10),则父函数也将返回 true。
  • 哎呀...我想我现在明白了。非常感谢您的宝贵时间。非常感谢。

标签: lisp


【解决方案1】:

正如 cmets 中所讨论的,递归有两个组成部分:基本情况(不进行递归调用的条件)和递归情况。跳过基本情况的递归函数可以通过递归情况返回值。

在您的示例中,每次调用将 1 加到 n 将达到基本情况 n = 10(假设 n 开始于 <= 10--如果它开始于 > 10,您将有无限递归因为基本情况是不可达的)。当调用确实到达n = 10 时,基本情况将返回true,它一直传递回调用堆栈。对于您的函数,只有两种可能的结果:无限递归或返回 true。

这解释了为什么所有函数都为 n = 5 返回 true;尽管他们的基本情况直到n = 10 才成立,但子调用的结果是。

【讨论】:

    猜你喜欢
    • 2016-04-13
    • 2022-01-23
    • 2011-12-28
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多