如何查找递归函数自己调用的次数?
考虑下面的递归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