递归方法检查一行整数是否正在下降:return true / false

时间:2015-09-12 15:21:22

标签: java recursion

我必须在Java中编写一个递归方法,如果一行是降序则返回true而假设不是。

这是我尝试过的,但它无法正常工作:

ArrayList<Integer> getallen = new ArrayList();
        getallen.add(500);
        getallen.add(400);
        getallen.add(300);
        getallen.add(200);
        getallen.add(100);
        getallen.add(0);

        System.out.println(isDescending(getallen));
    }

public static boolean isDescending(ArrayList<Integer> getallen) {
    if (getallen.size() >= 2) {
        if (getallen.get(0) < getallen.get(1)) {
            return false;
        } else if (getallen.size() > 0) {
            getallen.remove(0);
            return isDescending(getallen);
        } else {
            return true;
        }
    } else {
        return false;
    }
}

3 个答案:

答案 0 :(得分:1)

如果大小小于2,我认为你有不必要的情况你只能假设为真。

尝试:

public static boolean isDescending(ArrayList<Integer> getallen) {
    if (getallen.size() >= 2) {
        if (getallen.get(0) < getallen.get(1)) {
            return false;
        } else {
            getallen.remove(0);
            return isDescending(getallen);
        }
    } else {
        return true;
    }
}

答案 1 :(得分:0)

如果我必须对此进行评分,那么

会得到一个很大的X值
  • 在stackoverflow上被欺诈性地询问
  • 效率很低(尝试在一百万个元素的列表上运行此测试,然后意识到删除ArrayList中的元素0会导致所有元素向下移动)

而是考虑:

public static boolean isDescending(List<Integer> getallen) {
    return isDescending(getallen, 0);
}

public static boolean isDescending(List<Integer> getallen, int from) {
    return from >= getallen.size() - 1
            || getallen.get(from) < getallen.get(from + 1)
            && isDescending(getallen, from + 1);
}

答案 2 :(得分:0)

如何使用对数递归深度更有效的方法?就像练习一样。

public static void main(String[] args) {
    List<Integer> getallen = new ArrayList<Integer>();        
    getallen.add(500);
    getallen.add(400);
    getallen.add(300);
    getallen.add(200);
    getallen.add(100);
    getallen.add(0);

    System.out.println(isDescending(getallen));
}

public static boolean isDescending(List<Integer> getallen) {
    return isDescending(getallen, 0, getallen.size());
}

private static boolean isDescending(List<Integer> getallen, 
        int start, int end) {
    if (end - start <= 1)
        return true;
    if (end - start == 2) {
        return getallen.get(start) > getallen.get(start + 1);
    }
    int middle = (start + end - 1) / 2 + 1;
    return (getallen.get(middle - 1) > getallen.get(middle)) && 
            isDescending(getallen, start, middle) && 
            isDescending(getallen, middle, end);
}