|
|
|
| Нужно с помощью рекурсии найти максимальное и минемальное значение в одномерном массиве, ни чего не получается есть пример программы по нахождению только минемального но она тоже работает не правильно:
#include<iostream>
using namespace std;
int min(const int a[], int left, int right)
{ if (left==right) return a[left];//--можно и a[right]
int m = (left+right)/2; //--середина
int x = min(a, left, m); //--обработка левой половины массива
int y = min(a, m+1, right); //--обработка правой половины массива
if (x<y) return x; else return y;
}
void main()
{int mas[5]={1,2,3,4,5};
int k;
cout<<min(mas,5,k-1);
system("pause");
}
Подскажите пожалуйста как это реализовать? | |
|
|
|
|
|
|
|
для: Atamanochka
(27.12.2011 в 13:44)
| | Во-первых вы вызываете её непонятно как. В качестве левой границы указываете 5, в качестве правой границы k-1 (и наоборот нужно и значения неправильные). У вас массив содержит 5 элементов, т.е. больше 4 индекс не может принимать, k вообще в main() не инициализирована, как минимум, вызов должен выглядеть так
0 - это индекс первого элемента массива mas
4 - это индекс последнего элемента массива mas
Во-вторых, программа у вас уходит в бесконечную рекурсию, так как вы делите массив пополам, если количество элементов нечетное - все нормально, там посередине стоит элемент, если количество элементов подмассива четное, начинаются биения и точка возврата из рекурсии не срабатывает. Нужно проверять, есть у вас посередине интервала точка или нет и в зависимости от этого принимать решение какую точку брать.
Вот ваша задача для минимального элемента
#include<iostream>
using namespace std;
// Есть ли середина?
int is_center(int left, int right)
{
return !((left + right) % 2);
}
// Рекурсивный поиск минимума
int min(const int a[], int left, int right)
{
int x, y, m, center;
// Точка возврата из рекурсии
if (left == right) return a[left];
// Вычисляем середину
m = (left + right) / 2;
// Минимум слева от середины
if(is_center(left, m))
x = min(a, left, m);
else
x = min(a, left, m - 1);
// Минимум справа от середины
if(is_center(m, right))
y = min(a, m, right);
else
y = min(a, m + 1, right);
// Выбираем минимальный из результатов
if (x < y) return x;
else return y;
}
void main()
{
// int mas[5]={1,2,3,4,5};
int mas[5]={5,4,1,2,6};
cout << min(mas, 0, 4) << endl;
system("pause");
} | Тут конечно, вообще 4 вызова получилось, но это рабочий вариант и его можно быстро переработать для максимального значения (если это вызовет трудности - пишите). | |
|
|
|
|
|
|
|
для: cheops
(27.12.2011 в 15:42)
| | Нет трудности не вызовет я понимаю сам смысл. Спасибо, с К это я уже когда совсем незнала что сней делать ввела, потом убрать забыла, а так на ее месте просто число 5 стояло, я с ней что то сделать хотела уже и непомню, спасибо за код все работает, но я только поступила в институт и эта программа совершенно не мой уровень к сожаление ... Мы просто даже этого не проходили. | |
|
|
|
|
|
|
|
для: Atamanochka
(27.12.2011 в 15:57)
| | Успели уже ответить, ошибка была в предыдущей программе, вот более правильный (да и более экономный) вариант
#include<iostream>
using namespace std;
int min(const int a[], int left, int right)
{
int x, y, m, center;
// Точка возврата из рекурсии
if (left == right) return a[left];
// Обходим проблему "биений" рекурсии
if((left - right) == 1 || (right - left) == 1)
{
return a[left] < a[right] ? a[left] : a[right];
}
// Вычисляем середину
m = (left + right) / 2;
// Минимумы слева и справа от середины
x = min(a, left, m);
y = min(a, m, right);
// Выбираем минимальный из результатов
if (x < y) return x;
else return y;
}
void main()
{
// int mas[5]={1,2,3,4,5};
int mas[8]={1,6,4,4,3,2,3,6};
cout << min(mas, 0, 7) << endl;
system("pause");
} |
| |
|
|
|
|
|
|
|
для: Atamanochka
(27.12.2011 в 15:57)
| | >но я только поступила в институт и эта программа совершенно не мой уровень к сожаление ... Мы
>просто даже этого не проходили.
ВУЗ - это армия для мозга, вас заставляют действовать в условиях отсутствия времени и информации. Не ждите, что вам будут давать материал последовательно (особенно на 1-2 курсе) - изучайте все, что вам нужно самостоятельно (это конечно в первую очередь касается профильных предметов, если программирование вам добавили в качестве общеобразовательной нагрузки, понятно что обкладываться книгами по нему не стоит, если же это ваша специальность - не ждите преподавателей, тренируйте себя сами - преподаватели вас только учиться научат, все остальное вам нужно будет взять самостоятельно). | |
|
|
|
|
|
|
|
для: cheops
(27.12.2011 в 16:08)
| | Спасибо))) Давно хотела взятся за книгу, понимаю что знаний которые нам дают не достаточно. | |
|
|
|
|