Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.06.2016, 22:53   #1
КсенияФокина
Новичок
Джуниор
 
Регистрация: 15.06.2016
Сообщений: 6
По умолчанию Рекурсивная функция

Задача. Написать рекурсивную функцию, которая принимает массив и размер массива как аргументы и возвращает наименьший элемент массива. Функция должна прекращать свою работу и возвращаться, если принимаемый массив имеет один элемент. В интернете нашла похожий вопрос, но там чисто на саму рекурсию, а у меня вопрос-собственно и ошибка возникает в этом месте, при вводе массива с клавиатуры. Выделение динамической памяти-что я попыталась сделать,не нужно. Просто я опиралась на предыдущую лабораторную работу, поэтому и решила что подойдет.Объясните пожалуйста в чем ошибка. Заранее огромное спасибо.
Код:
#include <iostream.h>
int recursivmin (int arr[], int size)
{
if (size==1)
return arr [size-1];
else
{
int a=recursivmin(arr,size/2);
int b=recursivmin(arr+size/2,size-size/2);
return a<b?a:b;
}
}
int main ()
{
	int n,i;
	cout<<"vvedite razmernost massiva\n";
	cin >> n;
	int Massiv[i]=new int [n];
cout<<"vvedite elementi massiva\n";
		for (int i=0; i<n;i++)
		cin>>Massiv[n];
       cout<<"min"<<recursivmin(Massiv[n],n);
cout<<endl;
 return 0;
}

Последний раз редактировалось Аватар; 15.06.2016 в 23:28.
КсенияФокина вне форума Ответить с цитированием
Старый 15.06.2016, 23:27   #2
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Т.к. это C++, то заголовочный файл без .h. И инициализацию массива подправил. Вроде работает, но я плохо знаю C/C++.
Код:
#include <iostream>

using namespace std;

int recursivmin (int arr[], int size)
{
    if (size==1)
        return arr [size-1];
    else
    {
        int a=recursivmin(arr,size/2);
        int b=recursivmin(arr+size/2,size-size/2);
        return a<b?a:b;
    }
}
int main ()
{
    int n;
    cout<<"vvedite razmernost massiva\n";
    cin >> n;
    int *Massiv=new int [n];
    cout<<"vvedite elementi massiva\n";
    for (int i=0; i<n; i++)
        cin>>Massiv[i];
    cout<<"min"<<recursivmin(Massiv,n);
    cout<<endl;
    delete [] Massiv;
    return 0;
}
Добавил очистку памяти от массива.

Последний раз редактировалось FPaul; 15.06.2016 в 23:33.
FPaul вне форума Ответить с цитированием
Старый 16.06.2016, 00:33   #3
КсенияФокина
Новичок
Джуниор
 
Регистрация: 15.06.2016
Сообщений: 6
По умолчанию

Огромное спасибо)Все работает. Можно вопрос если не затруднит-зачем звездочка рядом с именем массива?)

Как я уже писала-саму функцию слизала с интернета-мне все в ней понятно кроме вот этой строчки- a<b?a:b;
что она означает? если а меньше b, а становитьcя b?

И еще, я извиняюсь, огромное спасибо Вам за помощь, но когда количество элементов массива 1-он запрашивает ввести сам элемент и на выдает этот самый элемент минимальным. А заканчивает свою работу только когда в размерность ноль забиваешь(

Последний раз редактировалось Аватар; 16.06.2016 в 12:32.
КсенияФокина вне форума Ответить с цитированием
Старый 16.06.2016, 01:43   #4
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Ссылка Тернарная условная операция
Цитата:
когда количество элементов массива 1-он запрашивает ввести сам элемент и на выдает этот самый элемент минимальным.
Это правильно
Цитата:
А заканчивает свою работу только когда в размерность ноль забиваешь(
Не могу понять - как. Там нет зацикливания.
FPaul вне форума Ответить с цитированием
Старый 16.06.2016, 10:28   #5
КсенияФокина
Новичок
Джуниор
 
Регистрация: 15.06.2016
Сообщений: 6
По умолчанию

К сожалению я не могу вставить картинку, но это действительно так, при вводе размерности равной 1 он должен по сути выходит из программы, ну по заданию. А он просит ввести элементы. А когда вводишь ноль, не просит ввести элементы. Пишет нажмите окей для выхода)
КсенияФокина вне форума Ответить с цитированием
Старый 16.06.2016, 10:57   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

КсенияФокина, Вы ошибаетесь.

в задании, что сказано:
Цитата:
Функция должна прекращать свою работу и возвращаться, если принимаемый массив имеет один элемент.
Функция должна прекращать свою работу, а не программа.
А программа, если Вы хотите ввести массив из одного элемента, должна запросить этот элемент, потом передать массив из одного элемента в функци и функция должна завершить свою работу (вернув этот элемент, как минимальный, кстати).
имхо, так.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.06.2016, 11:50   #7
КсенияФокина
Новичок
Джуниор
 
Регистрация: 15.06.2016
Сообщений: 6
По умолчанию

Я Вас поняла. Огромное спасибо. Не могли бы ы еще ответить по поводу звездочки и строчки с переменными а и b.
Просто в моем понимании звездочка это указатель, а зачем он в данной программе? без него не выделяется память?)
КсенияФокина вне форума Ответить с цитированием
Старый 16.06.2016, 11:55   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
и строчки с переменными а и b.
так Вам же уже ответил выше FPaul

Цитата:
Сообщение от FPaul Посмотреть сообщение
это тернарная условная операция - задаётся условие,если оно истино, возвращается первая часть, инача - вторая часть:
Цитата:
Код:
return a<b?a:b;
читаем - если a<b, тогда вернуть a, иначе - вернуть b

это можно записать через if:
Код:
if a<b { return a; } else {return b;}
но, в данном случае, запись через тернарный оператор и запись короче и проще и наглядней и надежней.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.06.2016, 12:09   #9
КсенияФокина
Новичок
Джуниор
 
Регистрация: 15.06.2016
Сообщений: 6
По умолчанию

Огромное спасибо. А что со звездочкой-мой ход мыслей хотя бы правильный-это указатель?))
КсенияФокина вне форума Ответить с цитированием
Старый 16.06.2016, 18:10   #10
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Да, со звёздочкой - указатель. Если бы строка была
Код:
int *Massiv;
то Massiv был бы неинициализированным (указывающем на случайный участок памяти) указателем на целое число (или на первый элемент в массиве целых чисел).
Чисто теоретически, можно было бы сделать присвоение
Код:
  Massiv=&n;
И тогда Massiv указывал на ту же ячейку памяти, что и переменная n.
Но мы выделили память в куче для массива int *Massiv=new int [n]; и теперь указатель хранит адрес начала массива.

Фух, устал. Почитайте об указателях и динамических массивах. Я вчера впервые в жизни сам увидел как это делается в C/C++. Вы тоже можете почитать.
FPaul вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсивная функция Solidera Помощь студентам 6 02.04.2013 09:45
Рекурсивная функция Alerq Паскаль, Turbo Pascal, PascalABC.NET 2 17.04.2011 18:42
Рекурсивная функция Trinity13 Помощь студентам 8 14.02.2010 18:44
Си++. Рекурсивная функция. Diamond2107 Помощь студентам 6 02.12.2009 19:48