|
0 / 0 / 0
Регистрация: 10.04.2015
Сообщений: 105
|
|||||||||||
Рекурсивная функция15.09.2015, 14:07. Показов 1033. Ответов 12
Метки нет (Все метки)
Добрый день форумчане
Ниже в коде есть рекурсивная функция static void engine(int i,int k,int roads[]) Цель данной функции проверить всевозможные варианта данного алогоритма. Проверяя определенное разветления она обычно натыкается на тупик и через break функция останавливается. Проблема в том, что она не хочет после определеного тупика пойти другим путем и проверить другой вариант и т. д. Цель данный функции - получить значение параметра i равно 11, а параметре к количество проходов или количество вызвов данной функции пока не получется 11. Input для данной функции примерно такой
В данном коде она остановливатеся где-то на 3-4 проходе, то есть она почему-то не хочет вернуться в определенную точку и пойти другим путем (допустим есть три возможности, она дожна проверить первую до конца, то есть до момента, когда будет тупик и после этого никак не хочет вернуться и пойти уже по второму пути, не говоря же о третьем) Заранее всем спасибо!
0
|
|||||||||||
| 15.09.2015, 14:07 | |
|
Ответы с готовыми решениями:
12
Рекурсивная функция для вычисления суммы платежа кредита за месяц Рекурсивная функция для вычисления наименьшего общего делителя двух натуральных чисел(применяю Алгоритм Евклида) Рекурсивная функция у меня другая но только не рекурсивная |
|
0 / 0 / 0
Регистрация: 10.04.2015
Сообщений: 105
|
|
| 15.09.2015, 15:04 [ТС] | |
|
Пошагово прошел я по всему коду. Дело в том что я немного не понимаю понимаю сам принцип работы рекурсивной функций. В самой рекурсивной функции есть 5 точек где это функция сама себя вызывает ( конечно через IF)
Пример: engine() 1) if - engine() 2) if - engine() 3) if - engine() 4) if - engine() 5) if - engine() Допустим в данном случаи можно заити и в первый и во второй if. Функция заходит в первый в силу того что он первый доходит до точки где она прерывается и не проверяет вторую ветку то есть второй if. Или еще может быть так: заходит в первый if - потом 2 потом 3 - тупик. Возвращается ко второму 2 и заидет в 4 так была такая возможность. Но это максимум. Так чтобы проверить все варинты не получается. То есть от силы проверить 3-4 варианта и где-то застрянит.
0
|
|
|
0 / 0 / 0
Регистрация: 01.09.2015
Сообщений: 2
|
|
| 15.09.2015, 22:55 | |
|
Попробуй свои if вложить друг в друга.
0
|
|
|
0 / 0 / 0
Регистрация: 10.04.2015
Сообщений: 105
|
|
| 15.09.2015, 23:16 [ТС] | |
|
На примере кода как это сделать ? Приведи пример
0
|
|
|
0 / 0 / 0
Регистрация: 01.09.2015
Сообщений: 2
|
|
| 15.09.2015, 23:45 | |
|
if(){
if(){ if(){ else{ } } } } Таким образом ты будешь погружаться в рекурсию ровно настолько, насколько тебе будет нужно.
0
|
|
|
0 / 0 / 0
Регистрация: 10.04.2015
Сообщений: 105
|
|
| 16.09.2015, 00:08 [ТС] | |
|
Давай возьмем конкретно данную функцию. Структура у нее такая
engine(){ if(){ if() engine() if() engine() } if(){ if() engine() if() engine() if() engine() } } какой и куда if влаживать ?
0
|
|
|
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
|
|||
| 16.09.2015, 07:15 | |||
|
Ответишь на вопросы, можно будет поговорить о том, как можно переписать твоё решение.
0
|
|||
|
0 / 0 / 0
Регистрация: 10.04.2015
Сообщений: 105
|
|
| 16.09.2015, 08:49 [ТС] | |
|
Aleksandy првет !
Вот сообственно и задача: Мне необходимо решить вот такую интересную задачу. Есть 11 полос по которым движется автомобили (авто обозначено $). Длина полосы не принципиально так как мы видим только ту часть где есть пешеход. На полосе всегда есть непрерывное движение авто. Крестиком (+) обозначено место где авто будет после скажем одного хода. На первой полосе автомобили двигаются с скоростью 5 на второй 5+1 и т.д. расстояния между авто 17 пробелов на первой полосе, на второй 17+1 и т.д. Как только автомобиль уходит с полосы следующий появляется таким образом есть непрерывный поток авто. На Рис 1 видно, как расположено все авто и после одного хода на Рис 2 видно изменения. На рисунке 2 видно, что там, где был крестик на Рис 1 теперь стоит авто, также новые авто появляются с конца Задача состоит в следующем: Есть пешеход (@) который изначально находится в левов верхнем углу. Он должен дойти до последней полосы. У него всегда есть три возможности 1) Остаться на месте, 2) либо спустится на одну полосу вниз или 3) подняться на одну полосу вверх. Если возьмём рис 1 и рис 2 то получается, что он спустился вниз хотя изначально можно было остаться и на первой полосе. Надо написать метод скорее всего рекурсивный а может и нет, я толком сам не знаю который просчитает сколько ходом надо сделать чтобы пешеход дошел до последней полосы, то есть в каждый момент функция должно перебрать все возможности вверх/остаться на месте/вниз если конечно возможно все варианты. При случае когда нет выхода то просто должна вывести сообщение что нет выхода. Для того чтобы запомнить ближаишие машины к пешеходу выше в коде есть масив интов там я запиминаю координаты машин(roads=new int[11] ![]() Функция move() как бы двигает все машины один раз в сторону пешехода(все сразу по всем 11 полосам), одним словом перезаписываю новые координаты машин. Теперь нужна та самая фукция которая скажет за сколько минимальных ходов пешеход проидет все 11 полосы( то есть перейдет дорогу в 11 полос). Допустим для inputa 1 13 18 18 5 1 10 4 13 21 1 19 ответ будет 50.То есть это минимум. Конечно функция возможно наидет несколько вариантов допустим 85 76 53 и 50 , но 50 это мимнимум и это и есть ответ. 50 это получается что пешеход неодкратно поднимался обратно в какойто ситуации( то есть был например на 4 полосе и переити на 5 нельзя так как там будет машина а на 4 остаться тоже не получется так тоже будет машина а вот на 3 можно будет выжить таким образом он вовращается обратно на 3 полосу а этот ход тоже ++1 и вот из таких ходов и состовлятся 50) тут 1 это просто номер ситуации 13 это расположение машины на первой полосе 18 на второй плосе 18 на третей и тд C Уважением я! Рис1. @ - - - - - - + - - - - $ - - - - - - - - - - - - + - - - - $ - - - - - - - - - - - - - - - - - - - - + - - - - - $ - - - - - - - - - - - - + - - - - - $ - - - - - - - - - - - - - + - - - - - - $ - - - - - - - - - - - - + - - - - - - $ - - - - - - $ - - - - - - - - - - - - + - - - - - - - $ - - - - - - - - - - - - - - $ - - - - - - - - - - - - + - - - - - - - - $ - - - - - - - - - - - - - - - - - - - - - - - - - - $ - - - - - - - - - - - - + - - - - - - - - - $ - - - - - - - - - - $ - - - - - - - - - - - - + - - - - - - - - - - $ - - - - - - - - - - - - - - - - - - - - - - - - $ - - - - - - - - - - - - + - - - - - - - - - - - $ - - - - - - - - - + - - - - - - - - - - - - $ - - - - - - - - - - - - - - - - - - - $ - - - - - - - - - - - - + - - - - - - - - - - - - - $ - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - $ - - - - - - - - - - - - - - - - - - - - - Рис2. - - + - - - - $ - - - - - - - - - - - - + - - - - $ - - - - - - - - - - - - - - @ - - - - + - - - - - $ - - - - - - - - - - - - + - - - - - $ - - - - - - - - - - - - + - - - - - - $ - - - - - - - - - - - - + - - - - - - $ - - - - - - - - - - - - - - - - - - + - - - - - - - $ - - - - - - - - - - - - + - - - - - - - $ - - - - - + - - - - - - - - $ - - - - - - - - - - - - + - - - - - - - - $ - - - - - - - - - - - - - - - - + - - - - - - - - - $ - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - $ - - - - - - - - - - - - - - - - - - - - - - - $ - - - - - - - - - - - - + - - - - - - - - - - - $ - - - - - - - - - - - - - - - - - - - - - $ - - - - - - - - - - - - + - - - - - - - - - - - - $ - - - - - - - - - - - - - - - - - - - $ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $ - - - - - - - - - - - - + - - - - - - - - - - - - - - $ - - - - - - - -
0
|
|
| 16.09.2015, 08:53 | |
|
Не по теме: много букв
0
|
|
|
0 / 0 / 0
Регистрация: 10.04.2015
Сообщений: 105
|
|
| 16.09.2015, 09:00 [ТС] | |
|
Кстати пытался я решить эту задачу и подругому, то есть в двухмерном массиве char [][] себе рисорвал все полосы ,пешихода и машины и смотрел что и куда все движется
Но это кажется излишне. В итоге все закончилось тем что рабочую рекурсивную функцию так и не смог написать.Ниже есть ссылка на этот код. Код что выше конечно не такой обемный.http://ideone.com/moeV3U C Уважением я!
0
|
|
|
636 / 528 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
|
||
| 17.09.2015, 13:09 | ||
|
Считаем, что движение справа-налево. На полосе на текущем шаге 2 машины. На следующем шаге левая машина уезжает за пределы видимости, справа от второй места для выполнения правила (17 + n + 1, где n - индекс дороги) недостаточно. Первая машина должна респауниться в правой части полосы? Тебе нужно вывести формулу для вычисления положения машин на шаге N+1. Далее алгоритм такой: 1. считаем положение машины на следующей от пешехода полосе 2. если свободно, то пешеход вниз, переход на шаг 1, иначе шаг 3 3. считаем на текущей 4. если свободно, то пешеход на месте, переход на шаг 1, иначе шаг 5 5. считаем на предыдущей 6. если свободно, то пешеход назад, переход на шаг 1, иначе В общем, это не шахматы, тут думать надо, а мне лень. Т.ч. составляй мат. модель. Потом будем думать дальше.
0
|
||
|
0 / 0 / 0
Регистрация: 10.04.2015
Сообщений: 105
|
|
| 17.09.2015, 14:26 [ТС] | |
|
Aleksandy привет !
Возьму все по порядку. Если возьмем первый код то в принципе вторая машина мне не нужна. Ведь есть массив целочисленных значении (int [11])который сохраняет позицию ближайшей машины к пешеходу по каждой полосе. Поэтому где вторая машина просто не нужно знать когда впереди есть первая которая еще на полосе. Как только первая машина вылетает с полосы сразу появляется в массиве координата второй машина которой в принципе и становится первой. Движение машин по полосам и вычисление каждый раз координаты ближайшей машины осуществляется с помощью функции move(); Теперь хотелось бы разбить задачу на части и поэтапно посмотреть алгоритм. 1. Первая функция fillTRoads(); просто заполняет тот самый массив координат( то есть сохраняет позицию каждой машины на каждой полосе. Она работает и к ней вопросов нет. 2. Функция move(); двигает все все машины в сторону пешехода и каждый раз просто регистрирует новые координаты только самой ближайшей машины к пешеходу. Данная функция свое дело делает и к ней вопросов тоже нет. Кстати при таком подходе вторая машина после первой на каждой полосе проста не интересна так как она пока в процессе не участвует. 3. Функция Print(); тут ничего особенного, она так только для проверки чтобы посмотреть на консоли что там творится с кодом . Конечно без нее можно и обойтись 4. Теперь четвертая ,последняя и самая главная функция(engine() из за которой я написал эту тему на форуме и которая не работает . Она в принципе должна выполнить все те пункты на которые вы указали , то есть 2 по 5. С ней мне и нужна помощь.Что она делает ? Она рекурсивная и в качестве параметра принимает тот самый массив координат где хранятся координаты машин и две переменные (на какой полосе находится пешеход, и количество проходов, то есть счетчик) Функция имеет две части Первая это для случая когда пешеход только начинает переходить полосы то есть он находится на первой полосе То есть I=0 в этой позиции у него теоретически две возможности (либо остаться на первой либо спустится на вторую полосу, то есть отстать и вниз) Вторая часть функции это когда пешеход находится на любой кроме первой полосы и в таком случаи у него есть теоретически три возможности (Вверх/остаться где был/и спустится вниз) Из все этого следует что у функции такая структура Engine(){ Eсли i=0 то тогда у него два варианта Остаться-и рекурсия Спустится вниз и рекурсия Если i!=0 то тогда у него три варианта Поднятся и рекурсия Остаться-и рекурсия Спустится вниз и рекурсия То есть 5 веток две для ситуации для i=0 и три для ситуации когда i=!0. В каждой ветки есть функция которая двигает машины + рекурсия ну и еще счетчик позиции пешехода. Если внимательно посмотреть на на функцию engine то все в ней это есть. Вопрос в другом что она , функция не заходит во все возможные варианты. Пример: Допустим пешеход начал свое движение вниз и он на самой первой полосе. И также допустим у него есть возможность остаться на первой полосе а также и спустится вниз. В силу того что первый if который проверяет если он может остаться там где находится то функция тут и провалится в эту рекурсия и кстати будет работать пока не наткнется на тупик. Также что интересно вернется скажем так обратно и начнет проверять вариант когда пешеход сразу спускается вниз(то есть сработает второй if) вот тут где то и застрянет( то есть в какой момент когда дойдёт до тупика не захочет вернутся обратно и пойдёт по другой ветке). Вот тут и нужно мне помощь. Что с ней не так и почему она не прокручивает все варианты а останавливается в какой-то момент . Вся подготовительная работа типа заполнить полосы/двигать машины/вести учет где пешеход / учет количество проходом и тд все это есть. Главное это как прокрутить все возможные варианты и найти минимальное количество шагов что вроде тоже забито в данной функции. В любом случаи спасибо тебе за твое время С ув Я,
0
|
|
| 17.09.2015, 14:26 | |
|
Помогаю со студенческими работами здесь
13
Рекурсивная функция Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|