递归打印,没有任何循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归打印,没有任何循环相关的知识,希望对你有一定的参考价值。

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

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

答案

递归方法(每个递归步骤中打印一个字母)可能如下所示:

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

另一答案

这里有几个问题。首先,在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);
}
另一答案

你可以这样做:

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

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

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

以上是关于递归打印,没有任何循环的主要内容,如果未能解决你的问题,请参考以下文章

快速排序-递归实现

C语言习题如何在 C 中不使用任何分号打印从 1 到 N 的数字?

递归打印循环数列

不用循环,不用递归,从1打印到100

Matlab:如何在没有循环或内置函数的情况下递归地获取斐波那契序列中的第 N 个元素

十三 递归的java实现