OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 17 Июнь, 2025 19:25

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу Пред.  1, 2
Автор Сообщение
СообщениеДобавлено: Вторник, 09 Ноябрь, 2010 19:55 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Если у нас нижняя граница для индексов 0, а верхняя меняется (что весьма распространенный случай), то получить список последовательных наборов индексов можно так:
Код:
indexes maxs = mapM (\i->[0..i]) maxs

где maxs -- список верхних границ индексов.
Пример получения наборов индексов для двумерного массива 5x4:
Код:
> indexes [4,3]
[[0,0],[0,1],[0,2],[0,3],[1,0],[1,1],[1,2],[1,3],[2,0],[2,1],[2,2],[2,3],[3,0],[3,1],[3,2],[3,3],[4,0],[4,1],[4,2],[4,3]]

Список, как понимаете, ленивый, так что для обхода массива вполне себе годится. Считайте это не списком а итератором.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 09 Ноябрь, 2010 20:25 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Ну и наконец общий случай, когда у нас может меняться как верхняя, так и нижняя граница:
Код:
indexes ranges = mapM (\(l,u)->[l..u]) ranges

Пример использования (двумерный массив с первым индексом от -2 до 2, вторым индексом от 2 до 4):
Код:
> indexes [(-2,2), (2,4)]
[[-2,2],[-2,3],[-2,4],[-1,2],[-1,3],[-1,4],[0,2],[0,3],[0,4],[1,2],[1,3],[1,4],[2,2],[2,3],[2,4]]


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Ноябрь, 2010 07:15 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 563
Откуда: Москва
Valery Solovey писал(а):
Вот мой код ...
Можете как-то прокомментировать ход решения? Это ведь самое интересное.
Valery Solovey писал(а):
Но там прибавляется не единица.
Не понял этой фразы и последующего куска кода. При чем тут это?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Ноябрь, 2010 08:48 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Может кому будет интересна статья:
Regular, Shape-polymorphic, Parallel Arrays in Haskell


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Ноябрь, 2010 13:48 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Peter Almazov писал(а):
Valery Solovey писал(а):
Вот мой код ...
Можете как-то прокомментировать ход решения? Это ведь самое интересное.
Ход решения весьма спонтанный. Собственно, в условии Вашей задачи и было дано почти всё решение: взять последний элемент, и добавить к нему единицу. Если переполнение, то "занулить" этот элемент и перейти к предпоследнему (здесь в силу определённых причин имеет смысл использовать цикл).

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

Выводом инварианта и ко. в явном виде не пользовался, но сейчас думаю, что они выглядит примено так.
Постусловие: переполнение или найден текущий элемент последовательности, который нужно увеличить на 1. Если текущий индекс обозначить через i, а минимально допустимое значение i = 0, то переполнение - это i < 0 (были локально переполнены все элементы последовательности)
Предусловие: имеется последовательность.
Инвариант: все элементы правее текущего имеют минимальное значение (поскольку имело место локальное переполнение).


Peter Almazov писал(а):
Valery Solovey писал(а):
Но там прибавляется не единица.
Не понял этой фразы и последующего куска кода. При чем тут это?

М-да, я написал текст, а потом вставил код, в результате чего текст оказался разорванным.
Цитата:
1. ...
2. ... а к самому правому числу перед текущим прибавляется единица.
...
Но там прибавляется не единица.
Имеется в виду, что между Вашим заданием и задачей, решаемой приведённым кодом, есть разница.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Ноябрь, 2010 13:54 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 563
Откуда: Москва
Вот пароль на архив: SPwTXMtM6vIcRe1
Там лежит вот что :)
Код:
void IncArray() {
  int dim = rank - 1;
  //инвариант цикла словами: разряды в правом куске массива _indices установлены правильно
  //в начале этот кусок пустой, в цикле он расширяется влево
  while (dim >= 0 && _indices[dim] + 1 > GetUpperBound[dim]) {
    _indices[dim] = GetLowerBound[dim];
    dim--;
  }
  if (dim >= 0) {
    _indices[dim]++;
  } else {
    _complete = true;
  }
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Ноябрь, 2010 15:22 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
А мой инвариант считать правильным можно?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Ноябрь, 2010 15:37 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 563
Откуда: Москва
Вполне. У меня - "имеют правильное значение", у Вас более точно: все элементы правее текущего имеют минимальное значение (поскольку имело место локальное переполнение).


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2025, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB