【问题标题】:Print recursively without any loops递归打印,没有任何循环
【发布时间】:2019-01-27 08:30:26
【问题描述】:

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

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

【问题讨论】:

  • 传入一个等于String长度减一的int,然后当int大于等于0时,打印int处的char,然后递归传递减一整数
  • 尝试创建递归方法
  • 你从来没有将j设置为任何东西
  • str.equals(i) 将始终返回 false。您正在比较 String 和 int
  • 您的标题是 “递归打印”,但我看不到在您的代码中进行任何递归调用的尝试。你知道“递归”是什么意思,对吧?

标签: java recursion


【解决方案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,即最后一个字母的索引。

【讨论】:

  • 谢谢,这就是我要找的。​​span>
【解决方案2】:

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

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

现在有了printReverse,您首先将传入的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循环条件相同,当i &gt;= str.length()时停止调用print,并且可以在打印出之后调用方法本身索引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);
}

【讨论】:

    【解决方案3】:

    你可以这样做:

    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 &lt; 0) 开始该方法。这是一个“基本情况”,即停止递归的条件。然后我在索引x 处打印字符,并再次调用该方法,但递减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 等函数式语言中使用递归的方式。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多