java中的流程控制结构(二)——循环结构

本文详细介绍了Java中的三种主要循环结构:while、do-while和for,包括它们的语句结构、运行原理以及实例。重点强调了while和do-while的区别,以及for循环的简洁性。同时讨论了循环嵌套的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在java中使一部分代码按照指定次数或一定条件反复执行的流程控制结构就是循环结构,循环结构可以分为while循环、do while循环和for循环三类,其中比较常用的是while循环和do while循环。但是需要特别注意区分while循环和do while循环的运行原理,避免混淆。

 while循环

         while循环是除了for循环外,最常使用的循环结构,它的语句格式可以表述如下:

                                             初始化语句;

                                           while(判断条件语句){

                        ​​​​​​​        ​​​​​​​        ​​​​​​    ​   循环体语句;

              ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​ 控制条件语句 

                                             }

        while循环的执行流程为,由初始化语句开始进入循环体结构,对判断条件语句进行判断,如果判断条件语句输出的boolean类型的值为true那么就执行循环体语句,并且改变控制条件语句的值,然后将这个值返回道判断语句中,如果输出的boolean类型的值仍为true,那么就重复上面的流程,直到判断体语句输出的boolean类型的语句为false,循环结束。

        比如在下面的程序中,要求打印0~120之间所有能被5整除的数。初始化语句让 i 这个数从0开始进入循环结构,先判断这个数是否在0~120之间,如果在,那就判断它能否被5整除,如果能就将其打印,如果不能,就跳过,并且将这个数加上1并将加1后的值赋继续赋给 i ,再判断是否再0~120之间,如果在,那就重复上面的操作,直到 i 这个数不再这个范围内才跳出循环。

public class WhileZuoYe02 {
    public static void main(String[] args){
        int i = 0;
        while(i<121){
            if(i%5==0){
                System.out.println(i);
            }
            i++;
        }
    }
}

        值得注意的是,在以上的流程中,初始化语句和控制条件语句是有可能被省略的,最典型的例子就是死循环,如下面的代码所示,并没有初始化语句和控制条件语句,当运行程序时,电脑会不停的打印 I love you!。除非手动停止,程序才会停止打印 I love you!

public class SiXunHuan {
    public static void main(String[] args) {
        while(true){
            System.out.println("I love you!");
        }
    }
}

do while循环

        如果while循环用一句话来说是当满足某个条件时做一件事,那么do while循环用一句话来说就是做某一件事直到不满足某个条件时结束。do while的语句格式如下所示:

                                初始化语句;

                                do{

                                        循环体体语句;

                                        控制条件语句;

                                   }

                                while(判断条件语句);

        比如在下面的程序中,要求计算1~100的累加结果,首先对数据进行初始化,定义sum用以储存累加结果,定义i = 0,让数据从0开始变化,随后进行一次累加,累加结束,i自动加1,然后在while中判断是否满足条件,即判断条件语句输出的boolean值是否为true,如果是,则还需要执行循环体,直到 i > 100时,不满足 i <= 100 这个条件,那么循环结束,跳出循环结构。 

/**
 * 用循环结构计算1到100的累加和,用以演示do-while的使用
 */
public class DoWhileDemo {
    public static void main(String[] args){
        int i = 0;
        int sum = 0;
        do{
            sum += i;
            i++;
        }while(i<=100);
        System.out.println("计算结果为:"+sum);

       
    }
}

 

 

         从上面的循环流程中,能够很明显的发现while循环和do while循环的区别。while循环是先判断是否符合条件再执行循环体,而do while循环不同,不论是否满足条件,程序都要先执行一次循环体才进行条件判断。这种区别在下面的这个代码中对比尤为明显,首先对数据初始化,j 和 k 的值均为0,j < 0 、k < 0明显不成立,也就是说在while循环和do while 循环中,判断条件语句输出的结果均为false,在这种情况下,通过程序运行结果能发现,while循环没有执行循环体语句直接跳出了循环,而do while循环先执行了一次循环体语句,随后才跳出循环。

**
 * 演示do-while的使用
 */
public class DoWhileDemo {
    public static void main(String[] args){
        
        int j = 0;
        while(j<0){
            System.out.println(j);
            j++;
        }

        int k = 0;
        do{
            System.out.println(k);
            k++;

        }while(k<0);
    }
}

 

for循环

        相对于while循环和do while循环 ,for循环的使用更为广泛,代码结构也更为简单。它的运行流程与while循环在某种程度来说是一样的,只是语句在程序中的位置不同而已。for循环的结构为:

                        for(初始化语句;判断条件语句;控制条件语句){

                                       //循环体

                                 }

        通过与while循环进行比较,能发现,如果将循环体插入判断条件语句和控制条件语句中间,那么它的语句顺序就只是将whlie循环中的语句横过来而已,它的循环流程可以用下面的图片来体现

            又如下面的程序中,要倒序打印1~100之间的整数,首先初始化 i 的值为100,然后进入判断条件语句,100>0成立,于是执行循环体,打印数字100,随后执行控制条件100减去1变成99,然后又进入判断条件语句进行循环,直到 i = -1时,-1>0 不成立,于是跳出循环程序结束。

/**
 * 使用for循环倒序打印出1到100间的数字
 */
public class ForZuoYe01 {
    public static void main(String[] args){
        for(int i = 100;i>0;i--){
            System.out.print(i+"\t");
        }
    }
}

 循环的嵌套

        在java中,针对循环的嵌套结构,主要是对for循环来说的,对于for循环的嵌套,只要弄清楚它的运行原理,它的使用也就自然懂了,这里我们使用一个程序来研究它的运行原理。

        在下面这个程序中,首先定义 i = 1,然后判断 i<5 成立于是执行第一个循环体,循环体中定义 j = i,即将 i 的值赋给 j,所以此时 j 的值为1,1 < 5成立,于是执行第二个循环体,打印了第一个 * 号,然后执行j++,j 的值变成2,2<5成立,再次执行第二个循环体,打印第二个 * 号,j++,j 的值变成3,3<5成立,执行第二个循环体,打印第三个 * 号,再次执行j++,j 的值变成4,4<5成立,执行第二个循环体打印第四个 * 号,执行j++,j 的值变成5,5 <5不成立,退出第二个循环,执行System.out.println();进行换行操作,至此此第一个循环体执行完次,执行i++,i 的值变成2,2<5成立,再次执行第一个循环体,j = i,将 i 的值赋给j,j 的值变为2,2<5成立,执行第二个循环体,打印第五个 * 号,j++,j 的值变为3,3<5成立,执行第二个循环体,打印第六个 * 号,j++,j 的值变为4,4<5成立,执行第二个循环体打印第七个 * 号,j++,j 的值变为5,5<5不成立,退出第二个循环,执行System.out.println();进行换行操作,第一个循环体执行完次,i ++,i 的值变为3,3<5成立,执行第一个循环体, j = i,将 i的值赋给 j,此时j 的值为3,3<5成立,执行第二个循环体打印第八个 * 号,j++,j 的值变为4,4<5成立,执行第二个循环体打印第九个 * 号,j++,j 的值变为5,5<5不成立,退出第二个循环,执行System.out.println();进行换行操作,第一个循环体执行完次,i++,i 的值变为4,4<5成立,执行第一个循环体,j = i,将i的值赋给j,此时j的值为4,4<5成立,执行第二个循环体打印第十个 * 号,j++,j 的值变为5,5<5不成立,退出第二个循环,执行执行System.out.println();进行换行操作,第一个循环体执行完第次,i++,i 的值变为5,5<5不成立退出第一个循环,程序结束。

public class ForQian03 {
    public static void main(String[] args) {
        for(int i = 1;i <= 5;i++){
            for(int j = i;j < 5;j++){
                System.out.print("*"+"\t");/“\t”表示制表符,相当于按一次tab 键
            }
            System.out.println();//换行
        }
    }
}

### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢和解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特点: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能够与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet 和 PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力和泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量和推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值