Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
2 / 2 / 5
Регистрация: 28.06.2015
Сообщений: 81
1

Инкремент переменной в рекурсии

17.11.2016, 10:24. Показов 1355. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте форумчане, что то не приходит идея как сделать в рекурсивном методе переменную, чтобы на следующем входе в функцию она не сбрасывала свое значение. Ведь в Java переменные, объявленные внутри метода должны иметь начальное значение. Так же у меня нет возможности выносить эту переменную в поле класса. Есть вариант как поступить ?

Java
1
2
3
4
public int nestingLevel(SomeObject object){
   int nestingCounter = 0; //вот тут получается при рекурсивном заходе она 
                                   //заново получит начальное значение. 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.11.2016, 10:24
Ответы с готовыми решениями:

Инкремент в рекурсии
Ребят, что-то не могу врубиться. Задача: используя рекурсию выводить введенный ранее текст в...

Инкремент переменной
в задании сказано, что пользователь вводит строку и программа выводит ее, но если пользователь...

Инкремент переменной
Всем привет! Есть такой код: <div class="box"> <?php $moveCounter = 0; ...

Инкремент значения переменной
Уважаемые форумчане, разъясните пожалуйста ответ компилятора int i = 3; int y = ++i +...

9
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
17.11.2016, 10:27 2
Вам нужно задуматься об изменении архитектуры. А именно, нужно ли вам иметь эту переменную именно в методе.
1
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 897
17.11.2016, 10:43 3
ну передавайте ее вторым параметром в вашу функцию, и при рекурсивном вызове вызывайте функцию как: (i +1). ну а внутри метода можете ее копировать:
Java
1
x = a;
где a - передаваемый параметр, x - поле метода.
1
143 / 115 / 61
Регистрация: 13.01.2016
Сообщений: 305
17.11.2016, 10:47 4
Willyams, может быть вам нужно что-то вроде этого?
Java
1
2
3
4
public int nestingLevel(SomeObject object, int nestingCounter){
           // do something
        return nestingLevel(object, nestingCounter - 1);
        }
HighPredator, были бы интересны Ваши комментарии, стоит ли так делать, и если нет, то почему.
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
17.11.2016, 10:56 5
Для начала нужно узнать вообще с чем имеем дело. Увидеть код, или хотя бы узнать что он вообще делает и какой физический смысл у обозначенной переменной.
0
2 / 2 / 5
Регистрация: 28.06.2015
Сообщений: 81
17.11.2016, 11:07  [ТС] 6
К сожалению код я не могу показать, могу прибегнуть только к абстракции.Мне нужно узнать уровень вложенности объекта. У объекта может быть родитель, если родитель есть мы входим в рекурсию и инкрементим переменную. Пока что для теста я прибегнул к методу, который посоветовал minore, хотелось бы как то украсить сущесвующий код, но по ходу тут я встаю в тупик.


Проблема встает в уродливом коде вызова
Java
1
nestingLevel(someObject, 0)
.
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
17.11.2016, 11:16 7
Цитата Сообщение от Willyams Посмотреть сообщение
Мне нужно узнать уровень вложенности объекта.
Что это значит?
Цитата Сообщение от Willyams Посмотреть сообщение
У объекта может быть родитель, если родитель есть мы входим в рекурсию и инкрементим переменную
И это поподробнее. Попробуйте я не знаю схематично как-то описать.
0
2 / 2 / 5
Регистрация: 28.06.2015
Сообщений: 81
17.11.2016, 11:36  [ТС] 8
Проблема стоит в том, что объекты на одном уровне не могу иметь одинаковых имен. Это не касается сейчас наследования. Просто объект child создается и получает какие-то свойства от родителя. Мне нужно запретить создание объектов на одном уровне с одинаковыми именами. К примеру есть корневой объект "qwe", у него мы создаем под-объект "qwe"/"qwe1" и мне нужно провалидировать создание нового объекта с именем либо "qwe", либо если у нас уже есть рутовый объект и у него мы создаем "newRoot/qwe1" - это должно спровоцировать ошибку.

Добавлено через 13 минут
Дискуссию можно прекратить, придется использовать другой подход здесь.
0
143 / 115 / 61
Регистрация: 13.01.2016
Сообщений: 305
17.11.2016, 13:24 9
Willyams, смотрите, я бы сделал так: в классе делаете поля "предок" и Map"наследники". Делаете приватный конструктор, чтобы было невозможно прямое создание объектов.
Делаете статический объект, который будет предок всем "корневым объектам", в него добавляете объекты статическим методом. В свою очередь каждый объект-потомок создается также, только уже не статическим методом.
Ну и конечно модификаторы доступа для полей делайте private, тут мне лень было))
Кликните здесь для просмотра всего текста
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
import java.util.HashMap;
import java.util.Map;
 
public class Main  {
 
    public static void main(String args[]) {
        System.out.println(Entity.createRootEntity("qwe")); // создали первый объект
        System.out.println(Entity.createRootEntity("qwe")); // уже есть в корне, не удалось создать
        System.out.println(Entity.createRootEntity("asd")); // создали второй объект
        Entity e = Entity.getRoot.get("asd");
        System.out.println(e.createAncestor("firstAncestor")); // создали потомка у второго объекта
        System.out.println(e.createAncestor("firstAncestor")); // уже есть потомок с таким имененем, результат - false
        System.out.println(e.children.get("firstAncestor").createAncestor("SecondAncestor")); // создаем еще потомка
        Entity ancestor = e.children.get("firstAncestor").children.get("SecondAncestor");
        System.out.println(ancestor.getGrade(ancestor)); // 3
    }
    
}
 
class Entity {
    //родительский объект, до него не будет доступа, но он будет держать все корневые объекты
    private static Entity nullEntity = new Entity("nullEntity", null);
    
    String name = null;
    Entity parent = null;
    //наследники
    Map<String, Entity> children = null;
    
    // приватный конструктор, чтобы нельзя было создать объект извне
    private Entity(String name, Entity parent){
        this.name = name;
        this.parent = parent;
        children = new HashMap<String, Entity>();
    }
    
    // создать корневой объект(статический). Вернет false если имя уже существует
    public static boolean createRootEntity(String name){
        if (nullEntity.children.containsKey(name)) return false;
        else nullEntity.children.put(name, new Entity(name, nullEntity));
        return true;
    }
 
        // получить корень объектов
        public static Map<String, Entity> getRoot(){
              return rootEntity.children;
        }
    
    //создать потомка (уже для объекта)
    public boolean createAncestor(String name){
        if (this.children.containsKey(name)) return false;
        else this.children.put(name, new Entity(name, this));
        return true;
    }
    
    public int getGrade (Entity e){
        if (e.parent == nullEntity) return 1;
        else return 1 + getGrade(e.parent);
    }
}
1
2 / 2 / 5
Регистрация: 28.06.2015
Сообщений: 81
17.11.2016, 16:03  [ТС] 10
RedPatrick, спасибо за ваше потраченное время.
0
17.11.2016, 16:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.11.2016, 16:03
Помогаю со студенческими работами здесь

Инкремент переменной префаба
Пытаюсь инкрементировать переменную, которая в скрипте EnemyScript, который в префабе Enemy.. ...

Странно работает инкремент переменной
Делаю скрипт-викторину, фронтэнд представляет из себя таблицу в 4 столбца, первый-название,...

Некоректный инкремент переменной цикла for при сравнении элементов массива
Нашёл проблему в коде, но никак не могу догнать, в чём дело. #include &quot;stdafx.h&quot; #include...

Инкремент переменной между потоками без atomic, с использованием mutex
Есть такой код: #include &lt;iostream&gt; #include &lt;mutex&gt; #include &lt;thread&gt; std::mutex mu;


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru