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

考虑下面的递归C函数。如何查找递归函数自己调用的次数?

void get (int n) { 

if (n<1) return;

get (n-1) ;

get (n-3) ;

printf ("%d", n) ;

}

如果get(6)功能被称为main()那么有多少次将get()函数返回到主0之前被调用?

回答:

要计算函数被调用的次数,每次输入函数时都会增加一个静态计数器,并在调用后打印出该值。例如:

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);

}

回答:

考虑到这当然是一个学术活动,它可能是你理解递归如何工作。

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

#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)(“一个“),而不是if (n<l)(”ell“)。另外请注意,我添加了一个depth参数。这允许我适当地缩进每个呼叫。

以上是 如何查找递归函数自己调用的次数? 的全部内容, 来源链接: utcz.com/qa/257766.html

回到顶部