2014 dxdy logo

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

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




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

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 
Аватара пользователя
А если так попробовать в третьей снизу строке:
Код:
result := check_negative_el(a, start+1, stop);

 
 
 
 Re: Рекурсия в паскале
Сообщение30.03.2022, 22:09 
waxtep в сообщении #1551454 писал(а):
А если так попробовать в третьей снизу строке:
Код:
result := check_negative_el(a, start+1, stop);

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

-- 30.03.2022, 22:10 --

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

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

 
 
 
 Re: Рекурсия в паскале
Сообщение30.03.2022, 22:49 
waxtep в сообщении #1551457 писал(а):
result же локальная переменная
ТС, судя по всему, пишет на каком-то позднем варианте, вроде Delphi. Там result - зарезервированное имя для того, что возвращает функция.

 
 
 
 Re: Рекурсия в паскале
Сообщение31.03.2022, 01:05 
Аватара пользователя
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 
waxtep в сообщении #1551468 писал(а):
выглядит так, что на массиве из сплошь неотрицательных элементов мы таки получим true, разве нет?
В исходном варианте - нет. Просто потому, что при первом вызове эта ветка не отработает (при разумных исходных параметрах), а результат всех последующих будет потерян.

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

 
 
 [ Сообщений: 7 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group