Автор Тема: Инварианты к двум циклам  (Прочитано 35835 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Инварианты к двум циклам
« Ответ #75 : Сентябрь 28, 2012, 11:51:54 am »
Типа переписываю это:
http://oberspace.dyndns.org/index.php/topic,253.msg6133.html#msg6133
так:
...
... и все становится по науке?
Если в 1С нумерация элементов массива идёт с 0 до (Массив.ВГраница()-1), то видимо надо сделать так:
Граница = Массив.ВГраница() - 1;

В 1с Массив.ВГраница() = Массив.Количество() - 1

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #76 : Сентябрь 28, 2012, 12:35:42 pm »
Озарённый новым пониманием инварианта, "изложенного" в http://oberspace.dyndns.org/index.php/topic,331.msg9234.html#msg9234 .
Вот  http://forum.oberoncore.ru/viewtopic.php?p=72961#p72986
как дополнение или даже как главный ответ.  QWERTYProgrammer всех уделал :)
« Последнее редактирование: Сентябрь 28, 2012, 12:37:26 pm от albobin »

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #77 : Сентябрь 28, 2012, 12:42:27 pm »
Озарённый новым пониманием инварианта, "изложенного" в http://oberspace.dyndns.org/index.php/topic,331.msg9234.html#msg9234 .

Вот  http://forum.oberoncore.ru/viewtopic.php?p=72961#p72986
как дополнение или даже как главный ответ.  QWERTYProgrammer всех уделал :)

Наверно таки http://forum.oberoncore.ru/viewtopic.php?p=72961#p72986

(урлы не обязательно тэгами "[url]" обвешивать, движог форума сам распознает урл как урл-гиперссылку)
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #78 : Сентябрь 28, 2012, 12:44:18 pm »
Озарённый новым пониманием инварианта, "изложенного"
Кстати, а что это мы прицепились к инвариантам именно цикла? Почему бы не поговорить о инварианте функций/процедур. Это не менее важная тема.
Y = λf.(λx.f (x x)) (λx.f (x x))

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #79 : Сентябрь 28, 2012, 12:53:25 pm »
Кстати, а что это мы прицепились к инвариантам именно цикла?
Название темы не позволяет :)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #80 : Сентябрь 28, 2012, 01:39:45 pm »
Кстати, а что это мы прицепились к инвариантам именно цикла? Почему бы не поговорить о инварианте функций/процедур. Это не менее важная тема.
Инварианты функций/процедур? А что это? о_О
Насколько я знаю, инварианты имеются у циклов и у объектов (в ООП).
А у функций и процедур, видимо, должны быть контракты? Что на входе, что на выходе, за какое время производится работа/вычисление...
to iterate is human, to recurse, divine

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

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #81 : Сентябрь 28, 2012, 02:05:35 pm »
А вот вам ещё вариантик:
i        := 0;
mb_found := FALSE;
found    := FALSE; (* found = (a[i-1] = 0) и (a[i] = 0) *)

WHILE i < LEN(a) & ~found DO
    IF a[i] = 0 THEN
        IF mb_found THEN found := TRUE ELSE mb_found := TRUE END
    ELSE
        i := i+1
    END
END
« Последнее редактирование: Сентябрь 28, 2012, 02:07:23 pm от Geniepro »
to iterate is human, to recurse, divine

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

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #82 : Сентябрь 28, 2012, 02:33:03 pm »
Кстати, а что это мы прицепились к инвариантам именно цикла? Почему бы не поговорить о инварианте функций/процедур. Это не менее важная тема.
Инварианты функций/процедур? А что это? о_О
Насколько я знаю, инварианты имеются у циклов и у объектов (в ООП).
А у функций и процедур, видимо, должны быть контракты? Что на входе, что на выходе, за какое время производится работа/вычисление...
Нет. Еще нужны инварианты. Если инвариант нарушен (в процессе работы. не важно из за действий внутри самой процедуры, или из за внешнех факторов), то нет никакого смысла продолжать выполнение процедуры.
Y = λf.(λx.f (x x)) (λx.f (x x))

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #83 : Сентябрь 28, 2012, 03:05:39 pm »
Цитировать
А вот вам ещё вариантик:...
010
Первый нуль - mb_found = true, затем единица, затем срабатывает успех, что не верно. mb_found сбрасывать нужно.

Напомнило:

Цитировать
Код: (delphi) [Выделить]
...
WHILE (i < LEN(a)) & (ChainLen < CHAIN_LEN) DO
  IF a[i] = CHAIN_BYTE THEN
    INC(ChainLen);
  ELSE
    ChainLen := 0;
  END;

 INC(i);
END;
...
« Последнее редактирование: Сентябрь 28, 2012, 03:08:13 pm от Berserker »

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #84 : Сентябрь 28, 2012, 03:11:23 pm »
"Что за херня? Я не могу уверенно, быстро и без ошибок написать цикл длиной порядка 10 строк, при том, что общая идея мне ясна. Не мудак ли я?
Хочу перезжать подобные задачи как трактор."

При этом в твоем решении "сопоставление с образцом" есть всего один маленький цикл, а всю грязную работу делает рекурсия ;)

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #85 : Сентябрь 28, 2012, 03:22:24 pm »
Религиозные войны... бессмысленные и беспощадные.
Циклы существуют не сами по-себе, цикл ради цикла - еще более бессмысленная вещь. Если мы навешали десятиэтажные условия в качестве охраны и при нарушении охраны вышли из цикла, а потом еще навешали те же самые десятиэтажные условия для проверки того, чего же мы там нациклили, чтобы выполнить какие-то действия, требуемые при достижении тех или иных условий, то ясное дело, что не только Гондурас в огне, но и в Королевстве Датском не все в порядке. Ясное дело, если все эти десять этажей были нужны только чтобы плюсануть переменную, то это одно, но, циклы нужны для более прозаических вещей - для выполнения более полезных действий, зависящих от тех или иных состояний(условий), которые могут меняться в процессе работы.
Приверженцам десятиэтажных охран  и семиэтажных проверок после цикла предлагаю по такому принципу даже не 10 этажей покрасить, а всего лишь один забор. Тогда наступает понимание, что если у нас над циклом 10 этажей условий, то мы неверно построили алгоритм и необходимо повторно провести декомпозицию...
Ясное дело, что если мы построили цикл с 10-ти этажной охраной, цикл, который  сам себе условие", то это только от того, что думать мы не хотим, прогонять алгоритм в голове не желаем, ведь собрать все условия в одной точке намного проще, правда и полезной работы при этом цикл выполнит существенно меньше.

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #86 : Сентябрь 28, 2012, 04:37:48 pm »
что думать мы не хотим, прогонять алгоритм в голове не желаем, ведь собрать все условия в одной точке намного проще, правда и полезной работы при этом цикл выполнит существенно меньше.
Если писать всегда верный код, то не имеет значения как ужасно он выглядит. А если в коде есть ошибка и её надо найти, то неплохо бы писать так, чтобы искать было проще.

Например, есть процедура из 25 строк. У неё в середине цикл на 12 строк. Мы прочли код до начала цикла, и в нём ошибки не было. Дальше мы читаем заголовок цикла. Нередко (но не возьмусь утверждать, что в подавляющем количестве случаев) информации в заголовке будет достаточно, чтобы понять: ошибка внутри цикла или за его пределами.

Это важно, потому что гонять код внутри головы обычно затратнее, чем писать его. У меня даже бывало такое, что цикл изначально написан правильно, но я при его прогоне через голову "обнаруживал" в нём ошибку. Начинал исправлять, а оно не исправляется. Через некоторое время приходило осознание того, что ошибки в нём не было, и приходилось возвращаться назад и продолжать поиски.

Я тоже против огромных условий у цикла. Тоже за продуманную декомпозицию. Но я против искусственного уменьшения и размазывания условия работы цикла по его телу.

DIzer

  • Гость
Re: Инварианты к двум циклам
« Ответ #87 : Сентябрь 28, 2012, 04:52:38 pm »
Религиозные войны... бессмысленные и беспощадные.
Ну нет.. ЛЮБАЯ стычка делает нас сильнее, если не убивает , конечно...

DIzer

  • Гость
Re: Инварианты к двум циклам
« Ответ #88 : Сентябрь 28, 2012, 05:08:23 pm »

Инварианты функций/процедур? А что это? о_О
Насколько я знаю, инварианты имеются у циклов и у объектов (в ООП).
А у функций и процедур, видимо, должны быть контракты? Что на входе, что на выходе, за какое время производится работа/вычисление...
ну ну ... :) это то, что позволяет "новые" решения (классы решений) в общем случае... в любимом вами  опусе от Дейксты (если я не ошибаюсь) показан пример "нестандартной" реализации алгоритма  Евклида на основе подобного подхода...

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #89 : Сентябрь 28, 2012, 05:20:59 pm »
Если писать всегда верный код, то не имеет значения как ужасно он выглядит. А если в коде есть ошибка и её надо найти, то неплохо бы писать так, чтобы искать было проще.
Всегда верный код пишется не всегда )  На его правильность может повлиять даже фаза Луны.

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