Автор Тема: Выход из цикла или смерть Кощея  (Прочитано 93838 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Выход из цикла или смерть Кощея
« Ответ #90 : Январь 15, 2013, 06:12:30 pm »
Коммент на каждой строчке - это жестоко  ;)

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #91 : Январь 15, 2013, 06:16:24 pm »
Использование функций без побочных эффектов для извлечения различных элементов (сундуков, зайцев, уток, яиц, игл, смертей Кощея) друг из друга невозможно, так как структурные значения не могут быть результатами функций. Если выводить ссылку на значение, то это уже изменяет значение динамической переменной (побочный эффект)...
Мутно как-то..
1. Не во всех языках это так (а задача не была ограничена КОНКРЕТНЫМ языком)
2. Не очень понятно про какой "побочный" эффект вы говорите... в классике им называют изменение значения глобальной переменной в подпрограмме..

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #92 : Январь 15, 2013, 06:21:03 pm »
разумеется если параметр в явном виде не передавался (я говорю в данном случае про передачу по ссылке)

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #93 : Январь 15, 2013, 06:36:55 pm »
Тык сохраняется же  ???

Тут:
ЗАЯЦ(сундуки, заяц)
заяц - OUT параметр...
угу сорри .. понял.. однако один черт albobin ское решение более нравится...  возможно потому , что оно следует из грамотного определения зайцев (включающего в себя проверку на существование).

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #94 : Январь 15, 2013, 06:57:07 pm »
не самих зайцев.. а функции ЗАЯЦ.. сорри за неточность

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #95 : Январь 15, 2013, 07:14:31 pm »
Коммент на каждой строчке - это жестоко  ;)
  ;D ;D ;D ;D а нефиг время тратить на дурацкие задачки.. тогда  и сурьезные люди  будут вас считать человеком...  ;)

ddn

  • Jr. Member
  • **
  • Сообщений: 59
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #96 : Январь 15, 2013, 08:35:19 pm »
Коммент на каждой строчке - это жестоко  ;)
Правильно, это когда комментарий к каждой лексеме.
У меня бывают приступы формализма и педантизма.

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

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #97 : Январь 15, 2013, 11:07:54 pm »
Коммент на каждой строчке - это жестоко  ;)
Правильно, это когда комментарий к каждой лексеме.
У меня бывают приступы формализма и педантизма.

...
2. Не очень понятно про какой "побочный" эффект вы говорите... в классике им называют изменение значения глобальной переменной в подпрограмме..
разумеется если параметр в явном виде не передавался (я говорю в данном случае про передачу по ссылке)
Динамические переменные по определению глобальны, они доступны (в общем случае) через глобальные идентификаторы.
Даже если функция создает новое сслылочное значение (размещает новую динамическую переменную) только под выдаваемый результат, это изменяет глобальное окружение после завершения вызова функции. Даже если в дальнейшем это новое сслылочное значение будет утеряно (станет недоступным) в том выражении где сидел этот вызов, все равно это считается побочным эффектом.
спасибо, понял, но в цитируемом вами моем сообщении я имел ввиду ссылочный параметр передаваемый в функцию ЗАЯЦ (заяц) по версии  Бориса и иже с ним... там идет заполнение существующей переменной.

ddn

  • Jr. Member
  • **
  • Сообщений: 59
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #98 : Январь 16, 2013, 12:43:44 am »
спасибо, понял, но в цитируемом вами моем сообщении я имел ввиду ссылочный параметр передаваемый в функцию ЗАЯЦ (заяц) по версии  Бориса и иже с ним... там идет заполнение существующей переменной.
А что это меняет? То, что у переменной только значение меняется, а сама она остается?

Если параметр-переменная "заяц" здесь ссылочная, то присвоение "результата" функции переменной заяц^, это само по себе глобальный эффект.
Если же параметр-переменная "заяц" здесь не ссылочная, даже если она при этом локальная, все равно это функция с глобальным эффектом, хотя этот ее конкретный вызов и без глобального эффекта. Ведь эта функция может вызываться с глобальным эффектом - в каком-то другом месте программы.

Но даже если функция локальна либо неэкспортируема, а содержащий ее модуль всегда вызывает ее без реального глобального эффекта (в силу невыполнения некоторых условных ветвей или холостого присвоения внешним переменным тех же значений из-за ограничений значений и структуры фактических параметров), это не значит что эта функция не даст глобальный эффект каком-то в другом програмном окружении, т.е. будучи помещенной в другой модуль. Главное, что функция в принципе способна на глобальный эффект, что некоторый внешний по отношению к ней алгоритм может использовать функцию с таким же текстом для такого эффекта.
Функция без глобального эффекта при любом вызове в любой возможной программе не должна изменять переменные, лежащие ниже ее по стеку, т.е. созданные в реал-тайм ранее этого вызова, а также изменять любые переменные из кучи и изменять динамические типы (создавать-уничтожать значения типа) раз те в ЯП являются глобальными.
Функция будет без глобального эффекта, если результат произвольного ее вызова, будучи сразу не сохраненным (например, присвоенным параметру пустой процедуры без OUT-параметров), не оказывает никакого воздействия (наблюдаемого средствами языка) на работу программы по сравнению с отсутствием такого вызова.

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

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #99 : Январь 16, 2013, 03:35:11 am »
Не следует смешивать:

По-моему ты придумал какую-то собственную терминологию. Функция без побочных эффектов (она же "чистая") - это функция, которая для одних и тех же аргументов всегда возвращает один и тот же результат и сама не вызывает функций с побочными эффектами. Все остальные предложенные "разновидности" - не знаю для чего могут понадобиться.

Применительно к данной задаче чистая функция могла бы возвращать структуру/кортеж. с найденным состоянием.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #100 : Январь 16, 2013, 04:47:54 am »
Кроме того, что функция может быть чистой и грязной (с побочными эффектами), она ещё может быть тотальной (гарантированно успешно завершится) и не тотальной (может выдать ошибку или никогда не завершиться).
Например, f(x)=5/x может выдать деление на ноль, и хоть она и является чистой, тотальной она не является.
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #101 : Январь 16, 2013, 06:25:29 am »
спасибо, понял, но в цитируемом вами моем сообщении я имел ввиду ссылочный параметр передаваемый в функцию ЗАЯЦ (заяц) по версии  Бориса и иже с ним... там идет заполнение существующей переменной.
А что это меняет? То, что у переменной только значение меняется, а сама она остается?

Если параметр-переменная "заяц" здесь ссылочная, то присвоение "результата" функции переменной заяц^, это само по себе глобальный эффект.


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

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #102 : Январь 16, 2013, 06:43:12 am »
Не следует смешивать:

По-моему ты придумал какую-то собственную терминологию. Функция без побочных эффектов (она же "чистая") - это функция, которая для одних и тех же аргументов всегда возвращает один и тот же результат и сама не вызывает функций с побочными эффектами. Все остальные предложенные "разновидности" - не знаю для чего могут понадобиться.

Применительно к данной задаче чистая функция могла бы возвращать структуру/кортеж. с найденным состоянием.

1. тык про это я и говорил...  только Vlad - нужно добавить без несанкционированного изменения  значений  переменных глобального окружениия - в вашем определении.
2. Для более глубокого понимания того, насколько искажается система при ее компьютерном моделировании... и вообще для развития - если есть какая то "генеральная" базовая идея - игра с определениями может довольно много дать...

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #103 : Январь 16, 2013, 07:20:35 am »
1. Я не считаю конкретно это изменение ПОБОЧНЫМ эффектом -  хотя конечно это изменяет глобальное окружение
Любое изменение глобального окружения функции внутри неё является побочным эффектом, будь-то ввод/вывод, прямое или косвенное изменение глобальной переменной.
Если функция хоть как-то влияет на изменение глобального (по отношению к ней) состояния программы, то эта функция имеет побочный эффект.
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

trurl

  • Full Member
  • ***
  • Сообщений: 133
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #104 : Январь 16, 2013, 07:25:39 am »
i := 1
while i <= #(сундуки) and игла = nil do
  сундук := сундуки[i]; заяц := nil; утка := nil; яйцо := nil; игла := nil
  заяц := ЗАЯЦ(сундук)
  if заяц ~= nil then утка := УТКА(заяц) end
  if утка ~= nil then яйцо := ЯЙЦО(утка) end
  if яйцо ~= nil then игла := ИГЛА(яйцо) end
  i := i+1
end

i := 1
repeat
  сундук := сундуки[i]; заяц := nil; утка := nil; яйцо := nil; игла := nil
  заяц := ЗАЯЦ(сундук)
  if заяц ~= nil then утка := УТКА(заяц) end
  if утка ~= nil then яйцо := ЯЙЦО(утка) end
  if яйцо ~= nil then игла := ИГЛА(яйцо) end
  i := i+1
until i > #(сундуки) or заяц = nil or утка = nil or яйцо = nil or игла = nil