数组是一个字符串数组。数组是{"hello", "how", "are", "you", "?"}
它有点有效,但他唯一的问题是打印输出混合了最后2个元素,当我运行我的程序时,打印输出为you ? are how hello
,它应该是? you are how hello
。
我输入了一个打印声明,看看我的左右是什么,如果他们切换但是没有帮助,因为他们只打印出起始值而没有别的。
任何帮助将不胜感激。或者为什么打印错了?是不是在做递归?
这是我的方法,必须用分而治之
来完成public void outrev()
{
outrev(0,a.length-1);
}
private void outrev(int left, int right)
{
System.out.println("left a[" + left + "] is " + a[left]);
System.out.println("right a[" + right + "] is " + a[right]);
int mid;
if(left > right)
{
//do nothing
}
else if(left == right)
{
System.out.print(a[left]);
}
else
{
mid = (left + right) / 2;
outm(mid+1, right);
System.out.print(a[mid] + " ");
outm(left, mid-1);
}
}
答案 0 :(得分:0)
public void outrev()
{
List<String> arr = Arrays.asList(a);
outrev(arr);
}
private void outrev(List<String> arr)
{
System.out.println(arr.get(arr.size() - 1));
if(arr.size() != 1){
outrev(arr.subList(0, arr.size() - 1));
}
}
您必须导入
import java.util.Arrays; import java.util.List;
如果这违反了你的家庭作业规则,那就不知道了。注意outrev调用本身,但一旦列表长度为一项,就停止调用自己?这是递归的主要租户,即调用自身的函数,并具有终止条件。在你的原始代码中,outrev并没有真正称呼自己;但是你在一个案例中超载outrev,但这与递归不同 - 除非你没有定义的outm是为了调用outrev。你也应该检查这个程序,以确保列表不是空的,因为你的老师可能会把它扔给你,在这种情况下代码会失败。
请记住,通过递归,最好考虑以下方面: 1)当我有零项目时该怎么办。 2)当我有一个项目时该怎么办。 3)如何处理我的列表中有多个项目的所有其他情况。
答案 1 :(得分:-1)
你对递归的“分而治之”算法有正确的想法。基本思想是以下行动:
通过打印“中间”让你自己变得困难。相反,只有在达到终止条件时才应该进行打印,也就是说,当你只有一个元素时,你不能将数组分成两半。
此外,您的代码包含方法outrev()
和outrev(int left, int right)
的定义,但没有outm(int left, int right)
的定义,因此您发布的代码无法编译。