Как вы рекурсивно подсчитываете количество отрицательных чисел в массиве (Java)?

Мне нужно использовать этот метод:

public static int countNegative(double[] numbers, int count){ }

для подсчета количества отрицательных чисел в двойном массиве. Я мог бы легко это сделать, если бы мог включить третий параметр, сумму, но я могу использовать только массив и целое число. Я полностью застрял. Я пробовал несколько вещей, но не могу понять это правильно. Я получил все, от размера массива до ArrayIndexOutOfBounds, но никогда не получал правильного ответа. Может ли кто-нибудь помочь мне с этим?

-РЕДАКТИРОВАТЬ-

Ну вот точное задание:

Напишите программу, которая считывает последовательность чисел (не обязательных целых чисел) из стандартного ввода до тех пор, пока не будет прочитан 0, и сохраняет их в массиве, аналогично тому, что вы делали в задании 2. Эта часть выполняется с помощью итерации. Можно предположить, что номеров будет не более 100.

Затем вычислите максимальное число, хранящееся в массиве, количество отрицательных чисел и вычислите сумму положительных чисел, используя рекурсию. Таким образом, вы создадите рекурсивные методы findMax, countNegative и calculateSumPositive в классе Assignment9, и они будут вызываться основным методом.

В частности, должны быть реализованы следующие рекурсивные методы (эти методы не должны содержать циклов):

public static double findMax(double[] numbers, int count)  -> It finds the maximum number in the array, count is the number of elements

в массиве

public static int countNegative(double[] numbers, int count) -> подсчитывает отрицательные целые числа

public static double calculateSumPositive(double[] numbers, int count) -> суммирует количество положительных целых чисел

findMax() было легко:

public static double findMax(double[] numbers, int count){
        if(numbers.length - 1 == count)
            return numbers[count];
        else 
            return Math.max(numbers[count], findMax(numbers, count+1));
    }

Это моя последняя попытка countNegative. Он просто возвращает 99 (у меня массив инициализирован 100 элементами):

public static int countNegative(double[] numbers, int count){
        int i=0;
        if(numbers[count]<0)
            i=1;
        if(numbers.length-1==count)
            return count;
        else
            return i+countNegative(numbers,count+1);
     }

Я должен быть в состоянии вычислить вычислениеSumPositive, если я могу вычислить это отрицательное значение.

Граф может быть таким, каким вам нужно. Я использовал его больше как индекс в findMax.


person rphello101    schedule 28.03.2013    source источник
comment
Обязательно ли использовать рекурсию? Кроме того, для чего нужен параметр count? Будет очень полезно, если вы процитируете требования, указанные в вопросе, а также покажете суть испробованного вами кода.   -  person David Z    schedule 28.03.2013
comment
Используйте count в качестве индекса.   -  person Sotirios Delimanolis    schedule 28.03.2013
comment
Я добавил больше кода. Да, я должен использовать рекурсию. Граф - это то, что вы хотите, чтобы это было. Требования процитированы. Добавлена ​​самая последняя попытка. Это домашнее задание. И да, count, вероятно, лучше всего использовать в качестве индекса.   -  person rphello101    schedule 28.03.2013


Ответы (5)


Какая польза от count? Было бы разумно, если бы это было index:

public static int countNegative(double[] numbers, int index)
{
    if(index == numbers.length) return 0;
    return (numbers[index] < 0 ? 1 : 0) + countNegative(numbers, index + 1);
}

и назовите это так:

int count = countNegative(array, 0);
person Eng.Fouad    schedule 28.03.2013

Используйте параметр int в качестве индекса в массиве numbers. Определите, является ли значение текущего индекса отрицательным (здесь считается 0 или 1). Затем верните сумму этого счетчика 0/1 и рекурсивного вызова, который просматривает следующую позицию индекса. Базовый случай — это когда вы прошли конец массива, который возвращает 0.

person rgettman    schedule 28.03.2013

public static int countNegative(double[] numbers, int count){  
   if(count == numbers.length){  
        return 0;  
    }  
    int sum = countNegative(numbers, count + 1);  
    if(numbers[count] < 0){  
          sum++;  
    }  
    return sum;  
}

Вы вызываете этот метод: countNegative(numbers, 0);
count следует использовать в качестве базового условия рекурсии. Вы возвращаете результат обратно в стек

Пример:

double a[]={-12.0,1.0,0.0,23.0,-23.0,-9.0};  
System.out.println(countNegative(a, 0));  

Я получаю 3 в консоли

person Cratylus    schedule 28.03.2013
comment
Хороший вопрос... Мой вклад был проблемой. С небольшой доработкой это сработало. Спасибо. - person rphello101; 28.03.2013

Начните с его реализации для массива с 0 элементами. для массива из 1 элемента. Для большего массива используйте предыдущие результаты...

person RobAu    schedule 28.03.2013

вот как это может работать

public static int countNegative(double[] numbers){
    int result = numbers[0] < 0 ? 1 : 0;

    if(numbers.length > 1) {
        result += countNegative(Arrays.copyOfRange(numbers, 1, numbers.length));
    }

    return result;
}

Вам не нужен параметр count из-за того, как работает рекурсия. когда вы вызываете функцию с массивом, она сначала определяет, меньше ли первый элемент нуля, что делает его отрицательным. Затем он проверяет, содержит ли массив более одного элемента, и если да, то вызывает сам себя со всем, кроме первого элемента массива, и добавляет его к результату.

После этого он возвращает результат, который в зависимости от того, находится ли он в рекурсивном вызове или нет, либо добавит его к результату вызова над ним, либо вернет его человеку, вызывающему его.

person kMaiSmith    schedule 28.03.2013