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

Valery

  • Full Member
  • ***
  • Сообщений: 101
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #15 : Январь 11, 2013, 05:57:14 am »
i = 0;
  заяц = ЗАЯЦ(сундуки[i]);
  утка = УТКА(заяц));
  яйцо = ЯЙЦО(утка);
  игла = ИГЛА(яйцо);
condition = (!(заяц = null)|| !(утка = null)|| !(яйцо = null)|| !(игла = null));
while ((i < колВоСундуков) && condition)
{++i;
заяц = ЗАЯЦ(сундуки[i]);
утка = УТКА(заяц);
яйцо = ЯЙЦО(утка);
игла = ИГЛА(яйцо);
condition = (!(заяц = null)|| !(утка = null)|| !(яйцо = null)|| !(игла = null));
}
И что?

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #16 : Январь 11, 2013, 06:02:04 am »
Зачем так длинно, достаточно только иглу сравнить

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #17 : Январь 11, 2013, 06:05:01 am »
i = 0;
  заяц = ЗАЯЦ(сундуки[i]);
  утка = УТКА(заяц));
  яйцо = ЯЙЦО(утка);
  игла = ИГЛА(яйцо);
condition = (!(заяц = null)|| !(утка = null)|| !(яйцо = null)|| !(игла = null));
while ((i < колВоСундуков) && condition)
{++i;
заяц = ЗАЯЦ(сундуки[i]);
утка = УТКА(заяц);
яйцо = ЯЙЦО(утка);
игла = ИГЛА(яйцо);
condition = (!(заяц = null)|| !(утка = null)|| !(яйцо = null)|| !(игла = null));
}
И что?
Подозреваю, что например "утка = УТКА(заяц);" если заяц==null, не приведет ни к чему хорошему.
Y = λf.(λx.f (x x)) (λx.f (x x))

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #18 : Январь 11, 2013, 06:05:36 am »
Зачем так длинно, достаточно только иглу сравнить
только в том случае если есть гарантированная смерть

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #19 : Январь 11, 2013, 06:11:14 am »
1. Разрешить передачу null  в параметре функций ЗАЯЦ, УТКА ...  (будет возвращать тоже null)

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #20 : Январь 11, 2013, 06:28:35 am »
1. Разрешить передачу null  в параметре функций ЗАЯЦ, УТКА ...  (будет возвращать тоже null)
так это само-собой. я говорю про  ( i < колВоСундуков) - в различных возможных ипостасях

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #21 : Январь 11, 2013, 06:37:19 am »
Печенкой чую, что тут хорошо прокатило бы что-то вроде монады Maybe.
По сути вот она:
Это же банальный линейный поиск:
i := 0;
WHILE (i < LEN(сундуки)) & ((ЗАЯЦ(сундуки[i]) = NIL) OR (УТКА(ЗАЯЦ(сундуки[i])) = NIL) OR (ЯЙЦО(УТКА(ЗАЯЦ(сундуки[i]))) = NIL)) DO INC(i) END
Короткое решение безо всяких break'ов.
;D
to iterate is human, to recurse, divine

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

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #22 : Январь 11, 2013, 06:39:21 am »
Печенкой чую, что тут хорошо прокатило бы что-то вроде монады Maybe.
По сути вот она:
Это же банальный линейный поиск:
i := 0;
WHILE (i < LEN(сундуки)) & ((ЗАЯЦ(сундуки[i]) = NIL) OR (УТКА(ЗАЯЦ(сундуки[i])) = NIL) OR (ЯЙЦО(УТКА(ЗАЯЦ(сундуки[i]))) = NIL)) DO INC(i) END
Короткое решение безо всяких break'ов.
;D
Пардон, нет, это на монаду maybe не годится из-за ((ЗАЯЦ(сундуки) = NIL) OR (УТКА(ЗАЯЦ(сундуки)) = NIL) OR (ЯЙЦО(УТКА(ЗАЯЦ(сундуки))) = NIL)
to iterate is human, to recurse, divine

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

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #23 : Январь 11, 2013, 06:40:56 am »
На Си можно избежать дублирования кода пользуясь тем фактом, что оператор присваивания возвращает значение:
i = 0;
while ((i < колВоСундуков) && (
   !(заяц = ЗАЯЦ(сундуки[i]))
|| !(утка = УТКА(заяц)))
|| !(яйцо = ЯЙЦО(утка))
|| !(игла = ИГЛА(яйцо))
)) ++i;
PS: прошлый раз не заметил, что там ещё и игла есть...
Вот, а вот это уже вполне тянет на суть монады Maybe!
to iterate is human, to recurse, divine

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

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #24 : Январь 11, 2013, 07:16:03 am »
1. Разрешить передачу null  в параметре функций ЗАЯЦ, УТКА ...  (будет возвращать тоже null)
так это само-собой. я говорю про  ( i < колВоСундуков) - в различных возможных ипостасях

Ну, тогда надо тот код из http://oberspace.dyndns.org/index.php/topic,425.msg13051.html#msg13051
лучше упростить
i = 0;
condition =false ;
while ((i < колВоСундуков) && (! condition)
{ заяц = ЗАЯЦ(сундуки[i]);
утка = УТКА(заяц);
яйцо = ЯЙЦО(утка);
игла = ИГЛА(яйцо);
        condition = игла != null;
        i++;
}

Здесь ищем иглу, а при   condition = игла == null    ищем недостачу

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #25 : Январь 11, 2013, 07:50:54 am »
эта форма мне нравится...-побочных эффектов "по-любому возникающих" я не вижу...

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #26 : Январь 11, 2013, 08:13:51 am »
точнее - если можно пожертвовать в угоду наглядности  мизерной потерей быстродействия на 4 безусловных вызова функций то ваш вариант, если нет - свой  :)

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #27 : Январь 11, 2013, 08:27:29 am »
точнее - если можно пожертвовать в угоду наглядности  мизерной потерей быстродействия на 4 безусловных вызова функций то ваш вариант, если нет - свой  :)
Да он как бы и не мой :)  Я предполагал без переменной и repeat-until ну или do-while как у Вас в http://oberspace.dyndns.org/index.php/topic,425.msg13034.html#msg13034
Хотя просто while с переменной, наверное,  всё же лучше.
PS.
Навесить ифы можно во всех вариантах.


« Последнее редактирование: Январь 11, 2013, 08:29:23 am от albobin »

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #28 : Январь 11, 2013, 08:40:27 am »
Что предлагается сделать.
Изобрести (или вспомнить где-то реализованную) конструкцию для цикла, которая позволяла бы записать решение без компромиссов, образцово-показательно, эффективно.
ИКР, короче. Идеальный конечный результат.

Не следует ограничивать свою фантазию, речь идет, скорее, о языке мышления.
Ну вот мой вариант:
// Найти первый комплект с иглой
for (int i = 0; i < сундуки.Length; i++)
{
    заяц = сундуки[i];          if (заяц == null) continue;
    утка = заяц.ИзвлечьУтку();  if (утка == null) continue;
    яйцо = утка.ИзвлечьУтку();  if (яйцо == null) continue;
    игла = яйцо.ИзвлечьУтку();  if (игла == null) break;
}
// Найти первый комплект без иглы -- низкоуровневая имитация монады Maybe
for (int i = 0; i < сундуки.Length; i++)
{
    заяц = сундуки[i];          if (заяц == null) break;
    утка = заяц.ИзвлечьУтку();  if (утка == null) break;
    яйцо = утка.ИзвлечьУтку();  if (яйцо == null) break;
    игла = яйцо.ИзвлечьУтку();  if (игла == null) break;
}
to iterate is human, to recurse, divine

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

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #29 : Январь 11, 2013, 09:08:32 am »
Пётр Алмазов призывал: "Не следует ограничивать свою фантазию".

:)
вариант без переменной condition
ищем нормальную иглу
i = 0;
игла=null ;
while (i < колВоСундуков) && (игла == null)
{ заяц = ЗАЯЦ(сундуки[i]);
утка = УТКА(заяц);
яйцо = ЯЙЦО(утка);
игла = ИГЛА(яйцо);
        i++;
}

ищем недостачу
i = 0;
игла=игла_без_йаду ;
while (i < колВоСундуков) && (игла != null)
{ заяц = ЗАЯЦ(сундуки[i]);
утка = УТКА(заяц);
яйцо = ЯЙЦО(утка);
игла = ИГЛА(яйцо);
        i++;
}