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

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

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

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

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

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

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

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

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


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

Добавлено через 13 минут
Дискуссию можно прекратить, придется использовать другой подход здесь.
0
 Аватар для RedPatrick
143 / 115 / 61
Регистрация: 13.01.2016
Сообщений: 305
17.11.2016, 13:24
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  [ТС]
RedPatrick, спасибо за ваше потраченное время.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.11.2016, 16:03
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru