如何查找递归函数调用自身的次数?

时间:2015-02-12 06:36:49

标签: c recursion

考虑以下递归C函数。

 void get (int n) { 
    if (n<1) return; 
    get (n-1) ; 
    get (n-3) ; 
    printf ("%d", n) ; 
    }

如果在get(6)中调用了main()函数,那么在返回主get()之前调用0函数的次数是多少?

3 个答案:

答案 0 :(得分:5)

要确定调用函数的次数,每次输入函数时都会递增静态计数器,并在调用后打印出值。例如:

int counter;
void get (int n) { 
    ++counter; /* increment counter before first return */
    if (n<1) return; 
    get (n-1) ; 
    get (n-3) ; 
    printf ("%d", n) ; 
}

int main()
{
    counter = 0; /* reset counter before each use */
    get(6);
    printf("get() was called %d times\n", counter);
}

答案 1 :(得分:3)

考虑到这肯定是一个学术练习,你可能应该理解递归是如何工作的。

我们可以修改您的代码以打印出一个调用树,显示每个调用:

#include <stdio.h>

void get(int n, int depth)
{ 
    static int call = 1;
    printf("%3d: %*sget(%d)\n", call++, 2*depth, "", n); 
    if (n<1)
        return; 
    get(n-1, depth+1); 
    get(n-3, depth+1); 
}

int main(void)
{
    get(6, 0);
    return 0;
}

<强>输出:

  1: get(6)
  2:   get(5)
  3:     get(4)
  4:       get(3)
  5:         get(2)
  6:           get(1)
  7:             get(0)
  8:             get(-2)
  9:           get(-1)
 10:         get(0)
 11:       get(1)
 12:         get(0)
 13:         get(-2)
 14:     get(2)
 15:       get(1)
 16:         get(0)
 17:         get(-2)
 18:       get(-1)
 19:   get(3)
 20:     get(2)
 21:       get(1)
 22:         get(0)
 23:         get(-2)
 24:       get(-1)
 25:     get(0)

请注意,我假设您的作业状态为if (n<1)(&#34;一个&#34;),而非if (n<l)(&#34; ell&#34;)。另外,请注意我添加了depth参数。这使我能够适当地缩进每个电话。

答案 2 :(得分:2)

我们可以为上述函数建立一个递归关系:

T(n) = T(n-1)  +  T(n-3) + 2

T(n)=1 for n<=0

由于我们两次调用了递归函数,因此我在方程式中添加了2

首先从n=1的{​​{1}}替换为n=6的ans