递归函数分析中的递归调用数

时间:2012-09-04 13:49:36

标签: algorithm recursion

使用C ++中的Robert Sedwick一书自我阅读算法

  

一个递归函数,它将大小为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的证据来自相同的归纳论证”?
  3. 我是数学归纳的新手,因此难以理解。

    感谢您的时间和帮助

3 个答案:

答案 0 :(得分:2)

(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) < N-1

答案 1 :(得分:0)

对于你问题的第一部分,首先我应该提一下,在我看来作者是错的,因为你有这个递归方程式:

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。 1。

答案 2 :(得分:0)

首先,我们没有“通过归纳来解决方案”,我们使用归纳来证明我们的初步猜测。现在,为了猜测我们可以使用像递归树这样的方法 在您的问题中,最坏的情况是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)的成本也是1(具有相同的成本)逻辑)。我们按n-1的深度下降。最后一个是T(1),它是零。 (画一棵树,它会帮助你理解) 这种猜测增长顺序的方法称为recursion tree。现在你可以通过归纳来证明它。

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