浅析“for循环+递归(嵌套使用)”---for循环中使用递归

解释上一篇博客我认为“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循环”(嵌套)!!!

发布了34 篇原创文章 · 获赞 38 · 访问量 2632

猜你喜欢

转载自blog.csdn.net/qq_43779149/article/details/104503878