如何找到递归函数调用自身的次数?
How can I find number of times a recursive function calls itself?
考虑以下递归 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)
("one"),而不是 if (n<l)
("ell")。另外,请注意我添加了一个 depth
参数。这使我能够适当地缩进每个调用。
我们可以对上述函数做一个递归关系为:
T(n) = T(n-1) + T(n-3) + 2
T(n)=1 for n<=0
我在等式中添加了 2
,因为我们调用了两次递归函数。
首先将 n=1
替换为 n=6
,您将得到答案 25
考虑以下递归 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)
("one"),而不是 if (n<l)
("ell")。另外,请注意我添加了一个 depth
参数。这使我能够适当地缩进每个调用。
我们可以对上述函数做一个递归关系为:
T(n) = T(n-1) + T(n-3) + 2
T(n)=1 for n<=0
我在等式中添加了 2
,因为我们调用了两次递归函数。
首先将 n=1
替换为 n=6
,您将得到答案 25