-
Здравствуйте!
Помогите, не могу понять, какой алгоритм позволит решить следующую задачу:
есть последовательность из букв, к примеру, от A до F. Необходимо вывести все возможные комбинации этих букв, от просто A до FFFFFF включительно.
-
> Необходимо вывести все возможные комбинации этих букв
Так, каким образом поставлена задача - невозможно. Их бесконечное количество.
-
> Так, каким образом поставлена задача - невозможно. Их бесконечное
> количество.
основание системы в степени позиций т.е в данном случае 6^6.
-
Не ясно, что не так в моей постановке задачи, но количество отнюдь не бесконечно:
A
B
C
...
F
AA
AB
...
AF
...
AAAAAA
...
FFFFFF
-
Извиняюсь, FF на месте AF.
-
То есть поясните, пожалуйста, как получить необходимые комбинации?
-
Неужели никто не может помочь?
-
Чем же тебе помочь, убогий ?
Программу что ли за тебя написать ?
-
Стоит всё же крепко задуматься:
чего же больше от таких форумов - вреда или пользы?
-
держи
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c,d,e,f:integer;
res:string;
begin
for a:=64 to 70 do
for b:=64 to 70 do
for c:=64 to 70 do
for d:=64 to 70 do
for e:=64 to 70 do
for f:=64 to 70 do
begin
res:='';
if a<>64 then res:=chr(a);
if b<>64 then res:=res+chr(b);
if c<>64 then res:=res+chr(c);
if d<>64 then res:=res+chr(d);
if e<>64 then res:=res+chr(e);
if f<>64 then res:=res+chr(f);
memo1.Lines.Add(res);
end;
end;
оно?
зы не спрашивай почему с 64, а не с 65...)
-
Простите, за что такие оскорбления? Я начинающий студент и не могу взять в толк АЛГОРИТМ перебора всех таких комбинаций. Если можете помочь с ним, то я сам напишу программу. Или хотя бы подскажите, в какую сторону двигаться. Я же вас не оскорблял.
-
brother, код не оптимален, очевидно же.
-
> Я начинающий студент и не могу взять в толк АЛГОРИТМ перебора
> всех таких комбинаций
какой тут алгоритм? цикл - он и в Африке цикл.
А если ты не можешь его придумать, то может стоит задуматься о смене профессии? Я серьёзно, без подколок.
Студент на то и студент, чтобы самому эти вещи придумывать. Пусть коряво, пусть неоптимально. Но - САМ.
Иначе грош тебе цена потом.
-
> brother, код не оптимален, очевидно же.
Конечно, тут рекурсия нужна.
-
простейший - шесть вложенных циклов
-
> brother, код не оптимален, очевидно же.
не, вы посмотрите на него, ему код привели, он еще и фу говорит ;)! Господа, я умываю руки
зы автор, я тебе идею дал, оптимизация - твое домашнее задание...
-
Я придумал точно то же, что написал brother, но это, повторюсь, неоптимально. На васме я нашел целую статью по инкременту пароля (поскольку рассудил, что задача моя имеет по принципу схожесть с брутфорсерами). Только вот нельзя ли сделать решение моей задачи проще? К чему такие нападки?
-
> Конечно, тут рекурсия нужна.
это как раз в данном случае - излишне
она нужна, когда не известен заранее уровень вложенности циклов
-
> Я придумал точно то же, что написал brother, но это, повторюсь,
> неоптимально.
Уверен?
-
> нельзя ли сделать решение моей задачи проще?
можно
думай, пробуй
-
> Конечно, тут рекурсия нужна.
За такое в эцих.
-
Ега, уверен. Дело в том, что, как заметил Правильный Вася, уровень вложенности неизвестен (последовательность A до F я дал как пример).
-
> она нужна, когда не известен заранее уровень вложенности
> циклов
Ну если у него строго 6 элементов - то да, нафиг не нужна. Если произвольное - то нужна.
А из вышеприведённого кода я бы chr выкинул и на константы заменил.
-
я понимаю, пятница - день тяжелый, но чем код не оптимален? и нафиг цикл? условие перебора в строго проеделенных пределах выполняется, что еще надо?
-
Повторюсь, глубина вложенности неизвестна. Сейчас пытаюсь реализовать рекурсию.
-
> уровень вложенности неизвестен
Собственно, я так и думал. Иначе какое это студенческое задание.
viper, читай про рекурсию. Пробуй, пытайся. Если ты не способен самостоятельно это задание сделать - бросай эту профессию. Я серьёзно.
-
> не могу взять в толк АЛГОРИТМ перебора всех таких комбинаций
Алгоритм циклический.
В цикле последовательно перебираются все числа в диапазоне от [0..N^N - 1], где N - основание выбранной системы счисления (в твоем случае = 6)
Каждое из этих чисел для визуального представления кодируется поразрядно в соответствии с выбранной системой кодирования значений разряда (в твоем случае это коды символов от A до F)
-
> Повторюсь, глубина вложенности неизвестна.
а где это в задании сказано?
-
> но чем код не оптимален?
Зачем мильён раз char(i) вызывать?
-
ега, не стоит так сразу. Я хочу ПОНЯТЬ.
-
> char(i) вызывать
ну если так ;) Мне нравится, что автону нужно не только реализовать программу, но еще и оптимально)
-
Договоримся, что слева младший символ, справа старший.
1. Задаём и выводим мимимальное значение комбинации
2. Увеличиваем младший символ на 1
3. Если он стал больше максимально доступного в разряде,
то его сбрасываем на минимум и увеличиваем на 1 следующего по старшинству
и применяем к ниму правило 3.
4. Выводим результат.
5. Если не достигнут максимум (FFFFFF), то возвращаемся 2.
Два вложенных цикла и ни каких рекурсий.
-
Ега, объясните, как сделать рекурсию. Я НЕ могу разобраться.
-
Перепутал - младший справа.
-
-
Мне не нужна информация по поводу СС.
-
> Мне не нужна информация по поводу СС
Это почему же ?
-
> Ега, объясните, как сделать рекурсию. Я НЕ могу разобраться.
procedure TestRecurrence(const CurrLevel, MaxLevel : Integer);
begin
if CurrLevel>MaxLevel then Exit;
ShowMessage('Current level : ' + IntToStr(CurrLevel));
TestRecurrence(CurrLevel + 1, MaxLevel);
end;
Пример вызова:
TestRecurrence(1, 6);
-
Да потому что я думаю о рекурсии. Не могу понять. Вот:
const count=3;
var
Form1: TForm1;
counter: integer;
implementation
procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.Lines.Clear;
counter := 1;
makecomb('');
end;
procedure TForm1.makecomb(s: string);
var i:integer;
res:string;
begin
for i := 64 to 67 do
begin
if i<>64 then
begin
res := res + chr(i);
end;
memo1.Lines.Add(res);
inc(counter);
if counter>3 then exit;
makecomb(res);
end;
end;
это неверно. Как же сделать верно?
-
Ега, о общих принципах рекурсии я знаю. Только как ее применить здесь? Объясните, подтолкните мысль, будьте снисходительней.
-
А теперь попробуй так:
procedure TestRecurrence(const CurrLevel, MaxLevel : Integer);
begin
if CurrLevel>MaxLevel then Exit;
TestRecurrence(CurrLevel + 1, MaxLevel);
ShowMessage('Current level : ' + IntToStr(CurrLevel));
end;
А потом подумай, почему такие разные результаты.
-
> Да потому что я думаю о рекурсии
А зачем ты о ней думаешь ?
Она нафих не нужна в твоей задаче)
-
> Ега, о общих принципах рекурсии я знаю. Только как ее применить
> здесь? Объясните, подтолкните мысль, будьте снисходительней.
Я не буду. Не потому, что мне жалко. Мне не жалко. Просто иначе ты никогда этого не сделаешь. Нужно через это пройти самому, понимаешь?
Считай это тестом для себя на свою проф.пригодность.
-
Ега, ну не могу я понять этого. Я все понимаю, но не нужно говорить об этой задаче, как о последней инстанции. Дай хотя бы одну подсказку.
-
> Дай хотя бы одну подсказку.
тебе их дали, даже больше одной
метла ждет тебя, ее программировать проще
-
Хватит издеваться.
Дай подсказку по поводу рекурсии, не более.
-
> Дай подсказку по поводу рекурсии, не более.
рекруссия - вызов саого себя...
-
Ну да. Издевательство продолжается. Поставлю вопрос иначе: что ошибочного в моем коде?
-
> Поставлю вопрос иначе: что ошибочного в моем коде?
inc(counter);
> Ну да. Издевательство продолжается.
Закройте ветку.
-
читай [41] [42] [44] До полного просветвления...
-
Убирая inc, мы зацикливаем программу) Да, отличная шутка.
brother, к сожалению, высоких материй я там не нашел.
-
> viper (24.10.08 12:17) [47]
А как еще относиться к воинствующему чайнику aka ламеру ?
-
> Убирая inc, мы зацикливаем программу) Да, отличная шутка.
да зацикливаем, потомучто твой инк и вызов самого себя находятся в теле for, понятно что к чему теперь?
-
Можно просто, по-человечески помочь. По-русски. Зачем показывать, что вы выше меня? Я и так прекрасно знаю свое место. Я лишь попросил помочь. Я не могу понять, как заменить циклы рекурсией. Поясните, пожалуйста. Разве это столь сложно?
-
brother, вынося inc и вызов рекурсии за пределы цикла, результат все равно неверен.
-
> brother, вынося inc и вызов рекурсии за пределы цикла, результат
> все равно неверен.
программирование без понятия как работает программа - грех, напиши алгоритм работы программы на листочке, далее ВКУЛЮЧАЙ МОЗГ!
-
> viper
Никакая рекурсия не нужна.
Два цикла - один генерирует последовательность чисел, другой (вложенный) кодирует каждое число по требуемым правилам.
И всё !
За каким лешим тут еще и рекурсия нужна ?
Головой думай, а не причинным местом)
-
Сергей, какие правила кодирования? Откуда вы вообще взяли, что здесь должно быть кодирование???
-
кодированием, Сергей называет преобразование получаемого числа в символы...
-
brother, алгоритм программы таков:
1. Взяли необходимое число букв для комбинаций, пусть 3 буквы (от А до С)
2. Берем первую букву
3. Прибавляем ее к результату
4. Выводим
5. Увеличиваем счетчик цикла, берем вторую букву, р-т предварительно обнулив, показываем и т.д. до конца нашего мн-ва букв.
6. Дойдя до конца мн-ва, то есть трех, снова начнем цикл. И вот тут-то я и не понимаю, как нужно двигаться дальше. Поясните!
-
brother - кодирование это взять chr от числа?
-
> brother, алгоритм программы таков:
это ты мне рассказываешь?
-
Я тебе его привел, чтобы ты просмотрел, буде у тебя возникнет все же желание помочь и ткнул носом в ошибки алгоритма.
-
Меня ткнул носом, ессно.
-
> и ткнул носом в ошибки алгоритма.
ого О_о
-
И все-таки...
-
brother, давай я напишу измененный текст процедуры, а ты посмотришь его? Пожалуйста.
-
давай без давай? ;))))
зы пробуй)))
-
procedure TForm1.makecomb(s: string);
var i:integer;
res:string;
begin
for I := 64 to 67 do
begin
if i<>64 then
res := s + chr(i);
memo1.Lines.Add(res);
end;
inc(counter);
if counter>3 then exit;
makecomb(res);
end;
эта процедура неверна, но уже что-то. Она выдает
(пустая строка)
A
B
C
CA
CB
CC
CCA
CCB
CCC
-
> какие правила кодирования?
Оч простые : нулевому значению N-ричного разряда соответствует символ 'A', единичному значению - 'B', двойке - 'C', .. и т.д.
-
> Откуда вы вообще взяли, что здесь должно быть кодирование?
Ты с дуба упал ?
ты когда десять пальцев на руках насчитал, какое число на бамажке пишешь ?
10 ?
Вот эта самая '10' и есть результат кодирования того что ты насчитал)
-
Я понимаю, почему процедура выдает неверный результат. Рекурсия должна вызываться иначе. Но как?
-
А мог, кстати, записать 'X', или '12', или '1010', или 'A', или '100' - и все записи будудт верными, и все они еть результат кодированного представления "десятки" в той или иной СС !!!
-
Сергей, рассмотри мой вариант с рекурсией.
-
Зачем ?
К решению задачи эти потуги отношения не имеют.
-
А если я хочу решить эту задачу с помощью рекурсии?
-
А если я хочу решить эту задачу с помощью рекурсии?
-
Решай)
Я разве против ?
Но способствовать ничем не оправданному ослиному упрямству у меня желания нет.
-
Для иследования рекурсии необходимы:
1. View, Debug Windows, Call Stack
2. Клавиша F7
3. Клавиша Shift+F8
Имеются?
-
Твой вариант, с кодированием, мне кажется довольно сложным. Разве рекурсия не будет проще?
-
Наиль, я и сам могу протрассировать выполнение проги в уме. Но не знаю, как сделать верную рекурсию...
-
> Твой вариант, с кодированием, мне кажется довольно сложным.
> Разве рекурсия не будет проще?
Могут быть более короткими, но очень(!) тяжело отлаживаются и часто приводят к зависанию программы из-за переполнения стека.
-
Я придумал вот что: в момент очередной итерации нужно вызвать рекурсию с началом в этой строке, но как ее ограничить? Завершить?
-
Завершают рекурсию почти всегда одинаково:
if условие then Exit;
-
> вариант, с кодированием, мне кажется довольно сложным. Разве
> рекурсия не будет проще?
В огороде бузина, а в Киеве дядька.
Две никак не связанные вещи.
Рекурсивные методы вычислений полезны (а чаще попросту необходимы как единственно возможные) в алгоритмах с возвратом.
Откуда и куда ты вознамерился в данном случае "возвращаться" - ума не приложу.
Впрочем, гланды конечно можно удалять и через задний проход)
-
Наиль, не то. Я имею ввиду, что нужно каким-то образом ограничить ее выполнение.
Вот пусть у нас есть буквы А, В, С.
Необходимо получить на выходе список:
А
В
С
АА
АВ
АС
ВА
ВВ
ВС
...
СС
ААА
ААВ
ААС
ВАА
ВАВ
ВАС
...
ССС
вначале у нас идет просто цикл
а вот затем где-то нужна рекурсия
вот как ее сделать?
-
-
> Можно просто, по-человечески помочь.
Написать за тебя лабу стОит денег.
-
За меня не нужно писать лабу.
-
Ну вот, собственно, опять скатились к деньгам. Кто там такой правильный был и выступал, что это аморально? Вот пусть сначала десятку идиотов поотвечает, а потом за мораль с ним поговорим.
-
Я не идиот. Тут дали советы, тысячи их! Но самое забавное, что по делу - ни одного.
procedure generate;
| var i,j : integer;
begin
| if t = n then begin
| | for i:=1 to n do begin
| | | write(a[i]);
| | end;
| | writeln;
| end else begin {t < n}
| | for j:=1 to k do begin
| | | t:=t+1;
| | | a[t]:=j;
| | | generate;
| | | t:=t-1;
| | end;
| end;
end;
это вы мне предложили использовать?
-
> За меня не нужно писать лабу.
А это про что
Помогите, не могу понять, какой алгоритм позволит решить следующую задачу
?
Или достаточно было ответить: алгоритм Дуремарова-Шнеерсона? И как ты пытался понять, какой? Выбирал из списка?
-
-
-
-
-
Удалите, утроение, пожалуйста, браузер сглючил
-
Это надо не использовать, а проанализировать логику закодированного в этом фрагменте алгоритма, и на основе проведенного анализа сделать умозаключение, можно ли и каким образом адаптировать этот алгоритм к своей , довольно похожей задаче.
-
> Я не идиот. Тут дали советы, тысячи их! Но самое забавное,
> что по делу - ни одного.
Не можешь сделать сам - плати бабки, желающих подзаработать тут полно.
Советов тебе дали - кучу. Все - по делу. Какие-то лучше, какие-то хуже, но все по делу.
-
Я не вижу способов адаптировать это к моей, довольно похожей задаче. Просто потому, что здесь используется массив.
-
А ответить без бабок не вариант? Или тебе за три строчки так хочется денег? А?!
-
> А ответить без бабок не вариант? Или тебе за три строчки
> так хочется денег? А?!
Если это такая смешная ерунда, эти три строчки, что же ты их сам не написал?
-
Я просто попросил помочь. Я не могу сообразить, сделать какой-то вывод, который на поверхности. Скажите же его, сколько уже можно!
-
Ну значит не судьба.
-
Если тебя заклинило на обязательном использовании неких рекурсивных методов в контексте решения этой задачи, то 7.1.6 будет как нельзя кстати - тут тебе и рекурсия, и кодирование, и СС
-
А если ты просто напишешь ошибку в моем алгоритме? А?
-
> А ответить без бабок не вариант?
вариант. Только ты не умеешь слушать. Ине хочешь думать. А хочешь получить всё сразу и нахаляву.
Ну а халявщиков нигде не любят. И на этом форуме - тоже.
> Или тебе за три строчки так хочется денег? А?!
Мне - нет, у меня зарплата приличная. Да и не буду я тебе отвечать ничего. Но, думаю, если ты объявишь рублей 500 за задачу - найдётся масса людей, которые тебе её сделают. Оптимально.
-
Запрещается: ....алгоритмы взлома того или иного программного обеспечения.
Необходимо вывести все возможные комбинации этих букв, от просто A до FFFFFF включительно.
Алгоритм для подбора пароля архива, ИМХО :)
-
Ега, я внимательно слушал, вот последние ответы мне наиболее ясны, но все же: конечно, строка - это массив. Но вот делать массив строк...
-
чё-та я устал.
-
Короче, студень, хватит уже нести отсебячину.
Приводи сюда дословно текст задания на ЛР.
-
Ега, я отпишу тебе в аську, ибо общаться на форуме я устал тоже.
-
Это не лабораторная работа, а моя выдумка.
Дословно: необходимо вывести все комбинации букв от 1 до М (задается юзером) символов, начиная от A и заканчивая М-тым символом, считая включительно от А (т.е. если М=3, то это А, В, С). То, что должно быть на выходе, уже написал выше.
-
> Ега, я отпишу тебе в аську, ибо общаться на форуме я устал
> тоже.
ну-ну. Это будет отпись в никуда, т.к. я ей не пользуюсь.
-
> viper (24.10.08 14:23) [112]
Т.е. необходимость применения именно рекурсивных методов - тоже всего лишь твоя блажь, а не чем-то действительно обоснованное требование ?
-
Представь, что это требование выдвинуто заказчиком.
-
> т.к. я ей не пользуюсь.
это печально.
-
> это требование выдвинуто заказчиком
А я вот написал [107]
-
Ты параноик)
-
> это требование выдвинуто заказчиком
Врешь и не моргаешь)
Какое дело заказчику до методологии ?
Заказчику нужен конечный результат, а не методология !
А если заказчик вмешивается в процесс выбора исполнителем методологии достижения конечного результата, то бежать нужно от такого заказчика аки черту от ладана !)
-
ок, требование выдвинуто исходя из максимального размера кода, код должен быть мал, т.к. памяти на винте мало))))
-
> viper (24.10.08 14:42) [120]
> требование выдвинуто исходя из максимального размера кода
И какой же этот "максимальный размер" ?
> код должен быть мал, т.к. памяти на винте мало
А причем здесь рекурсия ?
-
он будет меньше. Короче говоря, рекурсия, никак иначе.
-
> он будет меньше
Это по какому же постановлению партии и правительства он будет меньше ?
И меньше чего конкретно ?
-
Ты тролль же)
-
Все с тобой ясно.
см. [51]
-
Идите-ка вы все нахуй.
-
> [126]
Традиционное завершение подобных веток.
-
> Традиционное завершение подобных веток.
Ну шо тут поделать - такая уж традиция у современных оболтусов - "На халяву и прям щас".
Вот мы и стараемся - халяву и прям туда. :)
-
соси хуй, быдло
-
ICQ 196854965 ?
-
Генерацию последовательности из трех букв автор освоил !
Не пропал наш скорбный труд)
-
Сергей, деанонимизация в твоих руках - чистый фейл. Двач негодоват!
-
Кстати, меня заинтересовала идея, предложенная Наилем:
> Договоримся, что справа младший символ, слева старший.
> 1. Задаём и выводим мимимальное значение комбинации
> 2. Увеличиваем младший символ на 1
> 3. Если он стал больше максимально доступного в разряде, то его сбрасываем на минимум и увеличиваем на 1 следующего по старшинству и применяем к ниму правило 3.
> 4. Выводим результат.
> 5. Если не достигнут максимум (FFFFFF), то возвращаемся на 2.
Не могли бы вы поподробнее раскрыть вашу идею?
-
Я вот решил реализовать данный код, но сразу же столкнулся с вопросом: а какие два цикла вы имеете ввиду?
-
> Макарец Сергей (24.10.08 16:29) [134]
Это ты мне ?
-
Нет, Наилю. Не совсем ясно, как в цикле можно реализовать то, что он предложил.