Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
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 для данной функции примерно такой

Code
1
2
1
13 18 18 5 1 10 4 13 21 1 19
В принципе, нужна помощь в том, чтобы она прошлась по всем вариантам.

В данном коде она остановливатеся где-то на 3-4 проходе, то есть она почему-то не хочет вернуться в определенную точку и пойти другим путем (допустим есть три возможности, она дожна проверить первую до конца, то есть до момента, когда будет тупик и после этого никак не хочет вернуться и пойти уже по второму пути, не говоря же о третьем)

Заранее всем спасибо!

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import java.util.Scanner;
public class CrossingTR {
    static Scanner sc;
    static int roads[];
    static int distance;
    static int speed;
    
    CrossingTR(){
        sc=new Scanner(System.in);
        roads=new int[11];
        distance=17;
        speed=5;
    }
    
    static void fillTRoads(){
        for(int i=0;i<11;i++){
            roads[i]=sc.nextInt();
        }
    }
    
    static void print(){
         for(int i=0;i<11;i++){
                 System.out.print(roads[i]+" "); 
             }
             System.out.println();
         }
    static void move(int []roads){
        
        for(int i=0;i<11;i++){
            int s=speed+i;
            int d=distance+i;
            if(roads[i]-s>=0)roads[i]=roads[i]-s;
            else roads[i]=d-roads[i];
        }
        
        for(int i=0;i<11;i++){
             System.out.print(roads[i]+" "); 
         }
         System.out.println();
    }
    
    static void engine(int i,int k,int roads[]){
        int roads1[]=new int[11];
        for(int s=0;s<11;s++){
            roads1[s]=roads[s];
        }
        
        do{
            ++k;
            if(i+1==11){System.out.println(k+" "+"result");break;}
            if(i==0){
                if(roads1[0]-speed>0){
                     move(roads1);
                     engine(i,k,roads1);}
                if(roads1[1]-speed-1>0){
                     move(roads1);
                     i++;
                     engine(i,k,roads1);}
                if((roads1[1]-speed-1<=0)&&(roads1[0]-speed<=0))break;
            }else{
                if(roads1[i]-speed-i>0){
                     move(roads1);
                     engine(i,k,roads1);}
                 if(roads1[i+1]-speed-(i+1)>0){
                     move(roads1);i++;
                     engine(i,k,roads1);}
                 if(roads1[i-1]-speed-(i-1)>0){
                     move(roads1);
                     i--;
                     engine(i,k,roads1);}
                 if(roads1[i]-speed-i<=0&&roads1[i+1]-speed-(i+1)<=0&&roads1[i-1]-speed-(i-1)<=0)break;
             }
 
        }while(true);
        
    }
    public static void main(String[] args) {
        CrossingTR CR = new CrossingTR();
        int a  = sc.nextInt();
        System.out.println();
        for(int i=0;i<a;i++){
            fillTRoads();
            print();
            engine(0,0,roads);
        }
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.09.2015, 14:07
Ответы с готовыми решениями:

Рекурсивная функция для вычисления суммы платежа кредита за месяц
package alg; public class func { public static double plateg(int n) { int s=100000; double i=0.0083; double k; ...

Рекурсивная функция для вычисления наименьшего общего делителя двух натуральных чисел(применяю Алгоритм Евклида)
Привет,помогите разобраться с заданием.Нужно было разработать и испытать рекурсивную функцию для вычисления наименьшего общего делителя...

Рекурсивная функция у меня другая но только не рекурсивная
Добрый день все ! Писал я про задачку но так и не кто откликнулся напомню о чем речь &quot; Добрый день форумчане! Мне...

12
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
15.09.2015, 14:38
Тут врят ли кто-то сможет вникнуть в эту лапшу. Советую воспользоваться отладчиком и пройтись пошагово по вашему алгоритму.
1
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
Цитата Сообщение от VladV Посмотреть сообщение
Цель данной функции проверить всевозможные варианта данного алогоритма.
Цитата Сообщение от VladV Посмотреть сообщение
Цель данный функции - получить значение параметра i равно 11, а параметре к количество проходов или количество вызвов данной функции пока не получется 11.
Что за алгоритм? И как именно такие результаты должны получиться?

Ответишь на вопросы, можно будет поговорить о том, как можно переписать твоё решение.
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
Цитата Сообщение от Паблито Посмотреть сообщение
много букв
+1

Считаем, что движение справа-налево. На полосе на текущем шаге 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.09.2015, 14:26
Помогаю со студенческими работами здесь

Рекурсивная функция
Нужна помощь в выполнении данного задания: Даны первый член и знаменатель геометрической прогрессии. Написать рекурсивную функцию для...

Рекурсивная функция
Программа для умножения целых чисел М на N.Умножение заменить сложением.

Рекурсивная функция
Вот такое вот условие: http://s004.***********/i205/1001/66/c65900a28ea2.jpg Программа должна представлять собой консольное...

рекурсивная функция
Составить программу с рекурсивною функцией n!+m! де n=4,m=6.

Рекурсивная функция
...помогите пожалуйста сделать задачки... http://cs4734.vkontakte.ru/u26212689/96588963/x_20024bb4.jpg ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
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
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru