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

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #105 : Январь 16, 2013, 07:58:53 am »
1. Я не считаю конкретно это изменение ПОБОЧНЫМ эффектом -  хотя конечно это изменяет глобальное окружение
Любое изменение глобального окружения функции внутри неё является побочным эффектом, будь-то ввод/вывод, прямое или косвенное изменение глобальной переменной.
Если функция хоть как-то влияет на изменение глобального (по отношению к ней) состояния программы, то эта функция имеет побочный эффект.
Если так рассуждать - то Хаскели и проч. "чистые" ФЯВУ  - не только таковыми не являются - но потенциально гораздо более опасны чем императивные ЯП.  И потом, я не говорю о том, что определение ddn и ваше несостоятельны вообще... скорее о том, что оно неадекватно общее в контексте данной задачи...  Я рассматриваю в конкретно этом случае вопрос достаточно просто (осознавая  что это результат идеализации), функция - черный ящик,система изолирована, инструкции выполняются последовательно (как в программе, так и в подпрограммах)... С моей точки зрения это вполне естественно - ну не будете же вы рассматривать решения  уравнений движения молекул  из которых состоит прямолинейно и равномерно движущийся автомобиль с заданной скоростью  для выяснения расстояния на которое переместился его центр масс...

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #106 : Январь 16, 2013, 08:43:08 am »
Если так рассуждать - то Хаскели и проч. "чистые" ФЯВУ  - не только таковыми не являются - но потенциально гораздо более опасны чем императивные ЯП.
Насчёт чистоты поспорить можно, но, в принципе, для того что бы какой-то язык был практичным, он должен иметь хотя бы какие-то способы производить ввод/вывод.

А что там за проблема с потенциальной большей опасностью по сравнению с императивными ЯП?
to iterate is human, to recurse, divine

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

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #107 : Январь 16, 2013, 08:59:37 am »
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

Итить твою, как всё очевидно. А мы тут накрутили. Ведь и в самом первом варианте Алмазова достаточно вместо внутреннего if игла # NIL then break вынести & (игла = NIL) в условие цикла.

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #108 : Январь 16, 2013, 09:01:47 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
Почему-то все прочитывают условия задачи так: извратиться любой ценой, но обойтись без exit. При этом предполагается, что этот изврат представляет хоть какую-нибудь ценность.

Я же написал в начале, никаких извратов, никаких компромиссов, затраты ресурсов не должны превышать исходный вариант с exit. Лишнее присваивание – расстрел. Полно ведь ситуаций, когда ресурсы крайне ограничены. Ну, на Марс мы летим.
В таких случаях приходится идти на компромисс и выбирать не красоту, а эффективность.
А Идеальный Конечный Результат – это когда цель достигнута НЕ ценой компромисса. Не жертвуя ни тем, ни другим. И затраты равны нулю.

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #109 : Январь 16, 2013, 10:22:50 am »

А Идеальный Конечный Результат – это когда цель достигнута НЕ ценой компромисса. Не жертвуя ни тем, ни другим. И затраты равны нулю.
;) тогда имеет смысл рассматривать решения на ассемблере....

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #110 : Январь 16, 2013, 10:23:14 am »
Итить твою, как всё очевидно. А мы тут накрутили.
Да, я вот смотрел на варианты, представленные оберонщиками, и диву давался -- откуда у них такая извращённая фантазия, столько говнокода накручивать )))
to iterate is human, to recurse, divine

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

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #111 : Январь 16, 2013, 10:57:39 am »
... Почему-то все прочитывают условия задачи так: извратиться любой ценой, но обойтись без exit. При этом предполагается, что этот изврат представляет хоть какую-нибудь ценность.
... Лишнее присваивание – расстрел. Полно ведь ситуаций, когда ресурсы крайне ограничены. Ну, на Марс мы летим.
В таких случаях приходится идти на компромисс и выбирать не красоту, а эффективность.
Можно придумать и такую ситуацию - следствие отказа от лишнего присваивания.
В том конкретном цикле, где выход, если чего-то нет. Вышли на какой-то (не первой) итерации, когда наткнулись на отсутствие чего-то, а ведь всё остальное будет же не null .  Типа - заяца нет, а яйцо есть , не говоря уж об игле :-)



 

DddIzer

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

Можно придумать и такую ситуацию - следствие отказа от лишнего присваивания.
В том конкретном цикле, где выход, если чего-то нет. Вышли на какой-то (не первой) итерации, когда наткнулись на отсутствие чего-то, а ведь всё остальное будет же не null .  Типа - заяца нет, а яйцо есть , не говоря уж об игле :-)
Да ладно, Петру и так не позавидуешь - и конфетку съесть и  на х. сесть и без компромиссов не всякий сподобится, с другой стороны - тем слаще победа...

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Выход из цикла или смерть Кощея
« Ответ #113 : Январь 16, 2013, 01:29:05 pm »
Peter Almazov, я прочитал сейчас ваши условия 5 раз, но так и не понял что вы хотите увидеть.
Если вы хотите избавиться от break в вашем коде, то достаточно вынести условие игла == null в заголовок цикла. Внутри цикла if игла != null с бряком соответственно убрать. Это будет классический линейный поиск. Потери эффективности практически не будет.

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #114 : Январь 16, 2013, 03:06:51 pm »
После того, как я выложил решение, ничего, собственно, и не ожидаю увидеть.

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #115 : Январь 16, 2013, 03:09:50 pm »
Так вы выложили его в исходном посте... гы хорошая шутка (весь этот топик)...  +100
« Последнее редактирование: Январь 16, 2013, 03:11:21 pm от DddIzer »

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #116 : Январь 16, 2013, 03:32:57 pm »
Peter Almazov, я прочитал сейчас ваши условия 5 раз, но так и не понял что вы хотите увидеть.
Ты пропустил важные строчки:
Этот пост адресован тем, кто считает наличие exit/break внутри цикла плохим тоном...
Те, кто лепит exit/break в теле цикла без малейших колебаний, могут дальше не читать.
т.е. мне он посвящен, к примеру, а тебе нет )

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Выход из цикла или смерть Кощея
« Ответ #117 : Январь 16, 2013, 03:33:55 pm »
while (i != сундуки.Length && игла == null) {
    заяц = ЗАЯЦ(сундуки[i]);
    if (заяц != null) {
        утка = УТКА(заяц);
        if (утка != null) {
    яйцо = ЯЙЦО(утка);
            if (яйцо != null) {
                игла = ИГЛА(яйцо);
            }
        }
    }
    i = i + 1
}

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Выход из цикла или смерть Кощея
« Ответ #118 : Январь 16, 2013, 03:38:32 pm »
т.е. мне он посвящен, к примеру, а тебе нет )
Прикольно.  :)  Это как такой вывод на мой счет сделан?

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #119 : Январь 16, 2013, 03:43:37 pm »
Прикольно.  :)  Это как такой вывод на мой счет сделан?
Ну мне так показалось  ;) что ты не против брейка