Не удалось выпрыгнуть из цикла while, даже когда я нажал на возвратную Java - PullRequest
0 голосов
/ 25 мая 2018

Вот мой код, когда мои входные данные - {2, 3, 4, 5} и = {1}, я не мог выпрыгнуть из цикла while, даже когда нажал «return r1».Программа выведет «???», но продолжает цикл до тех пор, пока не получит индекс из привязанного исключения.Проводной.

int[] nums1 = {2, 3, 4, 5}, nums2 = {1};

public static double findMedianSortedArrays(int[] nums1, int[] nums2) {

    if(nums1.length > nums2.length) {
        findMedianSortedArrays(nums2, nums1);
    }
    int half = (nums1.length + nums2.length) / 2;
    double l1 = 0;
    double l2 = 0;
    double r1 = 0;
    double r2 = 0;
    int cutR = nums1.length;
    int cutL = 0;
    int cut1 = 0;
    while(cut1 <= nums1.length) {
        cut1 = (cutR + cutL) / 2;
        int cut2 = half - cut1;

        l1 = (cut1 == 0) ? Integer.MIN_VALUE : nums1[cut1 - 1];
        r1 = (cut1 == nums1.length) ? Integer.MAX_VALUE : nums1[cut1];
        l2 = (cut2 == 0) ? Integer.MIN_VALUE : nums2[cut2 - 1];
        r2 = (cut2 == nums2.length) ? Integer.MAX_VALUE:nums2[cut2];

        if(l1 > r2)  
            cutR =  cut1 - 1;
        else if(l2 > r1)  
            cutL = cut1 + 1;
        else {
            if((nums1.length + nums2.length) % 2 == 0) { 
                l1 = (l1 > l2) ? l1 : l2;
                r1 = (r1 < r2) ? r1 : r2;
                return (l1 + r1) / 2;
            } else {
                r1 = (r1 < r2) ? r1 : r2;
                System.out.println("???");
                return r1;
            }
        }
    }
    return -1;


}

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Возможно, я не правильно понял, что вы намеревались сделать, но я думаю, что ваша проблема связана с этим:

if(nums1.length > nums2.length) {
    findMedianSortedArrays(nums2, nums1);
}

Я полагаю, что ваш метод работает, если nums1.length <= <code>nums2.length,если нет, просто позвоните после замены параметров.

Проблема, когда это происходит, состоит в том, что вы ничего не делаете с возвращаемым значением (оно успешно выполнено, поэтому выдает ???), и что вы потом продолжаете с неправильными параметрами и в конечном итоге бросаете IndexOutOfBoundException.

Чтобы исправить это, нужно просто вернуть значение с параметрами в ожидаемом порядке:

if(nums1.length > nums2.length) {
    return findMedianSortedArrays(nums2, nums1);
}
0 голосов
/ 25 мая 2018

Когда вы рекурсивно вызываете метод, вы создаете новый экземпляр этого метода в стеке.Попробуйте думать об этом как об уровнях и, возможно, даже о создании фильма.Вы находитесь в методе main и вызываете run ().Теперь вы находитесь на 1-м уровне run ().Если вы снова вызываете run () на уровне 1, вы переходите на уровень 2. Когда вы возвращаетесь с уровня 2, вы возвращаетесь на уровень 1. Если вы возвращаетесь с уровня 1, вы возвращаетесь туда, где исходный run ()был назван.

...