找到递归void方法的基本案例

时间:2013-11-04 09:28:18

标签: java methods recursion

我正在做作业。我想为递归建立一个基本案例,其中按升序对给定的数字(list2)进行排序。编写此代码的目的是当所有数字按升序排列时,应停止调用名为ascending的方法(list2,list1);并且list2中的所有值都应该发送到list1。例如,list2 = 6,5,4,3,2,1然后list2变为空,list1应为1,2,3,4,5,6。我试图将结果与之前的结果进行比较,如果匹配则停止。但我找不到基本情况来阻止它。另外,ascending()和fixedPoint()都是void方法。有人有想法吗?大声笑了3天......

当我运行我的代码时

6,5,4,3,2,1

5,6,4,3,2,1

4,5,6,3,2,1

3,4,5,6,2,1

2,3,4,5,6,1

1,2,3,4,5,6-

1,2,3,4,5,6-

1,2,3,4,5,6-

1,2,3,4,5,6-

1,2,3,4,5,6-

无限.............

public class Flipper
{
public static void main(String[] args)
{   
    Flipper aFlipper = new Flipper();

    List<Integer> content = Arrays.asList(6,5,4,3,2,1);
    ArrayList<Integer> l1 =  new ArrayList<Integer>(content);
    ArrayList<Integer> l2 = new ArrayList<Integer>(); // empty list

    aFlipper.fixedPoint(l2,l1);

    System.out.println("fix   l1 is "+l1);
    System.out.println("fix   l2 is "+l2);
}
public void fixedPoint(ArrayList<Integer> list1, ArrayList<Integer> list2)
{
    // data is in list2
    ArrayList<Integer> temp1 = new ArrayList<Integer>(); // empty list

    if (temp1.equals(list2)) 
    {
        System.out.println("found!!!");             
    }

    else
    {
        ascending(list2, list1); // data, null
        temp1 = list1; // store processed value
        System.out.println("st list1 is "+list1);
        System.out.println("st list2 is "+list2);
    }
    fixedPoint(list2, list1); // null, processed data       
}

接受建议后再尝试。

else        {
            temp1 = list2;
            System.out.println("temp1: "+temp1); 

// temp1打印出指定的值

            // store only previous value
            ascending(list2, list1); // data, null

            temp2 = list1;
            // store previous value

            System.out.println("temp1: "+temp1); 

//在调用ascending()temp1之后 变得空了大声笑所以不能在if语句中进行比较.... 任何人都可以纠正吗?

            System.out.println("temp2: "+temp2);
        }
        fixedPoint(list2, list1); // previous, proceeded data

在使用dasblinkenlight进行脑力激荡后,Julien S,Nikolas,ZouZou和vels4j找到了解决方案。我感谢您的思想贡献! : - )

public void fixedPoint(ArrayList<Integer> list1, 
                       ArrayList<Integer> list2)
    {
        List<Integer> content = Arrays.asList(1);
        ArrayList<Integer> temp1 = new ArrayList<Integer>(content); 
        fixedPoint(list2, list1, temp1);
    }
    // Since it is recursive method I needed to create another parameter
    // to store temporary values.
    public void fixedPoint(ArrayList<Integer> list1, 
                           ArrayList<Integer> list2, 
                           ArrayList<Integer> temp)
    {


        ArrayList<Integer> temp1 = new ArrayList<Integer>();
        temp1 = temp;

        if (temp1.equals(list2))
        {
            return;
        }

        else
        {
            temp1.clear(); 
            for(int i = 0; i < list2.size(); i++) 
            // To store temp value of list2, 
            // I used add method.  Because ArrayList is an object type so if I assign 
            // list2 to temp1 then it will assign memory address rather 
            // than values.  Thus I will lose the values after invoking ascending() as 
            // all elements of list2 will shipped to list1.  So List2 becomes empty.
            {
                temp1.add(list2.get(i));
            }
            ascending(list2, list1);

            fixedPoint(list2, list1, temp1);
        }

    }

3 个答案:

答案 0 :(得分:0)

您的问题可能源于temp1.equals(list2)的使用。您要使用的是Arrays.equals(temp1, list2)

Peter Lawrey给出了here的解释。

修改 是的,我应该读得更好。

我刚检查过,看来ArrayList从.equals()继承了List,其定义与array.equals()和“应该”不同。

答案 1 :(得分:0)

找到案例时,fixedPoint中没有返回。因此行fixedPoint(list2,list1); 无论固定点如何,都将被处理。 我无法测试,因为没有提供升序方法,但我认为

if (CollectionUtils.isEqualsCollection(list1,list2) 
{
    System.out.println("found!!!"); 
    return;            
}

可以胜任。

您需要Apache-commons Collections在isEqualsCollection列表中执行相等性。

答案 2 :(得分:0)

  

编写此代码的目的是,当所有数字按升序排列时,应停止调用名为ascending(list2, list1)的方法

然后你应该添加一个循环来检查list1的元素是否按升序排列,如下所示:

public void fixedPoint(ArrayList<Integer> list1, ArrayList<Integer> list2)
{
    boolean isAscending = true;
    for (int i = 1 ; (isAscending) && (i < list2.size()) ; i++) {
        isAscending = list2.get(i-1) < list2.get(i);
    }
    if (isAscending) {
        ... // Insert code to copy the data from list2 to list1.
        ... // Note that a simple assignment is not going to work here!
        System.out.println("found!!!");
        return;
    }
    // It's not in ascending order - continue recursing down.
    ascending(list2, list1);
    ArrayList<Integer> temp1 = new ArrayList<Integer>(list1); // store processed value
    fixedPoint(list2, list1);
    // temp1 makes the old value of list1 available for comparison
    System.out.println("st list1 is "+list1);
    System.out.println("st list1 was "+temp1);
    System.out.println("st list2 is "+list2);
}