Рекурсивный метод isMember только с двумя аргументами! - PullRequest
0 голосов
/ 11 июня 2011

Мне нужно создать рекурсивный логический метод с именем isMemeber.Метод должен принимать ТОЛЬКО два аргумента: массив и значение.Метод должен возвращать true, если значение найдено в массиве, или false, если значение не найдено в массиве.

Я думаю, что базовый случай будет, если переданный массив пуст, но мне нужнопомогите с рекурсивным регистром:

public static boolean isMember(int[] array, int value)
{
    if(array.length==0){
        return false; 
    }else{
        return isMember(???);           
    }
}

Вот как это выглядит с переменной позиции:

public static boolean isMember(int[] array, int value, int position)
{
    if (position > -1)
    {

        if (array[position] == value)
        {
            return true;
        }
        else
        {
            return isMember(array, value, position - 1);
        }
    }
    return false;

}

Ответы [ 5 ]

2 голосов
/ 11 июня 2011

Если вам нужно использовать рекурсию, вы можете скопировать массив для каждой рекурсии.Это неэффективно, но использование рекурсии неэффективно по сравнению с использованием цикла.например, Arrays.indexOf()

public static boolean isMember(int[] array, int value) {
    if(array.length == 0) return false; 
    if(array[0] == value) return true;
    int[] array2 = new int[array.length-1];
    System.arraycopy(array,1,array2,0,array2.length);
    return isMember(array2, value);           
}
0 голосов
/ 05 декабря 2016

Я просто делал вопрос и проверял ответы на альтернативные способы.Может быть, это может быть полезно, когда вам нужно сопоставить имена с массивами String.

public class Recursion {

    public static void main(String[] args) {
        String[] array = {"Tom", "Mary"};
        if(isMember(array,"John"))
            System.out.print("Found!");
        else
            System.out.println("Not Found!");

    }

    public static boolean isMember(String[] array, String name)
    {   
        int i = array.length;
        if(array.length == 0)
            return false;
        if(array[i - 1].equals(name))
            return true;
        else
        {
            String[] array2 = new String[array.length - 1];
            for(int b = 0; b< array.length -1; b++)
            {
                array2[b] = array[b];
            }
            return isMember(array2, name);
        }
    }
}
0 голосов
/ 11 июня 2011

Существует небольшая проблема с вашей проблемой.Если вы собираетесь использовать рекурсию, то у каждого элемента массива должна быть подпозиция элементов, в противном случае, почему вы перешли к рекурсивному методу?Если это не casr, и дело обстоит так, как вы заявили, то решение этой проблемы с помощью рекурсии не подходит.Также вам не хватает сравнения значений.

0 голосов
/ 11 июня 2011

Если это домашнее задание, и они хотят, чтобы оно было рекурсивным, то, возможно, вам следует:

1 найдите среднее значение массива и проверьте, соответствует ли оно. Если это совпадает, верните true

2 применить функцию к первой половине массива. Если он возвращает true, верните true

3 применить функцию ко второй половине массива. Если он возвращает true, верните true

4 return false

Нет кода, так как это домашнее задание.


РЕДАКТИРОВАТЬ: упорядочен ли массив?

0 голосов
/ 11 июня 2011

См. Класс массива MSDN . Похоже, это C #. Может быть, попробуйте метод Array.Find<T>.

Обновление:
Для Java я бы рекомендовал посмотреть Массивы (платформа Java 2) :

BinarySearch

public static int binarySearch (int [] а, ключ int)

Поиск в указанном массиве целых чисел указанного значения с использованием алгоритма двоичного поиска. Массив должен быть отсортирован (как вышеописанным методом сортировки) перед выполнением этого вызова. Если это не отсортировано, результаты не определено. Если массив содержит несколько элементов с указанным значение, нет гарантии, какой будет найден.

Parameters:
    a - the array to be searched.
    key - the value to be searched for. 
Returns:
    index of the search key, if it is contained in the list; otherwise,> (-(insertion point) - 1). 

Точка вставки определяется как точка, в которой ключ будет вставлен в список: индекс первого элемента больше, чем ключ, или list.size (), если все элементы в списке меньше указанного ключа. Обратите внимание, что это гарантирует, что возвращаемое значение будет> = 0 тогда и только тогда, когда ключ найден. Смотрите также: sort (int [])

...