java递归地反向打印数组

时间:2011-09-28 05:14:10

标签: java arrays string recursion

数组是一个字符串数组。数组是{"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);


    }
}

2 个答案:

答案 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)

你对递归的“分而治之”算法有正确的想法。基本思想是以下行动:

  1. 将数组分成两半:
  2. 递归打印右半部分
  3. 递归打印左半部分
  4. 通过打印“中间”让你自己变得困难。相反,只有在达到终止条件时才应该进行打印,也就是说,当你只有一个元素时,你不能将数组分成两半。

    此外,您的代码包含方法outrev()outrev(int left, int right)的定义,但没有outm(int left, int right)的定义,因此您发布的代码无法编译。