|
3 / 3 / 0
Регистрация: 07.01.2017
Сообщений: 101
|
|
Рекурсия. Рекурсия с мемоизацией.08.06.2019, 09:48. Показов 6002. Ответов 62
Метки нет (Все метки)
Добрый день. Задача такова: У нас есть массив для длины строки (пусть будет M=20). У нас есть некие длины слов (колличество не важно пусть будет 50 слов, задаим длины, как значение "j", ну а сами слова пусть будут "i"). Смысл в том, что заполнить словами строки + с учетом пробела + еще штрафы (штрафы - место оставшееся в строке куда не влезло слово и перенесли на след. строку). С этим всё более менее понятно. Но вот тут, момент который мне не понятен следкует. Дойдя до последней строчки, мы получим последний штраф, как мне сказали, его для рекурсии, нужно возвести в куб (^3 для большей наглядности) и пустить на подсчет выше по строкам, мол далее он сам всё сделает, все подсчеты "нужно довериться". Я НЕ ПОНИМАЮ! Как это и зачем, и как это сделать! Говорили, что нужно два цикла, один (внешний) на подсчет всех слов зачем-то, а второй (внутренний) , как я понял должен выполнять (что-то) и условие на пока не >0. Это рекурсия. И я не привык к такому ужасу, не могу понять. Помогите пожалста, а то уже голову сломал. Главное с рекурсией разобраться, а мемоизация, как я понял - это тоже самое, только с сохранением значений пройденный путей.
0
|
|
| 08.06.2019, 09:48 | |
|
Ответы с готовыми решениями:
62
Рекурсия. Рекурсия с мемоизацией. (полная версия в печатном варианте, работа со словами и строками) Рекурсия Рекурсия |
|
3 / 3 / 0
Регистрация: 07.01.2017
Сообщений: 101
|
|
| 08.06.2019, 20:38 [ТС] | |
|
Если кто чем может помочь, прошу помощи. Ибо сроки поджимают, а информацию рою битый день, но безуспешно. Даже примеров нет для самообразования подходящих.
0
|
|
|
Просто Лис
|
|||||||||||
| 09.06.2019, 08:30 | |||||||||||
|
Фибоначи
Или взять готовый декоратор:
0
|
|||||||||||
|
3 / 3 / 0
Регистрация: 07.01.2017
Сообщений: 101
|
|
| 09.06.2019, 08:55 [ТС] | |
|
Рыжий Лис, ну тут обсалютно другое, фибо и подобное уже изучил когда начальные знания по рекурсии получал самообразованием. Но увы это тут не особо уместно. Но всё равно спасибо.
0
|
|
|
3 / 3 / 0
Регистрация: 07.01.2017
Сообщений: 101
|
|
| 10.06.2019, 07:31 [ТС] | |
|
Как понял, работа осуществляется как в Microsoft Word документе. В принципе распределение слов не проблема. Но вот выполнение рекурсии и рекурсии с мемоизацией по штрафам, и смысл не понятен, и как делать примерных заданий даже нет. Через 2 цикла, да еще и формулой возведения в куб.
0
|
|
|
3 / 3 / 0
Регистрация: 07.01.2017
Сообщений: 101
|
|
| 12.06.2019, 06:15 [ТС] | |
|
dondublon, если бы было просто, сделал бы сам. А я почти слово в слово всё передал. Ни кто, кто был рядом тоже не понял, задания озвученного мне. Если бы было всё понятно, то даже не сунулся сюда. А сюда люди идут уже от безвыходности, когда не удаётся найти информацию на протяжении недели, как в моём случае. Или не удаётся понять.
0
|
|
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|||
| 12.06.2019, 07:27 | |||
|
Nik Golor, немного оффтопа.
Не по теме: У нас две темы с одинаковым содержимым. Невнятно сформулированная задача и непонимание, как ее решать. Причем большую часть тем занимают жалобы на преподавателей, которые не могут сформулировать задачу или замечания к вашему решению. Я допускаю, что все это имеет место быть. Если у вас нет письменного ТЗ, то неудивительно, что до нас вы доносите этот сумбур. Но жалобы не помогут решению задачи. Либо вы будете продолжать панически перебирать решения, либо сядете и спокойно разберетесь в том, что нужно сделать. Второе кажется дольше, на практике оказывается продуктивнее. С этого момента я предлагаю обсуждать задачу, а не ваше недовольство преподавателями. Последовательно, небольшими шагами. Забыли про «два цикла», «рекурсию» и «мемоизацию». Начнем с вопросов об интуитивном понимании задачи.
2
|
|||
|
3 / 3 / 0
Регистрация: 07.01.2017
Сообщений: 101
|
||||||
| 13.06.2019, 11:15 [ТС] | ||||||
|
0x10, вот пример, только надо с циклами работу наладить + не то что выше передали. Я не виноват, как сформулирован пример. Как дали, так и взял, и всем без интереса, пойму я его или нет.
0
|
||||||
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
||
| 13.06.2019, 17:58 | ||
|
Я же не просто так начал с примитивных вопросов. Пока вы только перебираете готовые решения.
1
|
||
|
3 / 3 / 0
Регистрация: 07.01.2017
Сообщений: 101
|
|
| 13.06.2019, 18:36 [ТС] | |
|
0x10, я могу расписать где что значит. и кстати, выпытал задание совершенно у левого препода. оказывается оно имеет вид такой. Реализовать динамику, рекурсию, рекурсию с мемоизацией.
0
|
|
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
||
| 13.06.2019, 20:02 | ||
|
Покажите результат работы на таком примере: длина строки = 10, текст «aaaaaaa bb cccccc ddddd». Приведите несколько вариантов решений, выберите среди них оптимальный. Распишите, почему он оптимальный. Тогда можно будет говорить о том, что вы понимаете задачу и переходить к методу решения.
1
|
||
|
Комп_Оратор)
|
||
| 13.06.2019, 20:06 | ||
|
1
|
||
|
3 / 3 / 0
Регистрация: 07.01.2017
Сообщений: 101
|
|
| 13.06.2019, 20:13 [ТС] | |
|
0x10, N - длинна строки / l - длина слова / ff = f(i-1) + m**3 сама формула распределения / m - это остаток свободный в строке
while m >= 0 and i > 2: пока он не 0 / i - это Номер слова / if (m - l[i-1] - 1) > 0: m = (m - l[i-1] - 1) ff = f(i-2) + m**3 пока остаток - "слово" - 1(пробел как я понял )> 0 m выполняем а ff - это Штраф с первой по нашу строку m**3 плюс другие штрафы if (m - l[i-2] - 1) > 0 and i > 3: m = m - l[i-2] - 1 ff = min(ff, m**3 + f(i - 3)) return ff пока (остаток в строке -штраф -пробел)>0 и номер слова >3 остаток в строке = остаток - штрафы суммарные в строке - пробел суммарные штрафы = минимум min(ff, m**3 + f(i - 3)) Выбор минимального штрафа Куда лучше последнее слово отправить возвращаем суммарные штрафы минимум min(ff, m**3 + f(i - 3)) С текущей строчки На ней оставить или на строчку вверх print(f(2)) а это выводим все штрафы в кс Добавлено через 2 минуты 0x10, на мой код преподаватель сказал. цитирую: он только сказал, что надо сделать 2 цикла, внешний будет считать число слов общее, а внутренний отцеплять по одному слову. вот такое, у нас есть два цикла. первый while мы орентируем как внешний цикл (для подсчета слов) (ранг как я понял тут рпименяем) , а второй while у нас идет как внутренний он для длин слов кароче. + во внутреннем цикле надо реализовать "пока" по оставшемуся свободному месту пока оно есть, что бы выполнялся. вот такие были наставления по программе. Добавлено через 49 секунд рад, что отозвались помочь, хоть кто-то.
0
|
|
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
||
| 13.06.2019, 20:25 | ||
|
Окей, что лично меня напрягает в этом коде.
Первое. Второе. Если ff — это штраф за размещение слов c i по j в одной строке, то в этом коде он вычисляется многократно, каждый раз. Ну или как минимум вычисление этих штрафов смешано с поиском оптимального решения. Это выглядит как оптимизация по памяти хранения штрафов. Мне кажется, если вынести вычисление штрафов и смириться с неоптимальным по памяти способом хранения, то алгоритм станет проще. Короче, этап первый, шаги. 1. Входные данные. Для наглядности пусть исходными данными будет текст. Текст легко разделить на список слов, метод split в помощь. Далее по списку слов легко сформировать список длин этих слов. 2. Создадим матрицу штрафов. Только назовем ее не ff, а costs, чтобы потом не вспоминать. 2.1 Создать матрицу размерности len(words)×len(words). 2.2 Заполнить все ячейки матрицы бесконечностями. math.inf подойдет. 2.3 Заполнить ячейки по правилу: если слова c i по j включительно умещаются в строке, то в ячейку costs[i][j] записать штраф для такого размещения. Примечание: для вычисления нам будет полезна вспомогательная функция calc_cost(words_lens, line_len), которая принимает список длин слов с i по j и максимальную длину строки и возвращает штраф. В вашем коде эта формула дублируется в нескольких местах, не надо так. Когда сформируете матрицу штрафов, вычислите ее для какого-нибудь примера вручную, сравните результаты. Потом можно будет посмотреть на получившийся код и обрести некоторую часть просветления. После этого можно будет двигаться дальше.
0
|
||
|
3 / 3 / 0
Регистрация: 07.01.2017
Сообщений: 101
|
|||
| 13.06.2019, 20:34 [ТС] | |||
|
Рекурсия. Рекурсия с мемоизацией. (полная версия в печатном варианте, работа со строками)
Входной текст состоит из слов с известными длинами (количеством символов) I1,I2, ..., In и представляет абзац. Его нужно "правильно отформировать" и вывести в несколько сток длинной M символов (M>=max Ii). Форматирование заключается в следующем. Если в строке размещаются слова с i-го по j-е, то между ними вставляется по одному пробелу и вычисляется остаток M j+i-(Ii+...Ij), который должен быть неотрецательным. Нужно минимизировать сумму кубов остатков по всем строкам, кроме последней. Ввод: Первая строка входного файла содержит число слов n и длину строки M. Вторая строка содержит длины I[1],I[2],...,I[n]. Вывод: минимум суммы кубов остатков по всем строкам, кроме последней. Структура решения - построчно в формате "индекс первого слова - индекс второго слова" расположенная разбивка текста на строки. Добавлено через 2 минуты Добавлено через 5 минут Теперь главное не накосячить, попробую сделать подобные действия.
0
|
|||
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
||
| 13.06.2019, 20:37 | ||
|
Небольшое лирическое отступление. В предыдущем посте я предложил чуть изменить подход и хранить штрафы в матрице. Я не знаю, насколько это критично в вашем случае. Возможно, это блокер, и тогда все дальнейшие шаги бессмысленны. Не потому что метод нерабочий, а просто потому что мне не хватает мозга отследить все происходящее в вашем коде и добавить туда формирование самого решения — т.е. диапазона слов для каждой строки.
0
|
||
|
3 / 3 / 0
Регистрация: 07.01.2017
Сообщений: 101
|
|
| 13.06.2019, 20:55 [ТС] | |
|
0
|
|
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
| 13.06.2019, 21:08 | |
|
Пока первый этап не готов, забегу чуть вперед.
Этап 2: поиск оптимального решения. Вот этот этап сложно комментировать. Просто потому что есть рекуррентная формула, которую нужно взять и аккуратно запрограммировать. В вашем коде это уже есть, но я его не проверял. Перепишу соотношение с учетом того, что мы нумеруем слова с нуля. Здесь: - optimal_cost(j) — функция вычисления штрафа за оптимальное расположение слов с 0 по j. - costs - матрица штрафов, вычисленная на этапе 1. Обратите внимание, что минимальный штраф вычисляется относительно всех предыдущих слов. Рекомендация: лучше использовать не функцию min, а написать условие со сравнением. Нам в него потом еще втыкать сохранение результата. В результате этого этапа у нас будет вычислен штраф для оптимального способа форматирования текста. Время остановиться, прорешать вручную, сравнить результаты. Этап 3: сохранение результата. Мало вычислить штраф для оптимального решения, нужно еще запоминать, какие конкретно слова мы использовали для его получения. Заводим список result, размер списка == количество слов. На предыдущем этапе у нас есть точка расширения: условие проверки, является ли решение для j слов с использованием i-того слова оптимальным. Вот и сохраняем result[j] = i. Я тут плохо объясняю на словах, но если весь код будет написан аккуратно, то там будет очевидно, что и куда воткнуть. Просто других подходящих мест не останется. Этап 4: вывод результата. Если честно, мне уже лень расписывать, какая структура данных получается в результате сохранения результата, и как с ней работать. Я уже кидал ссылку на готовое решение: https://www.geeksforgeeks.org/... lem-dp-19/. Там есть функция printSolution. Можно взять и немного изменить под свои потребности. Входная структура данных та же самая. Этап 5: мемоизация. Ну здесь халява. Заводим список, по размеру равный количеству слов. Заполняем бесконечностями. Когда вычислили штраф за оптимальное форматирование слов [0; j], в j-тый элемент массива записали этот штраф. В функции вычисления оптимального штрафа (optimal_cost) перед всеми вычислениями нужно сначала проверить: есть ли уже вычисленный результат в j-той ячейке. Если есть — вернуть его, и ничего больше не вычислять.
0
|
|
| 13.06.2019, 21:08 | |
|
Помогаю со студенческими работами здесь
20
Рекурсия Рекурсия Рекурсия с возвратом
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|