34 / 35 / 12
Регистрация: 04.03.2017
Сообщений: 444
|
||||||
1 | ||||||
Рекурсивный перебор элементов массива любой размерности31.03.2017, 17:59. Показов 7915. Ответов 9
Метки нет (Все метки)
Так долго вожусь и все равно ничего :
0
|
31.03.2017, 17:59 | |
Ответы с готовыми решениями:
9
Рекурсивный перебор. Вылет за границы массива Рекурсивный перебор директорий сервера Перебор элементов массива Рекурсивный подсчет суммы всех элементов массива |
31.03.2017, 20:21 | 2 | ||||||||||
RaevskiAnatoly, вообще, задачу можно было бы и словами описать, а так не очень понятно, что надо. Если предположить, что форич делает то, что обычно делают форичи, то можно как-то так.
0
|
138 / 138 / 53
Регистрация: 14.06.2016
Сообщений: 467
|
|
01.04.2017, 08:25 | 3 |
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
01.04.2017, 11:57 | 4 |
Надо просто пройтись по всем элементам и выполнить какое-то действие?
Для этого не нужна рекурсия, достаточно пройтись обычным форычем — он учитывает размерность массива.
0
|
01.04.2017, 14:25 | 5 | |||||
Сообщение было отмечено RaevskiAnatoly как решение
Решение
Есть подозрение, что сделать это надо именно рекурсивно без использования встроенных возможностей. Иначе - почему рекурсивно, а не циклом, например?
Можно сделать также, только вместо прямой индексации массива создать отдельный метод, который будет вычислять по прямому индексу (одномерному) индексы для каждого измерения. Метод также можно сделать рекурсивным, и не использовать циклы. Вот я пример набросал, там правда порядок обработки может показаться несколько неожиданным, но, насколько я понимаю задачу этот вариант выполняет
1
|
34 / 35 / 12
Регистрация: 04.03.2017
Сообщений: 444
|
|
01.04.2017, 17:02 [ТС] | 6 |
Действительно , главного не сказал , нужно чтобы объект передавался по ссылке в act , это я пробовал , но пришел к выводу что это невозможно.Поэтому я передаю в act объект-копию , а возвращаемое значение записываю в соответствующее место.Проблема только в том , что не получается пройтись по всему массиву запоминая позицию текущего элемента .
В названии же много сказано , не стал же бы я писать реализацию foreach неизвестно как и зачем? По сути хочу тоже самое (foreach) , но с доступом на запись.
0
|
34 / 35 / 12
Регистрация: 04.03.2017
Сообщений: 444
|
|||||||||||
01.04.2017, 17:37 [ТС] | 7 | ||||||||||
Отличный механизм ! Хоть я его и не понял , но он работает .
Я немного подправил код под себя и :
0
|
34 / 35 / 12
Регистрация: 04.03.2017
Сообщений: 444
|
||||||
01.04.2017, 18:18 [ТС] | 8 | |||||
Кстати , если есть то , чем код можно сократить и сделать его быстрей , то пожалуйста.
Не по теме: Я просто заливаю шлако-код в свою шлако-либу , а с помощью него очень легко решать задачки олимпиадные которые я якобы решить не могу своими ручками . Ну это такое мнение сложилось когда они пишут черти-что , а я одной строчкой через "встроенные возможности". Добавлено через 29 минут Хотя лучше , конечно , добавить пару перегрузок.
0
|
02.04.2017, 00:11 | 9 |
Основная функция имеет достаточно простой алгоритм, я думаю ее пояснять не нужно. Что до FillIndArray, то ее задача состоит в том, чтобы преобразовать один индекс в массив индексов. То есть, грубо говоря, если все элементы массива представить сложенными в одномерный массив, то их можно будет проиндексировать одним индексом, а функция просто вычисляет соответствующий этому индексу набору индексов многомерного массива. Реализации этой идеи могут быть разными, различия в основном в том, в каком порядке элементы многомерного массива выкладываются в одномерный массив. Как я все это реализовал будет проще понять, если вспомнить алгоритм перевода чисел в различные системы счисления. Число делится на основание системы и остатки вписываются в обратном порядке. Но там каждый разряд имеет одинаковое максимальное значение - на единицу меньше основания системы. В нашем же случае для получения очередного индекса надо делить на количество элементов в данном измерении и остаток и будет индексом для данного измерения.
Ну сократить радикально - вряд ли, что до "сделать быстрей", ну надо было изначально делать все циклами, а не рекурсией. Переписать все в виде циклов - не проблема, поскольку хвостовая рекурсия всегда может быть переписана в виде цикла(компиляторы функциональных языков делают это автоматически).
0
|
34 / 35 / 12
Регистрация: 04.03.2017
Сообщений: 444
|
||||||
02.04.2017, 09:31 [ТС] | 10 | |||||
Я и делал , но работало криво , переделал под рекурсию - тоже самое , но как я и думал , смог понять в чем проблема.Мне почему-то через рекурсию прозрачней , в отладке как-то проще.
Добавлено через 45 минут Просто удивительный механизм компиляции в #Develop - это же нужно как ухитриться , чтоб перекомпилировать лишь отдельные методы!Все думаешь в чем ошибка , в чем ошибка , прошелся отладкой по всем методам - нет ошибки! Получилось так :
0
|
02.04.2017, 09:31 | |
02.04.2017, 09:31 | |
Помогаю со студенческими работами здесь
10
Перебор одиночных элементов как массива Перебор элементов массива неизвестной величины Для указанной директории произвести рекурсивный перебор всех вложенных поддиректорий и файлов Из элементов массива С сформировать массив А той же размерности по правилу Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |