解释上一篇博客我认为“BFS和DFS起初出错的原因”:
其实原来的代码并没有错,而是它运行时间过长,导致长时间内没有出结果,控制台就卡在那个地方,我就以为它错了。
我用原来我误以为是错的代码测试(不是我上一篇博客中后面附带的完整的正确的代码):
我用了一个很简单的图去测试,测试结果如下:
0.有向图(DG)!
1.无向图(UDG)!
请输入你要进行操作的编号:
0
请依次输入顶点数和弧数:
3 2
请依次输入顶点:
ABC
请依次输入边:
AC
BA
A→ C
B→ A
C→
深度遍历结果是:
A C B
广度遍历结果是:
A C B
Process returned 0 (0x0) execution time : 21.213 s
Press any key to continue.
这个就说明原先的代码也是没有错的,只是我原先的测试数据比这个稍加麻烦,而递归本来效率就低,又是在for循环中使用的递归,在层层调用情况下,消耗的时间较长,长时间内没有出结果。
我们都知道递归的效率很低。
递归相对有点难理解。
for循环中的递归更难理解。
我们首先先举一个相对比较简单的例子帮助我们理解:
#include<stdio.h>
void Recursion(int);
int main()
{
Recursion(2);
return 0;
}
void Recursion(int n)
{
int i;
for(i=1;i<=3;i++)
{
if(n>0)
{
Recursion(n-1);
printf("%d\n",n);
}
}
}
运行结果:
1
1
1
2
1
1
1
2
1
1
1
2
Process returned 0 (0x0) execution time : 3.278 s
Press any key to continue.
对于这种问题,我个人认为一个很好的办法就是去分层理解。
Recursion(2)-> 输出次数:3^1
调用3次Recursion(1)
输出三次2
每一次的Recursion(1)-> 输出次数:3^2
调用3次Recursion(0)
输出三次1
总共就会输出12次 思维导图如下:
可以理解为:
从左到右 从上到下 调用
从下到上 从右到左 返回
调用效果图:
返回效果图:
最后的输出就按照返回效果图输出:
1 1 1 2
1 1 1 2
1 1 1 2
这一个比较简单的就已经是这样了,如果我把参数换大一点,那将会有更多的输出,我们也可以用同样的方法理解:
大家如果感兴趣的话,可以把Recursion的参数换大一点,或者把循环的次数换大一点,去控制台看输出效果:
#include<stdio.h>
void Recursion(int);
int main()
{
Recursion(9);
return 0;
}
void Recursion(int n)
{
int i;
for(i=1;i<=9;i++)
{
if(n>0)
{
Recursion(n-1);
printf("%d\n",n);
}
}
}
我这还只是9,就已经堪比“死循环”了:
输出次数:
9^1
9^2
9^3
9^4
9^5
9^6
9^7
9^8
9^9
=9^10-1
=3486784400
谨慎使用“递归+for循环”(嵌套)!!!