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

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Выход из цикла или смерть Кощея
« Ответ #180 : Январь 21, 2013, 09:55:45 pm »
Если лишнее сравнение в заголовке напрягает, то вот вариант:
http://oberspace.dyndns.org/index.php/topic,425.msg13082.html#msg13082
Тот же линейный поиск + оптимизация

Круче уже некуда.

Что тут формально строить то?

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #181 : Январь 21, 2013, 11:29:19 pm »
Ну, Борис, тут надо понимать, что никто не предлагает такой цикл каждый раз так выводить.
Просто это самотест, понимаем ли свойства циклов или нет.
Мозг сам будет быстро прокручивать многие вещи, когда есть навык разбирать доказательно.

Т.е. тут просто критерий "могу рассказать строго = знаю точно свойства своего кода" или "не могу рассказать строго = возможно, что-то упускаю".

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #182 : Январь 21, 2013, 11:31:37 pm »
Обычный линейный поиск.

И он не типичный. В распространённом случае поисков в последовательностях у нас второй конъюнкт в условии - это проверка i-го элемента (она как раз и оказывается под охраной первого конъюнкта). Здесь же участвует игла из предыдущего сундука.

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #183 : Январь 22, 2013, 02:16:23 am »
Тем не менее, могу сказать, что не все безнадежно. (А поначалу показалось, что безнадежно).
Нет, определенно, есть проблеск надежды.

Да ну... Тогда я возьму с полки пиражок и буду ждать разбора от сенсея... Надеюсь, что встречно будет также потрачено время на эту задачу.
Не, не будет.
Все, что нужно, было сказано многократно.
Дальше - только своим умом.
Даже, если бы было время.

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #184 : Январь 22, 2013, 04:57:21 am »
Но тело цикла может быть несколько другим.
Вот пусть оно сначала будет несколько другим
Вот и пусть будет  ;)

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #185 : Январь 22, 2013, 12:34:55 pm »
Спор какой-то странный, надо усугубить :)

Вот, если взять "кошерный" линейный поиск:   WHILE ~E(i) & ~F(i)  DO ... END
E и F - это лог.выражения, первое определяет условие завершения по причине исчерпания возможных итераций,
а второе -  условие достижения цели. Параметр i  - это номер итерации.
По окончании цикла имеем постусловие: E OR F и при этом  E=~F
(на всякий случай сразу скажу  - считаем, что за пределами допустимых i  F(i)=FALSE  ) 

А обсуждаемый Кащеевский цикл - он из таких:   WHILE ~E(i) & ~F(i-1)  DO ... END
По окончании которого, кстати, уже не будет выполняться  F=~E.   (Надо просто иметь это ввиду.)
Вполне довольно распространённая ситуация.  Не зря же Пётр озаботился приведением этого цикла к "кошерному" линейному поиску. Если я, конечно, в адеквате :)
Здесь естественно в условии WHILE  вместо F(i-1)  использовать переменную,  вычисляемую на предыдущей итерации.   Та же самая  'игла' , например.


 

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #186 : Январь 22, 2013, 12:41:41 pm »
PS.
Надеюсь, что в последней строчке послания, что касаемо "вместо F(i-1) ... 'игла' ... " не будет воспринято буквально :) 

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #187 : Январь 23, 2013, 04:37:44 am »
Вот, если взять "кошерный" линейный поиск:   WHILE ~E(i) & ~F(i)  DO ... END
E и F - это лог.выражения, первое определяет условие завершения по причине исчерпания возможных итераций,
а второе -  условие достижения цели. Параметр i  - это номер итерации.
По окончании цикла имеем постусловие: E OR F и при этом  E=~F
(на всякий случай сразу скажу  - считаем, что за пределами допустимых i  F(i)=FALSE  ) 

А обсуждаемый Кащеевский цикл - он из таких:   WHILE ~E(i) & ~F(i-1)  DO ... END
По окончании которого, кстати, уже не будет выполняться  F=~E.   (Надо просто иметь это ввиду.)
Вполне довольно распространённая ситуация.  Не зря же Пётр озаботился приведением этого цикла к "кошерному" линейному поиску. Если я, конечно, в адеквате :)
Здесь естественно в условии WHILE  вместо F(i-1)  использовать переменную,  вычисляемую на предыдущей итерации.   Та же самая  'игла' , например.
Да неестественно, в том то и дело.

Еще раз могу констатировать, что мало кто (if any) понял, в чем состоит задача. А она состояла в изобретении выразительных средств, которые бы не вели к выносу мозга в виде лишней итерации. Это линейный поиск? Да. Если бы не было запрета на упрятывание куска в функцию, никто бы в этом и не усомнился. И большего эта задача не заслуживает.

Такое средство было показано.
И E=~F после цикла.
//найти первый комплект с иглой
игла = null; //перенес по сравнению с оригиналом
i=0;
while (i != сундуки.Length) {
  заяц = ЗАЯЦ(сундуки[i]);
  if (заяц != null) {
    утка = УТКА(заяц);
    if (утка != null) {
      яйцо = ЯЙЦО(утка);
      if (яйцо != null) {
        игла = ИГЛА(яйцо);
      }
    }
  }
  andwhile (игла == null);
  i = i + 1;
}
После окончания цикла (i == сундуки.Length) OR (игла != null)

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #188 : Январь 23, 2013, 05:38:48 am »
Еще раз могу констатировать, что мало кто (if any) понял, в чем состоит задача. А она состояла в изобретении выразительных средств, которые бы не вели к выносу мозга в виде лишней итерации.

С выразительными средствами ясно, но и выноса мозга нет. IMHO.
Сплошь и рядом циклы такого рода:
find:=FALSE
WHILE E(i) & ~find DO ... ; find:=бла-бла; i:=i+1 END

Если уж очень хочется, чтобы получилось как в "кошерном" линейном поиске, достаточно вместо просто 'i:=i+1'   написать 'IF ~find THEN i:=i+1 END'  или после цикла вставить  'IF find THEN i:=i-1 END' то получим как в "кошерном" линейном поиске.  Только зачем?

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

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #189 : Январь 23, 2013, 05:46:07 am »
Еще раз могу констатировать, что мало кто (if any) понял, в чем состоит задача. А она состояла в изобретении выразительных средств, которые бы не вели к выносу мозга в виде лишней итерации.

Гипотетическая конструкция
while (cond1) {
    stmt_seq1;
    andwhile (cond2);
    stmt_seq2;
}
смотрится крайне неорганично для сишного синтаксиса (имхо).
Тогда уж хотя бы так:
while (cond1) {
    stmt_seq1;
} andwhile (cond2) {
    stmt_seq2;
}
Правда, в этом случае переменные, определённые в stmt_seq1, не будут доступны в stmt_seq2, что тоже не есть гуд...

С другой стороны, Ваш вариант крайне легко симитировать простым сишным макросом:
#define andwhile(cond) if (!(cond)) break;Это к слову о нужности или ненужности макросов, даже таких простых, как сишные. Не нужно ждать, когда разработчики языков добавят нужную вам конструкцию -- добавьте её сами!
to iterate is human, to recurse, divine

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

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #190 : Январь 23, 2013, 07:09:53 am »
Это к слову о нужности или ненужности макросов, даже таких простых, как сишные. Не нужно ждать, когда разработчики языков добавят нужную вам конструкцию -- добавьте её сами!
Тык давайте Немерлееть -- Петр- в эту сторону смотреть не пробовали? - на шарп похоже.. :)
« Последнее редактирование: Январь 23, 2013, 07:11:51 am от DddIzer »

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #191 : Январь 23, 2013, 07:14:21 am »
Это к слову о нужности или ненужности макросов, даже таких простых, как сишные. Не нужно ждать, когда разработчики языков добавят нужную вам конструкцию -- добавьте её сами!
Тык давайте Немерлееть -- Петр- в эту сторону смотреть не пробовали? - на шарп похоже.. :)
Да тут не нужно немерли, достаточно просто функциональщины без макросов даже. То есть достаточно языка высокого уровня, позволяющего создавать свои абстракции.
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

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

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

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Выход из цикла или смерть Кощея
« Ответ #193 : Январь 23, 2013, 07:32:03 am »
Да тут не нужно немерли, достаточно просто функциональщины без макросов даже. То есть достаточно языка высокого уровня, позволяющего создавать свои абстракции.

При чём здесь абстракции? достаточно замыканий -- а они даже в древнем смоллтоке есть ))
to iterate is human, to recurse, divine

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

DddIzer

  • Гость
Re: Выход из цикла или смерть Кощея
« Ответ #194 : Январь 23, 2013, 07:34:18 am »

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