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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2011, 18:49   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию рекурсия и массив

Добрый вечер! Необходимо написать рекурсивную функцию поиска первого отрицательно элемента массива, написала какой-то бред
Код:
function first_otr(n:integer; var x:integer):integer;
begin
  if (a[n]<0) then x:=n
  else
  begin
    first_otr(n-1,x);
    if ((n<x) and (a[n]<0)) then x:=n;
  end;
end;
Как исправить?
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 18.03.2011, 22:01   #2
KobolD
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 239
По умолчанию

Незнаю как на паскале это будет выглядеть, но смысл такой что тебе надо в функцию передавать массив и номер текущего элемента, и если этот элемент не отрицательный то снова вызывать функцию с номером элемента увеличеным на единицу. Плюс еще делать проверочку на достижние конца массива. Функция должна возвращать номер отрицательного элемента массива.
Вот рабочий код на C#
Массив можно передавать по ссылке или сделать его область видимости глобальной, тогда можно его не передавать в качестве аргумента. Тут я его для наглядности таскаю за собой.
Код:
        static void Main(string[] args)
        {
            int[] A = { 4, 6, 3, 4, 3, 39 };
            int Ansver = FirsOtr(A,0); //начинаем перебор с нулевого элемента
        }

        static int FirsOtr(int[] Mas, int pos)
        {
            if (pos == Mas.Length)//достигнут коней массива а отр элемент не найден вернем -1
                return -1;
            else if (Mas[pos] < 0)//если элемент меньше нуля то возвращаем номер позиции
                return pos;
            else//Передаем в фунуцию след номер в массиве
                return FirsOtr(Mas, pos + 1);
        }
Чтобы слова не расходились с делом, нужно молчать и ничего не делать.

Последний раз редактировалось KobolD; 18.03.2011 в 22:07.
KobolD вне форума Ответить с цитированием
Старый 18.03.2011, 22:02   #3
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Как вариант
Код:
function First_Otr(n,i:integer):integer;
begin
if Mas[i]<0 then
   begin
    if i=n then First_otr:=1
    else First_Otr:=i
   end
  else
   begin
    if i=n then First_Otr :=0
    else First_Otr:=First_Otr(n,i+1)
   end;
end;
Begin
  ....
   Writeln(Mas[First_Otr(10,1)]);
End.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681
GetMax вне форума Ответить с цитированием
Старый 18.03.2011, 23:39   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Код:
int fst(int *a, int i, int n){
	if(i==n)
		return -1;
	if(a[i]<0)
		return i;
	return fst(a,i+1,n);
}
rrrFer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсия. KOPC1886 Помощь студентам 1 09.12.2010 21:37
Рекурсия RamilFaz Общие вопросы C/C++ 0 21.10.2010 02:19
Рекурсия LegionuS Паскаль, Turbo Pascal, PascalABC.NET 4 29.09.2010 15:31
Рекурсия Solnze2 Паскаль, Turbo Pascal, PascalABC.NET 0 09.06.2010 09:28
задача паскаль, скорее всего массив+рекурсия(хотя у меня другой способ) IvaniuS Помощь студентам 10 23.12.2009 15:34