草庐IT

双重for循环(嵌套for循环)

小简(JanYork) 2023-08-06 原文

什么是双重循环?

双重循环:我们从字面上理解它,就是有两个循环套在一起

详细解释

双重for循环就是在一个for循环嵌套另一个for循环,即两个循环嵌套,还有多重循环嵌套的情况,但用的比较少,一般常用的是两个循环嵌套,很少使用多重循环,因为for循环多了会导致代码执行的效率低,而且容易死机,多循环中的总循环次数是相乘的,嵌套几次后几何级数增长,因此通常情况下在循环多次嵌套时,我们是不推荐使用的。

说的再简单点就是,for循环的嵌套,跟我们之前的if嵌套一样

 for(循环变量;循环条件;循环操作){
       for(循环变量;循环条件;循环操作){
           //代码块
       }
}

这就是双重for循环的框架

运行路径

外层循环一次内层全部循环一次(外层循环一次,内层for循环全部执行完成再进行外层的一次循环)

难点

二重循环的难点是内层循环的循环条件,如何控制内层循环的次数
记住外层循环一次,内层循环全部的原则
举个例子,我外层循环定义循环3次内层循环定义循环2次,每次输出一个“星号”,那么,将会输出几个“星号”呢?
答案是6次(2×3)
分析:

  • 外层循环第一次,里面循环完,也就是2次
  • 外层循环第二次,里面又重新循环,循环完,还是2次
  • 外层循环第三次,里面再次重新循环,又是2次

我们多说无益,来个实际操作

示例


打印以下图形,我们可以用上面提到的公式验证一下

图形

*
* *
* * *
* * * *
* * * * * 

这个题目的代码,我先给出,然后分析

代码

public class Star{
       public static void main(String[] args){
          for(int i=1;i<=5;i++){
                for(int j=1;j<=i;j++){
                    System.out.print("*");
                }
                System.out.println();
           }
       }
}

我们看看这个图像有多少行? 总共有5行,也就是说我们需要循环5次打印才可以

外部循环

for(int i=1;i<=5;i++){
   //循环块2
}

这个循环控制输出的行数,我们这里是5行“星号”,所以这个循环控制成5次

我们开始写里面的循环

内部循环


里面定义一个循环,变量为 j

 for(int j=1;j<=i;j++){
   System.out.print("*");
 }

的初始值定义为1,并且j<=i (i也是累加,到5停止),它的循环次数也是循环5次,因为我们这个图像的最后一个输出是5颗“星号”,这里是循环输出了5颗“星号”,所以,j超出5必须停止循环

总体运行过程

到这,许多人会感到有点迷茫,不过没有关系,这是正常,我们好好看看它如何运行:

首先注意看变量:i=1、j=1、i<=5、j

循环运行变化

外层第一次循环: i为1时,开始第一次循环,开始运行里面的第 i(1)次循环,这时,里面的循环,j为1时j<=i 此时i为1),所以会输出1颗“星号”

拆解代码:第一次外层循环
内层

for(int j=1;j<=1;j++){
  System.out.print("*");
}
System.out.println();

外层第三次、第四次、第五次与第二次一样i不断累加,依次输出3颗“星号”、4颗“星号”、5颗“星号”

就不多演示了,还不懂的话,就看看拆解代码的内层循环的循环条件的变化

注意:System.out.print("*"):没有ln的,所以不会换行,于是内层循环的“星号”是横排叠加的

示例二

打印九九乘法表
因为这个题目,和上面的代码以及原理一样,只是改变了一些内容,所以我就直接放代码了

代码

public class Jjcfb {
    public static void main(String[] args) {
                for(int i=1;i<=9;i++){
                    for(int j=1;j<=i;j++){
                        System.out.print(j+"*"+i+"="+i*j+" ");
                    }
                    System.out.println();
                }
    }
}

 九九乘法表一共有九行,所以外层限制行数为9,于是i=1;i<=9
内层还是j=1;j<=i
如果还不懂,可以用IDEA调试慢慢摸索,这样记忆力更加深刻

 扩展

给大家放一个问题:这样用“*”输出一个菱形

点击链接查看答案:双重for循环(嵌套for循环) - 小简博客 (janyork.com)https://blog.janyork.com/index.php/archives/429/

有关双重for循环(嵌套for循环)的更多相关文章

  1. ruby - 树顶语法无限循环 - 2

    我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He

  2. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  3. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  4. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  5. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  6. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  7. ruby-on-rails - Rails 中的 NoMethodError::MailersController#preview undefined method `activation_token=' for nil:NilClass - 2

    似乎无法为此找到有效的答案。我正在阅读Rails教程的第10章第10.1.2节,但似乎无法使邮件程序预览正常工作。我发现处理错误的所有答案都与教程的不同部分相关,我假设我犯的错误正盯着我的脸。我已经完成并将教程中的代码复制/粘贴到相关文件中,但到目前为止,我还看不出我输入的内容与教程中的内容有什么区别。到目前为止,建议是在函数定义中添加或删除参数user,但这并没有解决问题。触发错误的url是http://localhost:3000/rails/mailers/user_mailer/account_activation.http://localhost:3000/rails/mai

  8. Ruby——嵌套类和子类是一回事吗? - 2

    下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby​​解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc

  9. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  10. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

随机推荐