Рекурсивная функция - C++ [требует правки]

243
19 апреля 2017, 13:39

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

using namespace std;
void find(int size, int kluch, int *massiv, int *index)
{
    int j = 0;
    for (int i = 0; i < size; i++)
    {
        j++;
        if (massiv[i] == kluch)
        {
            index[j] = i + 1;
        }
        else
            j--;
    }
    if (j > 1)
    {
        cout << "\nЧисло >" << kluch << "< с индексами ";
        for (int k = 1; k <= j; k++)
            cout << index[k] << " ";
        cout << "имеется в списке" << endl;
    }
    else if (j == 1)
    {
        cout << "\nЧисло >" << kluch << "< с индексом ";
        for (int k = 1; k <= j; k++)
            cout << index[k] << " ";
        cout << "имеется в списке" << endl;
    }
    else
        cout << "\nЧисло >" << kluch << "< не найдено в списке" << endl;
}
void find_recursion(int size, int kluch, int *massiv, int *index)/////////////////////////////////////////////////////
{

}
Answer 1

Подходите к рекурсивным функциям как "как решить эту задачу, решая задачу меньшего размера"? И - ко всем функциям - с требованием, чтобы функция выполняла одно логическое действие. Ваша функция и ищет, и выводит ответ - это совершенно разные вещи.

Итак, есть массив, его длина, значение ключа. Как мы ищем элемент? Давайте пойдем с конца (чтоб не мучиться со смещением индекса от начала). Если последний элемент массива - тот, что нам нужен - вернем его. Если нет - будем искать в массиве на один элемент меньшем:

int find(int* array, int size, int key)
{
    if (array[size-1] == key) return size-1; // Искомый элемент найден
    // Иначе ищем его среди `size-1` элементов
    return find(array,size-1,key);
}

Все? Нет, потому что нужно еще решить, что делать, если элемент не найден (d этом случае наша функция будет все время вызывать себя - получится бесконечная рекурсия). Так как индексы меньше 0 не бывают, давайте возвращать -1 как признак отсутствия. Когда мы знаем, что элемента нет? При поиске в пустом массиве. Так что нужно сначала добавить проверку

if (size == 0) return -1; // не найден

Итак, окончательно:

int find(int* array, int size, int key)
{
    if (size == 0) return -1; // Не найден
    if (array[size-1] == key) return size-1; // Искомый элемент найден
    // Иначе ищем его среди `size-1` элементов
    return find(array,size-1,key);
}

Все. Теперь вывод организовываем в другой функции, например,

void find_message(int* array, int index)
{
    if (index < 0) 
    {
        cout << "Key not found\n"; return;
    }
    cout << "Key " << array[index] << : was found in position " << index << endl;
}

Ну, а в main() или еще где...

int array[SIZE] = ...
...
int idx = find(array,SIZE,key);
find_message(array,idx);
READ ALSO
Создание АТД &ldquo;Стек&rdquo; на основе массива - C++

Создание АТД “Стек” на основе массива - C++

"Реализуйте АТД “стек” на основе массива фиксированного размера для элементов, являющихся односвязными списками целых чисел (те

203
Electron.Запуск ncpa.cpl в ОС Windows

Electron.Запуск ncpa.cpl в ОС Windows

ЗдравствуйтеЕсть ли возможность запустить скрипт ncpa

233
mongoose Проблемы с сохранением схемы

mongoose Проблемы с сохранением схемы

Во-первых хочу прояснить почему не срабатывает данный код, так как почти аналогичный работает

252