Java简单递归算法

时间:2015-05-11 22:13:13

标签: java algorithm recursion

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

使用两个int参数m和n编写递归方法。前提条件要求0 <= m且m <= n。该方法打印一行m个星号,然后打印一行m + 1个星号,依此类推,直到一行n个星号。然后向后重复相同的模式:一行n个星号,然后是n-1,依此类推,直到n。实现中允许的唯一循环是打印一行m星号的循环。

这就是我所拥有的测试方法

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);
   }
}

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

预期产出

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

我当前的输出

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

3 个答案:

答案 0 :(得分:0)

这不是一个好的解决方案,你拥有它的方式会更好。为什么你只想用1种方法?

package Recursion;

class Asterisk 
{
     public static void asterisk(int m, int n) 
     {
        if (m == n) 
        {
            for (int i = 0; i < n; i++) 
        {
           System.out.print("*");
        }
            System.out.println("");
        } 
        else if (m < n) 
        {
            for (int i = 0; i < m; i++) 
        {
           System.out.print("*");
        }
            System.out.println("");

            asterisk(m + 1, n);
        } 
        else 
        {
             for (int i = 0; i < m; i++) 
        {
           System.out.print("*");
        }
            System.out.println("");
            asterisk(m - 1, m);
        }
     }

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

       asterisk(m, n);
   }

答案 1 :(得分:0)

这简单得多。

public static void asterisk(int m, int n) {
    printAsterisk(m);
    if (m < n) {
        asterisk(m + 1, n);
    }
    printAsterisk(m);
}

只需在函数的开头和结尾打印m星号。并且只有当m小于n递归时才m + 1

如果m > n执行此操作,则会阻止两条打印行:

public static void asterisk(int m, int n) {
    if (m <= n) {
        printAsterisk(m);
        asterisk(m + 1, n);
        printAsterisk(m);
    }
}

答案 2 :(得分:0)

首先,这有点混乱。你的第一个方法中有一个返回语句,它是无效的,因此肯定不会运行。 但问题是你不应该首先使用void方法,因为你需要一个return语句来使它以递归方式工作,而不是从内部调用它。(写返回星号(m + 1, n)在&else; if if语句中,并在&#39; else&#39;内返回星号(m-1,n)。 然后,在main上写星号(m,n)就可以了。 对于任何语法问题,我很抱歉,我在平板电脑上写作