这种递归有意义吗?

时间:2018-05-02 23:25:34

标签: java recursion arraylist

import java.util.*;

public class ArrayList5 {

    static int max(ArrayList list) { // to be completed
        if (list.size() == 0) {
            return 0;
        }
        else
        {
            int first = (Integer) list.get(0);

            list.remove(0);
            if (first > max(new ArrayList(list)))
            {
                return first;
            } 
            else 
            {
                return max(list);
            }
        }

    }

    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList();
        Collections.addAll(list, 4, 5, 3, 2, 3, 1, 3);
        // int t=Console.readInt("Enter Target:");
        int res1 = max(new ArrayList(list));
        System.out.println("max=" + res1);
    }
}

我不明白为什么需要max(new ArrayList(list)))部分。为什么它必须创建一个新的,为什么它不能继续使用一个列表?

同样为什么它不会陷入循环(它的递归,所以它会继续发送一个新的列表,所以我不明白为什么'first'每次都不会是4)?

2 个答案:

答案 0 :(得分:1)

实际上,有许多不需要的多余代码会使代码变得繁琐/难以阅读/理解。

您可以大量简化代码并删除对ArrayList的任何引用,这些引用并非真正必要,并且在正确的位置使用适当的泛型,使代码实际可读。

您无需在整个地方投射或创建列表。

public class ArrayList5 {

    static int max(final List<Integer> list) {
        if(list.isEmpty()) return 0;

        final int head = list.get(0);
        final List<Integer> tail = list.subList(1, list.size());

        return (head > max(tail)? head:max(tail));
    }

    public static void main(final String... args) {
       final int res1 = max(Arrays.asList(4, 5, 3, 2, 3, 1, 3));
       System.out.printf("max=%d", res1);
    }
}

答案 1 :(得分:0)

你应该试试这个:

static int max(ArrayList<Integer> list) {...}
public static void main(String[] args) {
    ArrayList<Integer> list = new ArrayList();
    Collections.addAll(list, 4, 5, 3, 2, 3, 1, 3);
    // int t=Console.readInt("Enter Target:");
    int res1 = max(new ArrayList(list));
    System.out.println("max=" + res1);
}

编译器可能会抛出警告,因为您没有声明ArrayList的类型。