递归打印,没有任何循环

问题描述 投票:2回答:3

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

我的问题是我在一个类中有两个方法。这个类有一个字符串,应该反向打印..简单的迭代方法,但不是当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不是递归的!!!!!!!但我希望它是,但我无法弄清楚这样做的方式。

java recursion
3个回答
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,这是最后一个字母的索引。


1
投票

这里有几个问题。首先,在print方法中,首先将字符串与while循环条件中的整数进行比较。另外,在你的while循环中,当你认为你应该在这里使用变量j时,你减少变量i,因为它被传入。所以这可能是你想用print实现的,

private static void print(String str, int i) {
    while (i < str.length()) {
        System.out.print(str.charAt(i++));
    }
}

现在使用printReverse,您可以通过转换传入char的int变量i开始,然后将其与' '进行比较。这样做是没有意义的,因为传入的任何有效整数在char转换后都不会等于' '。我认为你在这个方法中的意图与print完全相同,但相反。因此,您需要更改的是while循环和print语句,

private static void printReverse(String str, int i) {
    while (i < str.length()) {
        System.out.print(str.charAt(str.length() - i++ - 1));
    }
}

请注意,如果您想以递归方式进行此操作,则需要建立基本案例并对函数进行递归调用。例如,使用print,您可以使基本情况与上面的while循环条件相同,在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

private static void printReverse(String str, int i) {
    if (i >= str.length()) {
        return;
    }
    System.out.print(str.charAt(str.length() - i++ - 1));
    printReverse(str, i);
}

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等函数式语言中使用递归的方法。

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

  • 想想基本情况。您不需要再次调用该方法的情况是什么?
  • 如果它不是基本案例之一,请使用部分输入执行部分工作
  • 调用方法本身并传递其余输入。
  • 请记住,您希望将输入简化为其中一个基本案例。
© www.soinside.com 2019 - 2024. All rights reserved.