递归打印,没有任何循环

时间:2019-01-26 20:45:34

标签: java recursion

找不到其他类似的帖子,所以我不得不问。 打印任何东西都很容易...但是当您不被允许使用迭代方法时,事情就会变得棘手。

我的问题是我在一类中有两种方法。此类具有一个应反向打印的字符串。.使用迭代方法很简单,但是当char和int成为障碍时,则不是这样,

我试图将一个字符串中char的整数倍数计算为整数,然后使用另一种方法来获取相同的字符串和int数以反向打印出来。

注意:需要这两个以string和int为参数的方法。

我在做什么错?

public class PrintRecursive {
private static int j;

public static void main(String[] args) {

    String str = "Hello Everyone!";

    print(str, 0);
    System.out.println(); // Line break
    printReverse(str, 0);
}

private static void printReverse(String str, int i) {
    char ch = (char) i;
    if (ch == ' ') {

    } else
        while (str.contains(str)) {
            i += str.charAt(ch);
        }
}

private static void print(String str, int i) {

    while (str.equals(i)) {
        System.out.println(str.charAt(j--));
    }
}

}

结果:

大家好! !enoyrevE olleH

也:请注意,我想我应该直接使用方法而不是我的“ private int j”。

我的代码atm不是递归的!!!!!但是我希望做到这一点,但我不知道这样做的方法。

3 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

public static void main(String[] args) {
   printStringInReverse("Hello", "Hello".length() - 1);
}

public static void printStringInReverse(String s, int x) {
    if (x < 0) {
        return;
    }
    System.out.print(s.charAt(x));
    printStringInReverse(s, x - 1);
}

请注意,我以if (x < 0)开始该方法。这是一个“基本情况”,即停止递归的条件。然后,我在索引x上打印char,然后再次调用该方法,但递减x。这意味着下一个调用将在前面打印该字符。

实际上,此方法不需要具有int参数:

public static void printStringInReverse(String s) {
    if (s.equals("")) {
        return;
    }
    System.out.print(s.charAt(s.length() - 1));
    printStringInReverse(s.substring(0, s.length() - 1), x);
}

第二种方法更类似于在Haskell之类的功能语言中使用递归的方式。

下次要求您编写递归方法时,这里有一些提示:

  • 考虑基本情况。在什么情况下您不需要再次调用该方法?
  • 如果不是基本情况之一,则用部分输入来完成部分工作
  • 调用方法本身并传递其余输入。
  • 请记住,您希望将输入减少为基本情况之一。

答案 1 :(得分:1)

这里有几个问题。首先,在print方法中,通过在while循环条件下将字符串与整数进行比较来开始。另外,在while循环中,我相信您应该在此处使用变量j,因为它已经传入,因此递减了变量i。因此,这可能是您尝试使用{{1 }},

print

现在使用private static void print(String str, int i) { while (i < str.length()) { System.out.print(str.charAt(i++)); } } ,首先将转换为int的int变量printReverse转换为char并将其与i进行比较。这样做是没有意义的,因为在进行字符强制转换后,传入的任何有效整数都将永远不等于' '。我认为您打算在此方法中执行的操作与' '几乎相同,但相反。因此,您需要更改的只是while循环和print语句,

print

请注意,如果要递归执行此操作,则需要建立一个基本案例和对函数的递归调用。例如,使用private static void printReverse(String str, int i) { while (i < str.length()) { System.out.print(str.charAt(str.length() - i++ - 1)); } } 可以使基本案例与上面的while循环条件相同,在print时停止调用print,然后可以在之后对方法本身进行调用您已经在索引i >= str.length()上打印了字符,同时又递增了i

i

相同的逻辑可以应用于private static void print(String str, int i) { if (i >= str.length()){ return; } System.out.print(str.charAt(i++)); print(str, i); }

printReverse

答案 2 :(得分:1)

递归方法(在每个递归步骤中打印一个字母)可能像这样:

private static void print(String s, int i) {
    if(i == s.length() - 1)   
        System.out.println(s.charAt(i));
    else {
        System.out.print(s.charAt(i));
        print(s, i+1);
    }
}

private static void printReverse(String s, int i) {
    if(i == 0)
        System.out.println(s.charAt(0));
    else {
        System.out.print(s.charAt(i));
        printReverse(s, i-1);
    }
}

您可以这样称呼它:

public static void main(String[] args) {
    print("abcd", 0);
    printReverse("abcd", 3);
}

print()传递整数0作为起始值,printReverse()传递字符串的长度-1,即最后一个字母的索引。