2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Рекурсия в паскале
Сообщение30.03.2022, 22:01 


24/01/22
61
Здравствуйте, нужно рекурсивно обработать массив и выявить есть ли в нем отрицательные элементы или нет.
У меня получилось вот это
Код:

function check_negative_el(a: mass; start, stop: integer): boolean;
  begin
    if (a[start] < 0) or (start > stop) then
      result := true
    else
    begin
      result := false;
      check_negative_el(a, start+1, stop);
    end;
  end;


Почему то не находит есть ли отрицательный элемент, если он стоит не на первом месте.

 Профиль  
                  
 
 Re: Рекурсия в паскале
Сообщение30.03.2022, 22:07 
Аватара пользователя


07/01/16
1426
Аязьма
А если так попробовать в третьей снизу строке:
Код:
result := check_negative_el(a, start+1, stop);

 Профиль  
                  
 
 Re: Рекурсия в паскале
Сообщение30.03.2022, 22:09 


24/01/22
61
waxtep в сообщении #1551454 писал(а):
А если так попробовать в третьей снизу строке:
Код:
result := check_negative_el(a, start+1, stop);

Спасибо, это помогло :lol:

-- 30.03.2022, 22:10 --

Интересно, а почему так

 Профиль  
                  
 
 Re: Рекурсия в паскале
Сообщение30.03.2022, 22:40 
Аватара пользователя


07/01/16
1426
Аязьма
XeuTeP_KoLLIu в сообщении #1551455 писал(а):
Интересно, а почему так
result же локальная переменная, связи между переменными result в вызывающей функции и в вызываемой нету. Вот, поставив result := мы ее и наладили :-) Если бы переменная была объявлена глобально, Ваш исходный пример работал бы корректно (наверное; нет Паскаля под рукой), но без необходимости вводить глобальные переменные не рекомендуется

 Профиль  
                  
 
 Re: Рекурсия в паскале
Сообщение30.03.2022, 22:49 
Заслуженный участник


09/05/12
25179
waxtep в сообщении #1551457 писал(а):
result же локальная переменная
ТС, судя по всему, пишет на каком-то позднем варианте, вроде Delphi. Там result - зарезервированное имя для того, что возвращает функция.

 Профиль  
                  
 
 Re: Рекурсия в паскале
Сообщение31.03.2022, 01:05 
Аватара пользователя


07/01/16
1426
Аязьма
Pphantom в сообщении #1551459 писал(а):
Там result - зарезервированное имя для того, что возвращает функция.
Да, я наверное не совсем удачно выразился, имел в виду, что эта (автоматически создаваемая) внутри скоупа функции переменная result, вне этого скоупа не определена. Исходный вариант кода выглядит (в моем понимании), как будто возвращаемое функцией значение игнорируется, а каждый из вложенных вызовов функции просто изменяет значение какой-либо глобальной переменной, типа вот такого:
Используется синтаксис Delphi
var rr: boolean = false; //global variable declaration

function check_negative_el(a: mass; start, stop: integer): boolean;
  begin
    if (a[start] < 0) or (start > stop) then
      rr:= true //modifying the global variable
    else
    begin
      check_negative_el(a, start+1, stop); //not really interested in function call result
    end;
  end;

Кстати, вот эта конструкция
Используется синтаксис Delphi
if (a[start] < 0) or (start > stop) then
      result := true
выглядит так, что на массиве из сплошь неотрицательных элементов мы таки получим true, разве нет? За счет самого последнего вложенного вызова check_negative_el(a, stop+1, stop);. Или же оно вообще при этом вызове выдаст ошибку, если a[stop+1] не определено; подозрительное место, в общем

 Профиль  
                  
 
 Re: Рекурсия в паскале
Сообщение31.03.2022, 01:39 
Заслуженный участник


09/05/12
25179
waxtep в сообщении #1551468 писал(а):
выглядит так, что на массиве из сплошь неотрицательных элементов мы таки получим true, разве нет?
В исходном варианте - нет. Просто потому, что при первом вызове эта ветка не отработает (при разумных исходных параметрах), а результат всех последующих будет потерян.

Но в целом да, это чревато ошибкой времени выполнения (если за границей массива окажется память, которая процессу не выделена).

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group