考虑以下递归C函数。
void get (int n) {
if (n<1) return;
get (n-1) ;
get (n-3) ;
printf ("%d", n) ;
}
如果在get(6)
中调用了main()
函数,那么在返回主get()
之前调用0
函数的次数是多少?
答案 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