递归打印,没有任何循环
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 的数字?