Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Перестановки чисел (http://www.flasher.ru/forum/showthread.php?t=79688)

Marleny 13.05.2006 18:28

Перестановки чисел
 
Помогите запрограммировать такую штуку: вводится число классов, в каждом классе число элементов (например числа). Нужно получить строки заданной длины N из всевозможных перестановок этих чисел. Например, 4 класса, в них 2, 2, 1, 1 элементов: [1,1], [2,2], [3], [4], длина строки =3. Должно получиться:
112
113
114
121
122
123
124
131
132
134
141
142
143
211
212
213
214
221
223
232
234
241
242
243
311
312
314
321
322
324
341
342
411
412
413
421
422
423
431
432
Вся проблема в том, что заранее неизвестна длина строки N, и поэтому нельзя сделать просто определенное число вложенных циклов. Помогите пожалуйста!! очень нужно

0xFFFFFF 14.05.2006 05:02

рекурсия?

Marleny 14.05.2006 12:23

Белая
желательно нет

еще можно так сформулировать: есть массив элементов, например [1,1,2,2,3,4], нужно сделать все сочетания какой-то длины, например 3

0xFFFFFF 14.05.2006 12:25

Цитата:

Сообщение от Marleny
Белая
желательно нет

еще можно так сформулировать: есть массив элементов, например [1,1,2,2,3,4], нужно сделать все сочетания какой-то длины, например 3

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

etc 14.05.2006 14:23

Marleny,
2.718281828459045 (exp) [Сделайте всё за меня]

Marleny 14.05.2006 16:09

Я по-моему вполне понятно написала, что я делала (вложенные циклы), в чем проблема (неизвестно их количество). Я прошу предложить какой-то алгоритм, или подсказать идею реализации. Если кто-то считает, что я просто прошу все сделать за меня и ничего не пытаюсь сделать сама, то это не так. Хотя, конечно, каждый имеет право на собственное мнение. Единственная просьба - если не хотите или не можете предложить что-то конкретно по задаче, не стоит тыкать меня в тему "делай все за меня" или наподобие.

Белая
Я тебе поработать не предлагаю, а прошу помочь.

0xFFFFFF 14.05.2006 17:14

я же говорю РЕКУРСИЯ.
у меня всё получилось.
других выходов пока не вижу.

iNils 14.05.2006 18:40

Можно и без рекурсии, но алгоритм сложнее.

0xFFFFFF 14.05.2006 19:06

Цитата:

Сообщение от iNils
Можно и без рекурсии, но алгоритм сложнее.

как например?

iNils 14.05.2006 19:21

Цитата:

Сообщение от Белая
как например?

Конечно через циклы.

0xFFFFFF 14.05.2006 19:23

Цитата:

Сообщение от iNils
Конечно через циклы.

и как ты предлагаешь неограниченное кол-во вложенных циклов сделать?

tonnon 14.05.2006 19:24

я как-то вывел формулу:) может пригодится
если даны три числа то комбинаций может быть 6:
123
132
213
231
312
321
получается: кол-во комб = 3*2. если 4 числа то 4*3*2, если 5 то 5*4*3*2 ну и т.д. я все проверил!

iNils 14.05.2006 19:26

Цитата:

Сообщение от Белая
и как ты предлагаешь неограниченное кол-во вложенных циклов сделать?

А не нужно неограниченное количество делать. Здесь как в часах, смена секундной стрелки с 59 на 0, дает смещение минутной на 1. Ну и так далее.

0xFFFFFF 14.05.2006 19:27

Цитата:

Сообщение от tonnon
я как-то вывел формулу:) может пригодится
если даны три числа то комбинаций может быть 6:
123
132
213
231
312
321
получается: кол-во комб = 3*2. если 4 числа то 4*3*2, если 5 то 5*4*3*2 ну и т.д. я все проверил!

хахахахааа!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
мы это в школе проходили :)))

0xFFFFFF 14.05.2006 19:28

Цитата:

Сообщение от iNils
А не нужно неограниченное количество делать. Здесь как в часах, смена секундной стрелки с 59 на 0, дает смещение минутной на 1. Ну и так далее.

хм... имхо с рекурсией проще будет

iNils 14.05.2006 19:34

Цитата:

Сообщение от tonnon
я как-то вывел формулу:) может пригодится
если даны три числа то комбинаций может быть 6:
123
132
213
231
312
321
получается: кол-во комб = 3*2. если 4 числа то 4*3*2, если 5 то 5*4*3*2 ну и т.д. я все проверил!

Не совсем верно. Могут использоваться цифры 1, 1, 2, 2, 3, 4. То есть единица в разных положениях может использоваться дважды, но! есть 1(первая) и есть 1(вторая) и использовать в комбинации 231 единицу можно только один раз, либо с первой либо со второй. Поэтому число комбинаций будет меньше.

iNils 14.05.2006 19:34

Цитата:

Сообщение от Белая
хм... имхо с рекурсией проще будет

См пост 8

0xFFFFFF 14.05.2006 19:35

Цитата:

Сообщение от iNils
Не совсем верно. Могут использоваться цифры 1, 1, 2, 2, 3, 4. То есть единица в разных положениях может использоваться дважды, но! есть 1(первая) и есть 1(вторая) и использовать в комбинации 231 единицу можно только один раз, либо с первой либо со второй. Поэтому число комбинаций будет меньше.

комбинаторика как помню.. первый или второй курс?

iNils 14.05.2006 19:38

Цитата:

Сообщение от Белая
комбинаторика как помню.. первый или второй курс?

Не помню, я еще в школе ей интересовался.

Marleny 14.05.2006 19:54

iNils
то есть ты предлагаешь делать след. образом (arr=[1,1,2,2,3,4]), используя индексы:
012, увеличиваем 2 пока не станет равной 5,т.е:
012, 013, 014, 015
потом 5-->0, предыдущая цифра (1) увеличивается на единицу
020, 021, 022, 023и т.д.
а как в таком случае отлавливать ситуации, когда индексы повторяются? (020, 022,...)

tonnon 14.05.2006 19:59

Цитата:

Сообщение от iNils
Не совсем верно. Могут использоваться цифры 1, 1, 2, 2, 3, 4. То есть единица в разных положениях может использоваться дважды, но! есть 1(первая) и есть 1(вторая) и использовать в комбинации 231 единицу можно только один раз, либо с первой либо со второй. Поэтому число комбинаций будет меньше.

эт я просто привел пример. я не говорил что эта формула будет решением

0xFFFFFF 14.05.2006 21:28

Цитата:

Сообщение от tonnon
эт я просто привел пример. я не говорил что эта формула будет решением

зачем? выпендриться?

Nirth 14.05.2006 21:30

Цитата:

зачем? выпендриться?
Какая ты злая стала

0xFFFFFF 14.05.2006 21:58

Цитата:

Сообщение от Nirth
Какая ты злая стала

я?? злая? не люблю пустой выпендреж :))

Nirth 14.05.2006 21:59

человек высказал идею...

iNils 14.05.2006 22:00

Цитата:

Сообщение от Marleny
iNils
то есть ты предлагаешь делать след. образом (arr=[1,1,2,2,3,4]), используя индексы:
012, увеличиваем 2 пока не станет равной 5,т.е:
012, 013, 014, 015
потом 5-->0, предыдущая цифра (1) увеличивается на единицу
020, 021, 022, 023и т.д.
а как в таком случае отлавливать ситуации, когда индексы повторяются? (020, 022,...)

именно. а индексы проверять до первого свободного вверх.

0xFFFFFF 14.05.2006 22:01

Цитата:

Сообщение от Nirth
человек высказал идею...

извините, не заметила идеи...

iNils 14.05.2006 22:07

Цитата:

Сообщение от Белая
извините, не заметила идеи...

Идея в том как заменить рекурсию, а заменить ее можно только зная максимальное (без исключений) число значений.

Marleny 16.05.2006 16:10

Я нашла решение своей задачи. С помощью рекурсии. Всем спасибо, кто помог, вопрос решен, если кому-то интересно, вот алгоритм решения:
Начальный массив элементов: arr1=[1,1,2,2,3,4]
Длина строки: <=N
Формируем массив - элемент которого есть число одинаковых цифр в arr1: arrIndex1=[2,2,1,1]
st1 - строка, в которую накапливаем цифры.
При вызове функции необходимо указывать длину на 1 больше, чем нужно на самом деле

функция Цикл (N, st1, arrIndex1);
var st2:string;
arrIndex2: тип такой же, как arrIndex1;
{ st2=st1;
arrIndex2=arrIndex1;
if (N>1) {
{for (i=1; i<=arrIndex1.length(); i++)
{if (arrIndex1[i]>0)
{arrIndex1[i]--;
st1=st1+i;
вывод st1;
Цикл(N-1, st1, arrIndex1);
st1=st2;
arrIndex1=arrIndex2
}
}
}
}
}

0xFFFFFF 16.05.2006 21:56

Цитата:

Сообщение от Marleny
функция Цикл (N, st1, arrIndex1);
var st2:string;
arrIndex2: тип такой же, как arrIndex1;
{ st2=st1;
arrIndex2=arrIndex1;
if (N>1) {
{for (i=1; i<=arrIndex1.length(); i++)
{if (arrIndex1[i]>0)
{arrIndex1[i]--;
st1=st1+i;
вывод st1;
Цикл(N-1, st1, arrIndex1);
st1=st2;
arrIndex1=arrIndex2
}
}
}
}
}

это на каком языке? :eek:
за русский в коде убила бы..

K.A.T.A.F.A.L.K.E.R 16.05.2006 22:41

Цитата:

Сообщение от Белая
за русский в коде убила бы..

Цитата:

Какая ты злая стала
..... :mosking:

Marleny 17.05.2006 11:48

Белая
Цитата:

Сообщение от Marleny
... вот алгоритм решения...

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

Marleny 17.05.2006 11:50

Прошу модераторов закрыть тему

K.A.T.A.F.A.L.K.E.R 17.05.2006 15:21

Цитата:

Сообщение от Marleny
единственным словом по теме было упоминание о рекурсии

как по мне - это было единственное здравое слово на всю тему...


Часовой пояс GMT +4, время: 16:14.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.