Java:递归方法接受整数'n'并打印'n'个字符

时间:2013-02-24 05:51:41

标签: java recursion

家庭作业:寻找更好的策略或方法,而不是完整的代码。

在尝试识别此问题的递归案例时,我感到非常困惑。我必须编写一个接受整数参数'n'的方法,然后输出总共'n'个字符。中间字符应始终为''或' *',具体取决于原始整数是奇数还是偶数。以下是几个不同的方法调用和输出应该是这样的:

writeChars(1) -> *
writeChars(2) -> **
writeChars(3) -> <*>
writeChars(4) -> <**>
writeChars(5) -> <<*>>
writeChars(6) -> <<**>>
writeChars(7) -> <<<*>>>
writeChars(8) -> <<<**>>>

我如何尝试识别递归案例?

5 个答案:

答案 0 :(得分:2)

你有两个基本情况:n == 1和n == 2.除此之外,递归规则是发出一个“&lt;”,用n-2递归(考虑你要去的两个字符)在此级别发出),然后发出“&gt;”。

答案 1 :(得分:1)

要识别递归,首先考虑如何解决给定n值的问题,假设您有一个方法可以解决较小的情况。尺寸n的解决方案如何与尺寸为n-1的解决方案相关?

执行此操作后,您会发现一个或多个小案例无法以这种方式解决。这些是你的基本情况。

最后,编写一个直接执行每个基本案例的方法。对于大于基本情况的n,它将自身调用为n-1,然后修改该结果以获得大小为n的解。

答案 2 :(得分:0)

我可能会将问题分成3个部分 1.打印< 2.打印* 3.打印>

基于此,我们可以创建一个递归解决方案来打印每个组件。 <>的数量基于公式i % 2 == 1 ? i / 2 : (i - 2) / 2,然后我们可以编写一个函数来递归打印它们,然后再打印另一个来打印*

public class SO15049082 {

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            print(i);
        }
    }

    private static void print(int i) {
        if (i > 0) {
            System.out.print("writeChars(" + i + ") --> ");
            int c = i % 2 == 1 ? i / 2 : (i - 2) / 2;
            printleft(c);
            printstar(c % 2);
            printright(c);
        }
        System.out.println();
    }

    private static void printright(int i) {
        if (i > 0) {
            System.out.print(">");
            printright(i - 1);
        }
    }

    private static void printstar(int i) {
        if (i == 1) {
            System.out.print("*");
        } else {
            System.out.print("**");
        }
    }

    private static void printleft(int i) {
        if (i > 0) {
            System.out.print("<");
            printleft(i - 1);
        }
    }

}

答案 3 :(得分:0)

我考虑递归的方式是传递两个状态(pos,string:s)来改变每个递归调用和三个状态(n,mid1,mid2),这有助于决定如何实现下一个状态。

    public static void main(String... arg) {
        int n = 10, mid1, mid2;
        if (n % 2 == 0) {
            mid1 = n / 2;
            mid2 = n / 2 + 1;
        } else {
            mid1 = mid2 = n / 2 + 1;
        }

        System.out.println(recursion(1, n, mid1, mid2, ""));
    }

    private static String recursion(int pos, final int n, final int mid1, final int mid2, String s) {
        if (pos > n)
            return s;
        else if (pos == mid1 || pos == mid2)
            return recursion(pos + 1, n, mid1, mid2, s + "*");
        else if (pos < mid1)
            return recursion(pos + 1, n, mid1, mid2, s + "<");
        else
            return recursion(pos + 1, n, mid1, mid2, s + ">");
    }

答案 4 :(得分:0)

我只假设两个基本情况,一个用于n是偶数,一个用于当n是奇数时。

现在在递归调用中我传递n - 2;在奇数n的情况下,它最终为1,对于偶数n,它最终为2。

public static void writeChars(int n) {
    if(n < 1) 
        throw new IllegalArgumentException();
        
    if(n == 1)          //odd base case
        System.out.print("*");

    else if(n == 2)     //even base case
        System.out.print("**");
        
    else {              //recursive case
        System.out.print("<");
        writeChars(n - 2);
        System.out.print(">");
    }
}