Рекурсия...помогите...плиз... (С++)

Ксю
Сообщения: 7
Зарегистрирован: 07 апр 2008, 14:30

Рекурсия...помогите...плиз... (С++)

Сообщение Ксю » 14 май 2008, 20:26

Помогите пжалуста...нужно "Составить алгоритм рекурсивного поиска наименьшего элемента массива"
всё что у меня получилось:

Код: Выделить всё

#include<iostream.h>
#include<conio.h>
#include <windows.h>

const n=5;
char StrBuf[50];

int vvod(int a[])
{
    for(int i=0; i<n; i++)
        cin>>a[i];
}

[B] int func(int a[])
{
    int i;
    int min;
    if(i<n) return min;
    if(a[i]<min) min=a[i];
    min=func(i++,min,a);

}[/B] 
void main(void)
{
   int a[n];
   int i=1;
   int min=a[0]a[n];

   CharToOem("Введите элементы массива: ", StrBuf);
   cout << StrBuf<<endl;
   vvod(a);
   CharToOem("Минимальный элемент равен ", StrBuf);
   cout << StrBuf<<func(a)<<endl;

  getch();
}

Albor
Сообщения: 482
Зарегистрирован: 06 сен 2004, 12:34
Откуда: Днепропетровск

Re: Рекурсия...помогите...плиз...

Сообщение Albor » 15 май 2008, 09:12

Ксю писал(а):Помогите пжалуста...нужно "Составить алгоритм рекурсивного поиска наименьшего элемента массива"
всё что у меня получилось:

Код: Выделить всё

#include<iostream.h>
#include<conio.h>
#include <windows.h>

const n=5;
char StrBuf[50];

int vvod(int a[])
{
    for(int i=0; i<n; i++)
        cin>>a[i];
}

[B] int func(int a[])
{
    int i;
    int min;
    if(i<n) return min; // Здесь ошибка - i не инициализирована
    if(a[i]<min) min=a[i];
    min=func(i++,min,a);

}[/B] 
void main(void)
{
   int a[n];
   int i=1;
   int min=a[0]a[n]; // а это что такое?

   CharToOem("Введите элементы массива: ", StrBuf);
   cout << StrBuf<<endl;
   vvod(a);
   CharToOem("Минимальный элемент равен ", StrBuf);
   cout << StrBuf<<func(a)<<endl;

  getch();
}

смотри коментарии в коде

Ксю
Сообщения: 7
Зарегистрирован: 07 апр 2008, 14:30

Re: Рекурсия...помогите...плиз...

Сообщение Ксю » 15 май 2008, 14:21

В общем переделала немного, получиль

Код: Выделить всё

#include<iostream.h>
#include<conio.h>
#include <windows.h>
 
const n=5;
char StrBuf[50];
 
int vvod(int a[])
{
for(int i=0; i<n; i++)
cin>>a[i];
}
 
int poisk(int a[], int i, int min)
{
if(i>n) return min;
else if(a[i]<min) min=a[i];
min=poisk(a,i++,min);
 
}
 
void main(void)
{
int a[n];
int i=1;
int min=a[0];
CharToOem("Введите элементы массива: ", StrBuf);
cout << StrBuf<<endl;
vvod(a);
CharToOem("Минимальный элемент равен ", StrBuf);
cout << StrBuf<<poisk(a,i,min)<<endl;
 
getch();
}
Но теперь программка не работает...зависает и подчёркивает "min=poisk(a,i++,min);" что делать??

BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

Re: Рекурсия...помогите...плиз...

Сообщение BBB » 15 май 2008, 14:56

1. int min=a[0];
Но массив a значениями еще не инициализирован. Так что здесь min присвоится непредсказуемое значение.

2. Так как условие останова рекурсии написано как if(i>n), то при очередном вызове ф-ии poisk второй параметр попадет туда равным n. Далее следует обращение к элементу массива a, т.е. в нашем частном случае a[n]. Но последний элмент масива a имеет индекс n-1. Значит, попадаем "мимо памяти".

На глазок, условие останова надо заменить на if(i>=n)

Albor
Сообщения: 482
Зарегистрирован: 06 сен 2004, 12:34
Откуда: Днепропетровск

Re: Рекурсия...помогите...плиз...

Сообщение Albor » 15 май 2008, 14:56

Ксю писал(а):В общем переделала немного, получиль

Код: Выделить всё

#include<iostream.h>
#include<conio.h>
#include <windows.h>
 
const n=5;
char StrBuf[50];
 
int vvod(int a[]) // тип функции подразумевает возвращаемое значение, здесь 
//можно сделать void а не int
{
for(int i=0; i<n; i++)
cin>>a[i];
}
 
int poisk(int a[], int & i, int & min) // передача параметров по ссылке 
// даст гарантию сохранения значения в переменной после отработки функции
{
if(i>n) return min; // а если условие не выполнится, то что вернёт функция?
// То есть по замыслу ф-ция должна вернуть int, но реально - может и не вернуть
else if(a[i]<min) min=a[i];
min=poisk(a,i++,min);
 
}
 
void main(void)
{
int a[n];
int i=1;
int min=a[0];
CharToOem("Введите элементы массива: ", StrBuf);
cout << StrBuf<<endl;
vvod(a);
CharToOem("Минимальный элемент равен ", StrBuf);
cout << StrBuf<<poisk(a,i,min)<<endl;
 
getch();
}
Но теперь программка не работает...зависает и подчёркивает "min=poisk(a,i++,min);" что делать??


Добавил коментарии. Данный код не только не должен зависнуть, но даже не откомпилироваться.

BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

Re: Рекурсия...помогите...плиз...

Сообщение BBB » 16 май 2008, 09:44

Albor,
int poisk(int a[], int & i, int & min) // передача параметров по ссылке
// даст гарантию сохранения значения в переменной после отработки функции
На мой взгляд, var-параметры для i и min здесь не нужны совсем.

Albor
Сообщения: 482
Зарегистрирован: 06 сен 2004, 12:34
Откуда: Днепропетровск

Re: Рекурсия...помогите...плиз...

Сообщение Albor » 16 май 2008, 11:19

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

Ксю
Сообщения: 7
Зарегистрирован: 07 апр 2008, 14:30

Re: Рекурсия...помогите...плиз...

Сообщение Ксю » 16 май 2008, 21:18

Мне обязательно нужно чтобы была РЕКУРСИЯ....
программку переписала...и она даже запускается...только берёт самый первый элемент и выводит его как наименьший...

Код: Выделить всё

#include<iostream.h>
#include<conio.h>
#include <windows.h>

const n=5;
char StrBuf[50];
 int i;

int poisk(int a[],int & min);
void vvod(int a[]);

 void main(void)
{
   int a[n];
   int i=1;


   CharToOem("Введите элементы массива: ", StrBuf);
   cout << StrBuf<<endl;
   vvod(a);
    int min=a[0];
   CharToOem("Минимальный элемент равен =", StrBuf);
   cout << StrBuf<<poisk(a,min)<<endl;

  getch();
}

void vvod(int a[])
{
    for(int i=0; i<n; i++)
        cin>>a[i];
}

 int poisk(int a[],int & min)
{

    if(i>=n) return min;
      else if(a[i]<min)
      {min=a[i];
       i++;
    min=poisk(a,min);
    }
}

airyashov
Сообщения: 416
Зарегистрирован: 02 ноя 2007, 10:31

Re: Рекурсия...помогите...плиз...

Сообщение airyashov » 16 май 2008, 23:59

Ваша ошибка int i=1; индекс не меняется

Код: Выделить всё

#include<iostream.h>
#include<conio.h>
#include <windows.h>

const n=5;
char StrBuf[50];
 int i;

int poisk(int a[], int NextIndex);
void vvod(int a[]);

void main(void)
{
   int a[n];

   CharToOem("Введите элементы массива: ", StrBuf);
   cout <<StrBuf<<endl;
   vvod(a);

   CharToOem("Минимальный элемент равен =", StrBuf);
   cout <<StrBuf<<poisk(a,n-1)<<endl;

  getch();
}

void vvod(int a[])
{
    for(int i=0; i<n; i++)
        cin>>a[i];
}

int poisk(int a[], int IndexNext)
{
    if (IndexNext==0) return a[0];
    else
    {
        int z=poisk(a,IndexNext-1);
        return return ((a[IndexNext]<z)?a[IndexNext]:z);
    };
}

Ксю
Сообщения: 7
Зарегистрирован: 07 апр 2008, 14:30

Re: Рекурсия...помогите...плиз...

Сообщение Ксю » 17 май 2008, 09:42

Огромное спасибо!!!

Ответить