【问题标题】:Number of recursive calls in Recursive function analysis递归函数分析中的递归调用次数
【发布时间】:2012-08-29 04:46:21
【问题描述】:

使用 Robert Sedwick 的 C++ 书籍自学算法

一个递归函数,将大小为 N 的问题一分为二 它递归求解的独立(非空)部分调用自身 少于N次。

如果零件的尺寸为 k 且尺寸为 N-k,则总数 我们使用的递归调用数是 T(n) = T(k) + T(n-k) + 1,对于 N>=1,T(1) = 0。

解 T(N) = N-1 是直接归纳法。如果尺寸总和为 一个小于 N 的值,证明调用次数小于 N-1 来自相同的归纳论证。

我对上述文字的问题是

  1. 作者如何通过归纳得出解 T(N) = N-1?请帮助我理解。
  2. 作者所说的“如果大小总和小于 N,则调用次数小于 N-1 的证明来自相同的归纳论证”是什么意思?

我是数学归纳法的新手,所以很难理解。

感谢您的时间和帮助

【问题讨论】:

    标签: algorithm recursion


    【解决方案1】:

    (1) 归纳法:

    T(1) = 0 (base)
    T(N) = T(k) + T(N-k) + 1 (definition of problem)
    

    我们假设对于每个n < N,我们得到T(n) = n-1
    由于kN-k 都小于N,我们从归纳假设中得到:

    T(N) = (k-1) + (N-k-1) + 1 = N-1
             ^        ^
            T(k)    T(N-k)
    

    (2) 使用相同的论点: 如果

    T(N) = T(k) + T(m) + 1 where k+m < N
    

    那么同样的证明会导致T(N) &lt; N-1

    【讨论】:

    • 为什么在第二种情况下不添加+1,即T(N) = T(k)+T(m)+1?
    • @venkysmarty:是的,这是一个打字错误。
    【解决方案2】:

    对于你问题的第一部分,首先我应该提到我认为作者是错误的,因为你有这个递归方程:

    T(n) = T(k) + T(n-k) + 2 :因为对于 n > 1,您将两个较小的部分称为不是一个。 现在我们的假设是 2(n-1) 次递归调用。

    现在让我们用归纳法检查一下:

    T(1) -> no recursive call.
    T(2) = T(1) + T(1) + 2 : two recursive call.
    ...
    T(n) = T(k) + T(n-k) + 2 = 2(k-1) + 2(n-k-1) + 2 = 2n-2 = 2(n-1).
    

    对于你问题的第二部分,作者的意思是如果你分成两部分,使得部分的总和小于 n,比如大小为 k 的部分和另一部分大小为 n-2k 的 k > 1。

    【讨论】:

      【解决方案3】:

      首先,我们不是“通过归纳得出解决方案”,我们使用归纳来证明我们最初的猜测。现在,为了猜测,我们可以使用递归树等方法。
      在您的问题中,最坏的情况是k=1,因为它会导致最多的递归。我们还知道每个级别的成本:

      T(n) = T(1) + T(n-1) + 1 => T(n) = T(n-1) + 1
      

      现在我们必须找到T(n-1) 的成本并将其添加到成本T(n)=1
      我们猜测最终结果是N-1。在这一步中,我们使用归纳法来证明我们的猜测。

      更新:
      T(n) 的成本为 1 ( T(1) 为零,加上将要计算的 T(n-1) ,加上 1 => 1 ),T(n-1) 的成本也是一(具有相同的逻辑)。我们往下走 n-1 的深度。最后一个是 T(1),它是零。 (画一棵树,它会帮助你理解)。
      这种猜测增长顺序的方法称为recursion tree。现在你可以通过归纳来证明它。

      有关如何应用归纳法来证明假设的更多信息,请参阅 CLRS 等教科书。

      【讨论】:

      • 为什么我们要猜测最终结果是 N-1?而且我认为你的意思是我们添加 T(n-1)+1 来得到 T(n)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-14
      • 2020-04-21
      • 2018-04-10
      • 1970-01-01
      相关资源
      最近更新 更多