【问题标题】:Java Recursion General ConceptJava 递归一般概念
【发布时间】:2015-05-12 06:06:00
【问题描述】:

这是一个简单的java递归问题。这个我一直在努力,但需要改进我的方法。

用两个 int 参数 m 和 n 编写一个递归方法。前提条件要求 0

这是我目前所拥有的测试方法

package Recursion;

class Asterisk 
{
       public static void asterisk(int m, int n) 
       {
          if (m == n) 
          {
             printAsterisk(n);
             return;
          } 
          else if (m < n) 
          {
              printAsterisk(m);
              asterisk(m + 1, n);
          } 
          else 
          {
              printAsterisk(m);
              asterisk(m - 1, m);
          }
       }

      public static void printAsterisk(int m) 
      {
          for (int i = 0; i < m; i++) 
          {
              System.out.print("*");
          }
              System.out.println("");
      }

      public static void main(String[] args) 
      {
          int m = 3;
          int n = 5;

          asterisk(m, n);
          asterisk(n, m);
      }

}

【问题讨论】:

  • 他正在寻求有关实现递归的帮助。循环显然是任务允许他拥有的循环。

标签: java recursion


【解决方案1】:

所以,你需要这个:

printAsterisk(3, 5)
***
****
*****
*****
****
***

这样想:printAsterisk(6, 5) 什么也不打印。 printAsterisk(3, 5) 打印3 星号,然后插入printAsterisk(4, 5),然后再次打印3 星号。

【讨论】:

    【解决方案2】:

    以下代码将起作用:

    class Test {
    
        public static void asterisk(int m, int n) {
            if (m == n) {
                printAsterisk(m);
                return;
            } else if (m < n) {
                printAsterisk(m);
                asterisk(m + 1, n);
            } else {
                printAsterisk(m);
                asterisk(m - 1, n);
            }
        }
    
        public static void printAsterisk(int m) {
            for (int i = 0; i < m; i++) {
                System.out.print("*");
            }
            System.out.println("");
        }
    
        public static void main(String[] args) {
            int m = 3;
            int n = 5;
            asterisk(m, n);
            asterisk(n, m);
        }
    
    }
    

    请注意,这不是正确的做法。由于这个问题感觉像是一项任务,我不会发布准确的版本。现在,您的任务是删除 main 方法中对 asterisk 的两个调用,并修改该方法以使用单个调用。

    【讨论】:

    • 这看起来像是学生作业。尽量避免给学生代码,并优先考虑解释和提示而不是公开的解决方案。
    • @Amadan:这不是一个准确的答案,我试图引导 OP 提出一个准确的递归。
    【解决方案3】:

    你的方法很好,你只需要考虑一下printAsterisk(int m, int n)会发生什么。

    递归函数通常可以被认为是解决可重复问题的一小部分,然后使用不同的参数将问题的其余部分委托给它自己。

    考虑以下输出 (printAsterisk(4, 4);):

    ****
    

    如果我们想得到以下输出 (printAsterisk(3, 4);):

    ***
    ****
    ***
    

    很容易看出这个输出在中间包含了printAsterisk(4, 4);的输出,所以当你调用printAsterisk(3, 4);它应该打印3个星号,调用printAsterisk(4,4);然后打印剩下的3个星号。

    如果你进一步扩展它,实现应该很容易看到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-17
      • 2018-06-21
      • 1970-01-01
      • 2019-11-06
      相关资源
      最近更新 更多