Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перебор динамического массива 
:(
    Опции темы
stalkerok
Дата 18.1.2009, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



Добрый день!
Возможно ли сделать полный перебор значений динамического массива?

например 3-и значения:
Код

var
  i1, i2, i3: integer;
  a: array of integer;
begin
  setlength(a, 3);

  a[0]:=3;
  a[1]:=7;
  a[2]:=5;

  for i1 := 0 to High(a) do
  begin
    for i2 := 0 to High(a) do
    begin
      for i3 := 0 to High(a) do
      begin
        if (not(a[i1]=a[i2]) and not(a[i1]=a[i3]) and not(a[i2]=a[i3])) then
        memo1.Lines.Add(format('%d %d %d',[a[i1], a[i2], a[i3]]));
      end;
    end;
  end;


но как быть если размер массива меняется ? делать как-то динамические циклы и условия?

заранее спасибо!

Это сообщение отредактировал(а) stalkerok - 18.1.2009, 00:42
PM MAIL   Вверх
Alexeis
Дата 18.1.2009, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(stalkerok @  17.1.2009,  23:37 Найти цитируемый пост)
но как быть если размер массива меняется ? 

  внутри цикла? Тогда цикл for не подходит, нужен while


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
SneG0K
Дата 18.1.2009, 00:43 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 1
Всего: 54



Цитата(stalkerok @  17.1.2009,  23:37 Найти цитируемый пост)
делать как-то динамические циклы и условия?

Код

 for i:=0 to length(dynamic_array) do
 begin
   ..Запустися цикл по массиву
 end;


Добавлено через 38 секунд
Цитата(Alexeis @  17.1.2009,  23:41 Найти цитируемый пост)
внутри цикла?

Да уточни... А то я сразу не догнал,..
PM WWW Skype   Вверх
stalkerok
Дата 18.1.2009, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



Цитата

внутри цикла? Тогда цикл for не подходит, нужен while 

Нет массив меняется перед циклом, а while получается также писать нужно n раз (n - длина массива)

Это сообщение отредактировал(а) stalkerok - 18.1.2009, 00:45
PM MAIL   Вверх
Alexeis
Дата 18.1.2009, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



SneG0K, а собсно чем length лучше High ? ИМХО это тоже самое +1 элемент.

Добавлено через 1 минуту и 51 секунду
Цитата(stalkerok @  17.1.2009,  23:44 Найти цитируемый пост)
А можно не внутри сделать? а while получается также писать нужно n раз (n - длина массива) 

  Так это как вам удобно, по идее High должен работать и с динамическими размерностями


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
stalkerok
Дата 18.1.2009, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



это будет функция в которую будет передаваться массив разной дины например с 500 или 1000 элементов, и тогда как?
PM MAIL   Вверх
Alexeis
Дата 18.1.2009, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



stalkerok, ааа я понял, вложенностей должно быть столько сколько элементов. Попробуйте рекурсию.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
stalkerok
Дата 18.1.2009, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



Alexeis спасибо Вам, а как её применить?
PM MAIL   Вверх
SneG0K
Дата 18.1.2009, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: 1
Всего: 54



stalkerok, рекурсия - это когда функция вызывает сама себя
PM WWW Skype   Вверх
Alexeis
Дата 18.1.2009, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  Внутри цикла функция вызовет саму себя, соответственно в ней тоже будет обход цикла с вызовом самой себя. Ток чета мне кажется сам алгоритм требует доработки. В чем состоит задача?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
stalkerok
Дата 18.1.2009, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



Цитата

В чем состоит задача?

частичным решением этой задачи

и вот тут я запутался...
Код

procedure TmainFrm.startClick(Sender: TObject);
var
  i: integer;
  a: array of integer;
begin
  setlength(a, 3);

  a[0]:=3;
  a[1]:=7;
  a[2]:=5;

  memo.Lines.Clear;

  for i := 0 to High(a) do
  begin
    rec(a);
    //memo.Lines.Add(format('%d %d %d',[a[i1], a[i2], a[i3]]));
  end;

end;

function rec(a: array of integer): array of integer;
var
  i:integer;
  b:array of integer;
begin
  setlength(b, length(a));
  for i := 0 to High(a) do
  begin
    //
  end;
end;

PM MAIL   Вверх
Alexeis
Дата 18.1.2009, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Гм... муторное условие. Что-то похожее решение задачи из теории графов.

Добавлено через 1 минуту и 19 секунд
Одно ясно точно без рекурсии не обойтись, но по примерам трудно понять хорошо бы четкое условие.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
stalkerok
Дата 18.1.2009, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



вот нашёл несколько алгоритмов перебора, не подскажите какой быстрее(лучше)?
PM MAIL   Вверх
stalkerok
Дата 18.1.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



Цитата

Гм... муторное условие. Что-то похожее решение задачи из теории графов.

да так и есть, 
Цитата

Одно ясно точно без рекурсии не обойтись, но по примерам трудно понять хорошо бы четкое условие. 

мне всего лишь нужно перебрать все комбинации в массиве разной длины (как в старттопике), не получается с рекурсией можно пример?

заранее спасибо!
PM MAIL   Вверх
stalkerok
Дата 18.1.2009, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 28.12.2007

Репутация: нет
Всего: нет



Попытался сделать но ничего не получается что не так?

Код

procedure TmainFrm.startClick(Sender: TObject);
var
  a: array of integer;
begin
  setlength(a, 3);
  a[0]:=3;
  a[1]:=7;
  a[2]:=5;
  memo.Lines.Clear;
  rec(a);
end;

procedure TmainFrm.rec(a: array of integer);
var
 i:integer;
begin
  for i := 0 to length(a) do
  begin
    rec(a);
    memo.Lines.Add(format('%d %d %d',[a[i], a[i], a[i]]));
  end;
end;

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0989 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.