【问题标题】:Explain creating a pyramid in Java解释在 Java 中创建金字塔
【发布时间】:2011-10-26 16:16:02
【问题描述】:

我正在上初学 Java 编程课程,目前正在复习循环。如果有一件事我只是不明白,那就是金字塔。我在网上研究了本书的练习并找到了金字塔示例的解决方案,但是即使看到代码,我仍然不明白,如果我的生活依赖于它,我无法重新创建答案。

下面是一个金字塔示例和创建它的代码。如果有人可以浏览代码并给我一行一行的“傻瓜”解释发生了什么,那么也许我最终会明白。

提前感谢您的帮助!

例如。创建以下金字塔:

            1
          2 1 2
        3 2 1 2 3
      4 3 2 1 2 3 4
    5 4 3 2 1 2 3 4 5   
  6 5 4 3 2 1 2 3 4 5 6    
7 6 5 4 3 2 1 2 3 4 5 6 7
class Pyramid {

    public static void main(String[] args) {

        int x = 7;

        for (int i = 1; i <= x; i++) {

            for (int j = 1; j <= x - i; j++)
                System.out.print("   ");

            for (int k = i; k >= 1; k--)
                System.out.print((k >= 10) ?+ k : "  " + k);

            for (int k = 2; k <=i; k++)
                System.out.print((k >= 10) ?+ k : "  " + k);
            System.out.println();
        }  
    }
}

【问题讨论】:

  • 强烈建议拿笔和纸并“玩”电脑:跟踪代码的执行情况(x 的较低值,如 3)。现在付出的努力将获得长期收益。
  • 如果您的意图恰当,并且使 all 循环使用大括号,您几乎肯定会发现代码更易于理解。
  • 我怀疑你是否真的想使用那个“Pyramid”标签,因为“Pyramid”是一个基于 Python 的 Web 框架。另外,(只是为了纠正 Jon Skeet)“缩进”而不是“有意”:-)
  • 安装 eclipse,学习如何在 eclipse 中调试,然后调试你的代码。这样,当您进入软件行业时,您就会学到一些东西
  • @Babu 调试器提示非常好。让您了解变量发生了什么。

标签: java loops for-loop


【解决方案1】:

金字塔有 7 行,所以第一个 for 循环遍历行, 第二个 for 循环是打印一堆空格,这样三角形就不会显示为:

1
2 1 2
3 2 1 2 3

第三个 for 循环(带有 k),有一个条件运算符,其工作方式如下:

boolean-expression ? result-if-true : result-if-false

所以它要么将数字 k 添加到字符串中,要么添加一个空格,然后将数字 k 添加到字符串中。

第四个循环做类似的事情。

【讨论】:

  • 好吧,当你打败我的时候,放弃我的答案。我只想补充一点,左侧的第二个内循环从 1 开始计数,包括 1,金字塔右侧的第二个内循环从 1(不包括它)开始计数。
【解决方案2】:

首先将x 声明为7。然后for 循环开始。这个循环将从变量i 为 1 开始。只要 for 循环的第二部分 ( i &lt;= x) 计算结果为真。在这样的执行结束时,将执行最后一部分:i++,它将变量i 加一。

那么会发生什么:

  • 我设置为 1
  • i
  • 是的! 1 小于或等于 7。做代码块中的东西。
  • i 从 1 变为 2
  • i
  • 是的! 2 小于或等于 7。做代码块中的东西。
  • ...多次迭代...
  • i 从 7 变为 8
    • i
    • 不! 8 不小于或等于 7。for 循环结束。
  • 这就是外循环。现在,我们需要弄清楚在 一个 这样的 for 循环迭代中会发生什么。那么让我们看看执行了 7 次的代码块。

    for (int j = 1; j <= x - i; j++)  
    System.out.print("   "); 
    
    for (int k = i; k >= 1; k--)  
    System.out.print((k >=10) ?+ k : "  " + k);  
    
    for (int k = 2; k <=i; k++)  
    System.out.print((k>= 10) ?+ k : "  " + k);  
    System.out.println();  
    

    这里有三个逻辑部分,方便地用空行分隔。这里可能令人困惑的是,这三个部分都在外部 for 循环的代码块中,但没有嵌套更深。看看第一个:

    for (int j = 1; j <= x - i; j++)  
    System.out.print("   "); 
    

    这次没有{} 来分隔for 代码块的一部分。默认情况下,这意味着只有下一条语句是其中的一部分,或者在本例中为 System.out.print(" ");

    那段代码会发生什么?好吧,这是另一个,这次从 1 开始,一直运行到 x - ix 仍然是 7,但 i 取决于我们所处的外部 for 循环的迭代。第一轮它将是 1。这将对应于您在输出中看到的第一行。第二轮将是2。这将对应于输出的第二行。

    所以假设这是外部 for 循环的第一次迭代。 x - i 是真正的7 - 1,即 6。我们让一些变量 j 从 1 变为 6。这 6 次中的每一次,我们打印出 3 个空格字符。

    之后,我们进入第二部分:

    for (int k = i; k >= 1; k--)  
    System.out.print((k >=10) ?+ k : "  " + k); 
    

    另一个 for 循环,但有一个转折。这个使用了一个变量k,它从i开始,然后向下计数到1,如k--所示。对于这些迭代中的每一次,它都会在输出中打印出更多内容。这次打印语句的内容有点复杂。它使用三元运算符。第一个比特(k &gt;=10) 将被评估。如果为真,则返回: 之前的位,否则返回: 之后的位。在这种情况下,这意味着如果 k 大于或等于 10,它将仅打印出 k 的值。否则,它将打印出两个空格加上k 的值。

    在此之后,最后一点应该很容易弄清楚。请注意,在 for 循环及其单个语句之后,有一个 System.out.println(); 所做的只是打印一个换行符,使输出转到下一行。

    这标志着外部 for 循环的一次迭代结束。只要i 不大于x(在我们的例子中为7),就会开始另一个迭代并且这三个部分将运行。由于这三个内部 for 循环依赖于 i,因此它们总是会运行不同的次数。

    在心里做以下事情:至少完成外部 for 循环的 3 次迭代。这意味着,将i 视为1,并在心理上执行{} 之间的内容。然后想想i 是 2 并做同样的事情。再做 3 次,现在应该开始变得清晰了。

    祝你好运!

    【讨论】:

    • 感谢 G_H!我真的很感谢你花时间为我拼出这个。我认为你的解释可能会帮助我最终得到这个。
    • 这不是一个专注于程序意图的解释,而只是告诉你代码中发生了什么。由您决定如何实现您看到的结果。 NickLH 的解释会对此有所帮助。请记住:编程语言弥合了您的思想和计算机之间的差距:)
    【解决方案3】:
    public static void main(String[] args) {
    
        // levels in the pyramid
        int x = 5;
    
        for (int i = 1; i <= x; i++) {
            // for spacing
            for (int j = 1; j <= x - i; j++){                System.out.print("   ");            }           // left half of the pyramid             for (int k = i; k >= 1; k--){
                System.out.print((k >= 10) ? +k : "  " + k);
            }
            // corresponding right half of the pyramid
            for (int k = 2; k <= i; k++) {               System.out.print((k >= 10) ? +k : "  " + k);
            }
            // next line
            System.out.println();
        }
    }
    

    信用:http://www.skilledmonster.com/2013/10/28/java-pyramid-example-pattern-11/

    【讨论】:

      【解决方案4】:

      如果有帮助,你也可以试试这个:)

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

      输出:

      ROW (1) * --> COLUMN
      |   (2) *
      |   (3) ***
      |   (4) *****
      v   (5) *******
      

      代码逻辑:首先将金字塔分成3个三角形。

      ####$
      ###$$@
      ##$$$@@
      #$$$$@@@
      $$$$$@@@@
      

      1> 第一个三角形(空格用#表示)

      ####
      ###
      ##
      #
      

      2> 第二个三角形(用$表示)

      $
      $$ 
      $$$
      $$$$
      $$$$$
      

      3> 第三个三角形(用@表示)

      #
      @
      @@
      @@@
      @@@@
      

      它们将组成一个金字塔结构

      代码:

      pyramid() {
          for (int i = 1; i <= 5; i++) { // loop row
              for (int k = 1; k <= 5 - i; k++) { // 1st triangle (printing space)
                  System.out.print(" ");
              }
              for (int j = 1; j <= i; j++) { // 2nd triangle
                  System.out.print("*");
              }
              for (int l = 1; l <= i - 1; l++) { //3rd triangle
                  if (i == 1) {
                      break;
                  }
                  System.out.print("*");
              }
      
              System.out.println();
          }
      }
      

      【讨论】:

        【解决方案5】:

        我们先了解一下 For 循环:

        For循环:

        它是围绕一组有限的重复代码构建的。 所以如果你有一个特定的代码块,你想要 一遍又一遍地跑了特定的次数 For 循环很有帮助。

        语法:

        for(initilization; conditional expression; increment expression)
        {
            //repetition code here
        }
        

        例如:

        int x = 7;
        for (int i = 1; i <= x; i++){
            // statements
        }
        

        在这个“int i=1”是一个初始化部分,循环会迭代 直到条件为真,即 (I

        在循环体内的这条语句将被执行后,最后“i++”即“I”的值将递增(I将变为2)。

        这个过程每次都会重复,直到条件 (I


        现在让我们了解模式是如何形成的:

        ROW (1) * --> COLUMN
        |   (2) **
        |   (3) ***
        |   (4) *****
        v   (5) *******
        

        正如我们所见,首先需要考虑两件事:行数,其次是列数:

        我们使用两个循环来构造这样的结构,第一个外部循环用于行数,第二个内部循环用于列数。

        代码逻辑:首先将金字塔分成3个三角形。

        ####$
        ###$$@
        ##$$$@@
        #$$$$@@@
        $$$$$@@@@
        

        1>第一个三角形(用#表示的空格)

        ####
        ###
        ##
        #
        

        2>第二个三角形(用$表示)

        $
        $$ 
        $$$
        $$$$
        $$$$$
        

        3> 第三个三角形(用@表示)

        #
        @
        @@
        @@@
        @@@@
        

        它们将共同构成一个金字塔结构


        开始

        现在让我们分解我们的模式问题:

        ######1
        #####212
        ####32123
        ###4321234
        ##543212345
        #65432123456
        7654321234567
        

        我们将它分成 3 个三角形,每个三角形在主循环中都有自己的循环,用于计算行数。 正如我们所见,我们的模式所需的行数为 7,因此我们将重复第一个循环,直到达到 7 行。

        主循环(用于行):

        int x = 7;
        for (int i = 1; i <= x; i++) { // main loop for number of rows
        
            // other 3 loops will come insidethe mail loop
        
        }   
        

        第一个内循环: 正如我们在模式逻辑中看到的,第一个三角形将 由空格或空白组成。

                        output eg: (representing white spaces with #)
        
        
        
                                    ######          
                                    #####   
                                    ####    
                                    ###
                                    ##
                                    #       
        
        
        for (int j = 1; j <= x - i; j++)    // j represent a column number 
           System.out.print("   ");  
        // This will create blank spaces till the condition is true.
        
        
        
        
        **condition explained:** j <= x - i
        

        “i”的值为“1”,因为这是主循环第一次运行 从那以后“i”的值就没有改变。

         **replace values:** 
        

        当 j = 1 : 1

        //主循环和内循环的第一次迭代。

        在此控制之后将进入下一个循环,即第二个内循环:

        j = 2 : 2

        // 在主循环和内循环的第二次迭代中。

        在此控制之后将进入下一个循环,即第二个内循环:

        j = 3 : 3

        //在主循环和内循环的第三次迭代中。

        在此控制之后将进入下一个循环,即第二个内循环:

        j = 4 : 4

        //在主循环和内循环的第四次迭代中。

        在此控制之后将进入下一个循环,即第二个内循环:

        j = 5 : 5
        // 在主循环和内循环的第五次迭代中。

        在此控制之后将进入下一个循环,即第二个内循环:

        j = 6 : 6

        //在主循环和内循环的第六次迭代中。

        在此控制之后将进入下一个循环,即第二个内循环:

        j = 7 : 7


        第二个内循环:

        for (int k = i; k >= 1; k--) //second triangle
                        System.out.print((k >= 10) ?+ k : "  " + k);  // ternary operator is used to check the printing logic
        

        注意:

        ternary operator syntax: result = testCondition ? value1 : value2
        

        //如果testcondition为真那么result将得到value1 else value 2

        ***DIY: (Take a paper pen)***
            Implement for loop logic and replace variables with values: 
        

        第一次迭代:K=i(我们知道 i=1)所以 k=1; k>=1(替换变量我们得到 1>=1 这是真的);执行语句。

        声明:System.out.print((k &gt;= 10) ?+ k : " " + k); 或者 如果(1>=10)?然后打印“k”的值(即1)

        else 打印“k”的值,前面有一些空格 k (为了让金字塔看起来间隔均匀)

        注意:如果您对三元运算符感到困惑,请不要使用它,您可以简单地写。

        System.out.print("  " + k); // will give same output
        

        这个控件之后会进入下一个循环,即第三个内循环:

                        *Second innerloop is used to print this portion:* 
        
        
                                     1
                                    21
                                   321
                                  4321
                                 54321      
                                654321
                               7654321      
        

        第三个内循环:这个循环用于打印第三个三角形。

                                    2
                                    23
                                    234
                                    2345
                                    23456
                                    234567
        
        
        
        for (int k = 2; k <=i; k++) //  loop column  
                        System.out.print((k >= 10) ?+ k : "  " + k); 
                                    or
                        System.out.print("  " + k)
        

        让我们看看完整的代码:

            int x = 7;   
        
            for (int i = 1; i <= x; i++) {              // loop row
        
                for (int j = 1; j <= x - i; j++)        // loop column (Triangle one)
                    System.out.print("   ");
        
                for (int k = i; k >= 1; k--)            // loop column (Triangle two)
                    System.out.print(  "  " + k);
        
                for (int k = 2; k <=i; k++)             // loop column (Triangle three)
                    System.out.print( "  " + k);
        
                System.out.println();                   // used to go on new line (new row)
            }  
        

        【讨论】:

          【解决方案6】:

          我们也可以使用一个 for 循环来制作金字塔,使其在执行时间方面具有高效的代码。

          这是打印星号金字塔的代码。

          public class PyramidPrinting {
          
              public static void main(String[] args) {
                  int h = 5;
                  int i,j;
                  char[] arr = new char[2*h-1];
          
                  for(i=h-1,j=h-1; i>=0 && j<=2*h-1; i--,j++){
                      arr[i]='*';
                      arr[j]='*';
                      System.out.println(arr);
                  }
              }
          }
          

          输出:

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

          【讨论】:

            【解决方案7】:

            好吧,我做了一个类似的程序,没有任何问题,只是想象力......代码很清晰:D

            private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
                int i,j,k, n = Integer.parseInt(jTextField1.getText());
                for(i=1;i<=n;i++) // normal loop
                { 
                    for(j=1; j<=(n-i);j++)
                    {
                        System.out.print(" "); // loop for spaces
                    }
                    for(k=1;k<=i;k++) // loop for printing numbers
                    {
                        System.out.print(k+" ");
                    }
                    System.out.println();
                }    // TODO add your handling code here:
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-02-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-08-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多