嘿我正在处理一个问题,你可以使用递归垂直打印一个字符串。如果我要使用for循环,我知道如何做到这一点:
for (int i = 0; i < str.length(); i++) {
System.out.println(str.charAt(i));
但我不完全确定如何使用递归来做到这一点。我负责基础案例,但我不确定如何继续:
if (str == null || str.equals("")) {
return str;
任何帮助将不胜感激。感谢!!!
答案 0 :(得分:1)
如有疑问,您可以随时将直接转换为递归:
for (int i = 0; i < str.length(); i++)
System.out.println(str.charAt(i));
...变为:
public void printVertical(String str, int i) {
if (i < str.length()) {
System.out.println(str.charAt(i));
printVertical(str, i + 1);
}
}
String inputStr = ...
printVertical(inputStr, 0);
请注意,有很多方法可以做到更优雅。这对我来说就像是家庭作业。我建议你找到一种主观上更好的方法,而不是使用你的循环“盲目翻译”。
答案 1 :(得分:1)
public void printVertString(String str) {
if (str != null && str.length > 0) //1 base condition
{
System.out.println(str.charAt(0)) //2 print first char
printVertString(str.substring(1)) //3 recursive call, but first char is omitted
}
}
这是做什么的:
因此,如果您发送str =“CAT”,则会发生以下情况(缩进区分同一函数的不同调用)
1 str is "CAT" --> not empty
2 print "C"
3 call printVertString "AT"
1 str is "AT" --> not empty
2 print "A"
3 call printVertString "T"
1 str is "T" --> not empty
2 print "T"
3 call printVertString ""
1 str is "" --> EMPTY
return
答案 2 :(得分:0)
你为什么要做这样的事情?这显然是一个迭代过程比递归实现更清晰,更容易实现的情况。
有几种方法可以递归地处理这个问题。由于您使用的是Java,我建议您查看java核心库中的String.substring方法。
答案 3 :(得分:0)
这应该可以解决问题:
void foo (final String str) {
if (null != str && str.length > 0) {
System.out.println(str.charAt(0))
foo(str.substring(1))
}
}
递归的一点是你有一个自我调用的函数。
答案 4 :(得分:0)
理解递归的关键是理解递归。 (bah dum bum)
但是说真的,你应该从你已经拥有的问题中解决这个问题。在这个例子中,你有一个长度的字符串;你怎么能打印那部分字符串然后有一个较小的字符串来重复这个过程?这是递归的基本思想。
你的基本情况是正确的,所以你可以使用Java库和上面的代码来解决这个问题:
public String printVertical(String str)
{
if (str == null || str.equals(""))
{
return str;
}
else
{
System.out.println(str.charAt(0));
return printVertical(str.substring(1, str.length);
}
}