在学校学习的过程中,我对递归和尝试新事物都很陌生。我已经使用递归提交了关于字符串反转的作业。有人告诉我,我提交了一个迭代解决方案,而不是递归。我想我做得对。想法?
public static String reverse(String s)
{
int i=0,j=s.length();
char[] chars= s.toCharArray();
while(i<j-1 && i!=j-1)
{
char c=chars[i];
chars[i]=chars[j-1];
chars[j-1]=c;
i++;j--;
reverse(new String(chars).substring(i,j));
}
return new String(chars);
}
答案 0 :(得分:2)
您没有使用递归调用的结果,因此它不是纯粹的递归解决方案。一个纯粹的递归解决方案可以是:
public String reverse(String s)
{
if (s.length() == 0)
return s;
return reverse(s.substring(1)) + s.charAt(0);
}
答案 1 :(得分:2)
我写了这个使用递归的简单代码
public static String reverse(String s){
return reverse(s.toCharArray(),0,s.length()-1);
}
private static String reverse(char [] chars, int low, int high){
if(low>=high) return new String(chars);
char temp = chars[low];
chars[low]=chars[high];
chars[high]=temp;
return reverse(chars,low+1,high-1);
}
否则你也可以使用第一个方法s.toCharArray()的参数,这样你就不必使用返回值;)
答案 2 :(得分:0)
如果您想要递归算法,请尝试
public static String reverse(String s) {
if (s == null || s.length() <= 1) {
return s;
}
StringBuilder sb = new StringBuilder(s.substring(
s.length() - 1, s.length()));
sb.append(reverse(s.substring(0, s.length() - 1)));
return sb.toString();
}
答案 3 :(得分:0)
应该是:
public static String reverse(String s)
{
if (s.length() == 1)
return "";
else
return reverse( s from position 1 to end) + s[0]);
}
将你的java语法用于处理子字符串...(暂时没有触及它)
这是递归。
答案 4 :(得分:-1)
粗略地说,递归和迭代执行 同样的任务:!一次解决一个复杂的任务,并且 结合结果。
强调迭代 :!不断重复,直到任务“完成” 例如,循环计数器达到限制,链表达到空指针,instream.eof()变为真
强调递归:!通过将其分解为更小的问题来解决大问题 和小块,直到你可以解决它;结合结果。
请参阅代码示例以便更好地理解:
// ---------------迭代版---------------------
static int FibonacciIterative(int n)
{
if (n == 0) return 0;
if (n == 1) return 1;
int prevPrev = 0;
int prev = 1;
int result = 0;
for (int i = 2; i <= n; i++)
{
result = prev + prevPrev;
prevPrev = prev;
prev = result;
}
return result;
}
// ---------------天真的递归版本---------------------
static int FibonacciRecursive(int n)
{
if (n == 0) return 0;
if (n == 1) return 1;
return FibonacciRecursive(n - 1) + FibonacciRecursive(n - 2);
}