Форум: Форум C++Разное
Новые темы: 00
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Рекурсивный поиск минимального значения массива
 
 автор: Atamanochka   (27.12.2011 в 13:44)   письмо автору
 
 

Нужно с помощью рекурсии найти максимальное и минемальное значение в одномерном массиве, ни чего не получается есть пример программы по нахождению только минемального но она тоже работает не правильно:
#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");
}
Подскажите пожалуйста как это реализовать?

  Ответить  
 
 автор: cheops   (27.12.2011 в 15:42)   письмо автору
 
   для: Atamanochka   (27.12.2011 в 13:44)
 

Во-первых вы вызываете её непонятно как. В качестве левой границы указываете 5, в качестве правой границы k-1 (и наоборот нужно и значения неправильные). У вас массив содержит 5 элементов, т.е. больше 4 индекс не может принимать, k вообще в main() не инициализирована, как минимум, вызов должен выглядеть так
cout<<min(mas, 0, 4);
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 вызова получилось, но это рабочий вариант и его можно быстро переработать для максимального значения (если это вызовет трудности - пишите).

  Ответить  
 
 автор: Atamanochka   (27.12.2011 в 15:57)   письмо автору
 
   для: cheops   (27.12.2011 в 15:42)
 

Нет трудности не вызовет я понимаю сам смысл. Спасибо, с К это я уже когда совсем незнала что сней делать ввела, потом убрать забыла, а так на ее месте просто число 5 стояло, я с ней что то сделать хотела уже и непомню, спасибо за код все работает, но я только поступила в институт и эта программа совершенно не мой уровень к сожаление ... Мы просто даже этого не проходили.

  Ответить  
 
 автор: cheops   (27.12.2011 в 16:01)   письмо автору
 
   для: 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");
}

  Ответить  
 
 автор: cheops   (27.12.2011 в 16:08)   письмо автору
 
   для: Atamanochka   (27.12.2011 в 15:57)
 

>но я только поступила в институт и эта программа совершенно не мой уровень к сожаление ... Мы
>просто даже этого не проходили.
ВУЗ - это армия для мозга, вас заставляют действовать в условиях отсутствия времени и информации. Не ждите, что вам будут давать материал последовательно (особенно на 1-2 курсе) - изучайте все, что вам нужно самостоятельно (это конечно в первую очередь касается профильных предметов, если программирование вам добавили в качестве общеобразовательной нагрузки, понятно что обкладываться книгами по нему не стоит, если же это ваша специальность - не ждите преподавателей, тренируйте себя сами - преподаватели вас только учиться научат, все остальное вам нужно будет взять самостоятельно).

  Ответить  
 
 автор: Atamanochka   (27.12.2011 в 16:14)   письмо автору
 
   для: cheops   (27.12.2011 в 16:08)
 

Спасибо))) Давно хотела взятся за книгу, понимаю что знаний которые нам дают не достаточно.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования