循环

循环

循环是一种思维, 不是一种算法, 但它却是算法的基础。

几乎所有的算法中,都包含着循环,有一大部分算法就是以循环为主。

而循环,又以FOR 循环常用,在此,主要介绍一下FOR循环。

 
   FOR 循环,有什么好介绍的呢,大家司空见惯,熟悉的不能再熟悉了,岂不是浪费口舌?

我也曾经以为对于FOR循环,已经懂了,已经理解了。

但,有时,我却不能很好的应用,这说明:我还没有真正理解,只是知其然不知其所以然。

今天,清晰的梳理一下For循环,力图去掉迷雾,直指本质。

君子务本,本立而道生。

1 循环的方向

提起FOR循环,一般想到:

for (int i=0;i<n;i++)  // 首先确定下循环的初始值 最小值 0
{
    // other codes
}

而 忽略掉

for (int i=n-1;i>=0;i--)   // 首先确定下的初始值 最大值 n-1
{                                                                                                                                   // other codes
}

这两者有什么关系呢?

1) i 的范围都是【0,n-1】,因此,这是二者的联系 ,不是二者的区别

2) 第一个循环 是从0到n-1,而第二个循环是从n-1到0

第二点,表明了: 循环是有方向的,这也是我们通常不在意的地方。

通常情况下, 从前往后遍历和从后往前遍历,所实现的效果是一样的。

但有些情况,却只能使用一种遍历方向,如下所示:

 
    //  正确方式
    //  删除容器某元素后,位于该元素之后的位置 其索引需要及时调整,而位于该元素之前的位置,索引不变
    //  从后往前删除是正确的
    for (int i=num-1;i>=0;i--)
    {
        if(a[i]==3)
            Delete(a[i]);
    }
    //  错误方式
    //  删除容器某元素后,位于该元素之后的位置 其索引需要及时调整,而位于该元素之前的位置,索引不变
    //  从前玩后删除是错误的  因为后面元素的索引改变了 不再为i
    for (int i=0;i<n;i++)
    {   
        // i 有可能越界
        if(a[i]==3)
            Delete(a[i]);
    }

综上所述: 循环有一个极易被人忽视的属性:方向—即遍历元素是由前往后,还是由后往前。

2 循环目的

由上可知,循环可以用于遍历数组。

而另一个用途更广,那便是控制次数。

比如:

 
   
int n=0;
// 计算1-10之和
for (int i=1;i<=10;i++)
{
    n+=i
}
 
int n=0;
// 计算1-10之和
for (int i=1;i<=10;i++)
{
    n++;
}

一个综合例子—冒泡排序主程序:

 
// i 为数组未排序部分的 最后一个元素的索引
// 外层循环 从后往前
for (int i=len-1;i>=1;i--)
{
    // 内层循环 从前往后
    for (int j=0;j<i;j++)
    {
        // j 元素索引   
        // a[j] 与a[j+1] 进行比较
    }
}