递归地分割出完美的正方形以供显示

时间:2011-12-25 04:48:51

标签: java recursion

我正在尝试创建一个接受整数参数的递归方法并打印第一个 n 正方形 用逗号分隔,奇数正方形按降序排列,偶数正方形按升序排列。

例如,如果输入为8,则应打印以下输出:

49, 25, 9, 1, 4, 16, 36, 64

到目前为止我的代码是:

sn最初具有相同的值,唯一的区别是,在n不变的情况下,s会更改为代码转发。

private static void genSquare(int s, int n) {
    if (s >= 0 && s <= n) {
        if (isOdd(s)) {
            System.out.print(Math.pow(n, 2) + " ");
            genSquare(s - 2, n);
        }
        if (s == 0 || s == 1) {
            genSquare(1, n);
        }
        if (isEven(s)) {
            System.out.print(Math.pow(n, 2) + " ");
            genSquare(s + 2, n);
        }
    }
}

我创建了一个while循环版本,它完美无缺。我只是没有递归版本工作。

示例输入将使用与s和n相同的数字。

以下是循环版本的代码:

private void genLoop(int s, int n) {
    if (isEven(s)) {
        s--;
    }

    while (s <= n) {
        if (s == 1) {
            System.out.print(1 + "  ");
            s++;
        } else if (isOdd(s)) {
            System.out.print(s * s + "  ");
            s -= 2;
        } else if (isEven(s)) {
            System.out.print(s * s + "  ");
            s += 2;
        }
    }
}

4 个答案:

答案 0 :(得分:2)

问题出在这句话中:

    if(s == 0 || s== 1)
        genSquare(1,n);

这会导致该方法无限递归。事实上,当你到达s为零或一的点时,你必须确保不要递归地调用genSquare。

这足以暗示你为自己找出其余部分......并修复任何其他错误。


此外,还有一种更简单的方法来平算整数...

答案 1 :(得分:1)

尝试以下方法:

假设你的例子中n等于8. 8的平方应该打印到最后,所以你可能首先要做一个递归调用,然后打印当前数字的平方。

考虑到n = 7的任务,上面给出的事物的顺序应该被还原为奇数。

答案 2 :(得分:1)

void calculateSquare(int n)
    {
//      odds descending and even ascending
        int t=n;
        if(n<=0)
            return;
         if(n%2==1)
        {
//          Calculate square now and print it also
            System.out.println(n*n);
            calculateSquare(--n);

        }
        else
        {

            calculateSquare(--n);
            System.out.println(t*t);

        }

    }

这可以胜任。

答案 3 :(得分:-1)

是的,它是递归的好例子。试试这有助于你

public class RecursionEx {

    static int no = 0;
    public static void main(String[] args) {

        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Enter the Number");
        try 
        {
             no = Integer.parseInt(bufferedReader.readLine());
             getSquares(no,0);
        }
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    }

    private static void getSquares(int number,int count) 
    {
        if(number==1)
        {
            System.out.print(number);
            count=1;
            getSquares(number+1, count);

        }
        else
        {
            if(number%2!=0&&count==0)
            {
                System.out.print(number*number+",");
                getSquares(number-2,0);
                return;
            }
            if(count==0)
            getSquares(number-1,0);

            if(number%2==0&&count==1)
            {
                if(number<=no)
                System.out.print(","+number*number);
                if(number>=no)
                    return;

                getSquares(number+2, count);
            }


        }
    }
}