我必须使用递归来解决这个问题,我设法让它很快就能使用循环,但是我有点困惑于此。 我目前的代码是
public static String ReverseR(String n){
String finalstring="";
int i = 0;
int len = n.length();
while (i < len) {
finalstring += (n.charAt(len - 1));
ReverseR(n.substring(0, len - 1));
i++;
}
return finalstring;
}
当我输入任何字符串时,结果字符串的长度是正确的,但只使用最后一个字母。例:ReverseR(“你好”)= ooooo 有什么想法吗?
答案 0 :(得分:5)
递归有点像感应证明。
答案 1 :(得分:1)
将n.charAt(len - 1))
更改为n.charAt(len - i))
你总是与len -1在同一个地方;)
[编辑]
while (i < len){
finalstring += (n.charAt(len - 1 - i));
ReverseR(n.substring(0, len - 1 - i));
i++;
}
这会修复您的代码,但您必须在while
或ReverseR(...)
答案 2 :(得分:0)
这是一个完整的解决方案
public static String reverse(final String s) {
if (s == null) {
throw new NullPointerException();
}
final int length = s.length();
if (length <= 1) {
return s;
} else {
// s = start + lastChar
final String start = s.substring(0, length - 1);
final char lastChar = s.charAt(length - 1);
return lastChar + reverse(start);
}
}
答案 3 :(得分:0)
您的递归算法不应要求任何循环,即while
和for
循环。任何循环结构基本上都可以通过递归来实现,而不会触及循环。基本递归字符串反转的示例可能是这样的:
public static String reverseR(String n){
if (n.length() <= 1) return n;
return reverseR(n.substring(1))+n.charAt(0);
}
使用此算法,您基本上会说: 返回“每个字母的反面,但第一个字母”+“第一个字母”
帮助编写递归算法的一个好处是做了很多假设。首先假设你的反向函数有效,然后将它放在你想要反转字符串一部分的任何地方。只记得添加一个基础案例,你将是金色的。 Haskell
或Prolog
等语言会让您习惯递归算法,因为这是迭代的主要来源。