2015-05-08 14 views
2

Возможно ли создать переменную, уникальную для этого уровня рекурсии, чтобы все, что с ней происходило, останется таким, независимо от любого другого рекурсивного шага? И можно ли это сделать так, чтобы я мог получить значение в переменной на каждом рекурсивном шаге после завершения рекурсии?Есть ли способ создать уникальную переменную с каждой рекурсией?

Позвольте мне использовать пример для визуализации проблемы. Скажем, у меня есть дерево. Я хочу записать уровни глубины каждого узла и организовать его так, чтобы все узлы на каждом уровне глубины были объединены в один и тот же массив или список. Поэтому для каждого уровня глубины понадобится другой массив/список.

Я рекурсивно обхожусь по дереву. В начале каждой рекурсии я создаю новый список. Это одна и та же строка, поэтому каждая рекурсия создает переменную списка с тем же именем. Я обрабатываю узел по глубине X. Я добавляю этот узел в список, затем продолжаю (рекурсивно) дочерний узел на глубине X + 1. Я добавляю этот дочерний узел в новый список. Итак, и так далее, пока все узлы в дереве не будут принадлежать некоторому списку.

После завершения рекурсии я ожидаю, что количество списков будет равно высоте дерева (1 список на глубину, содержащий все узлы на этой глубине) и способ доступа ко всем узлам во всех списки.

Возможно ли это?

+0

Что относительно 'timestamp' – Rustam

+0

Локальная переменная в рекурсивном методе была бы уникальной для этого конкретного вызова. –

+0

akhil, боюсь, что в вашем случае переменная в предыдущей рекурсии была бы переписана или потеряна каким-то образом. Я прав, думая об этом? – Manuel

ответ

1

Сохраните значения в списке, добавив каждое новое значение в список. Индексом значения в списке будет глубина рекурсии, на которой было добавлено значение.

1

Возможно, вам понадобится Map<Integer, List<?>>, где ключ - это глубина, а значение - это список, в который помещаются предметы для этой глубины. Map - самый общий объект здесь, потому что он может использоваться в первом или первом поиске.

Это Map должно быть либо частью рекурсивной сигнатуры метода, либо переменной экземпляра, доступной из рекурсивного метода.

1

Вы не знаете, сколько уровней у вас есть, поэтому вы не можете сделать списки до этого. Но вы можете использовать карту. Например, Map<Integer,List<Node>>. Передайте его рекурсивной функции и используйте текущий уровень как ключ.

В конце концов вы будете иметь карту как:

1: список узлов

2: список узлов

....

0

В рекурсии вы не узнайте свой «уровень рекурсии», но вы можете легко получить карту Map<int, List<...>, которая доступна, например как аргумент вашей рекурсии, где вы можете сохранить список узлов для каждого уровня.

1

Вы можете поддерживать внутренний метод local variable, который останется прежним!

Рассмотрим простой пример Факториал С рекурсии

public int calculateFactorial(int number){ //User will call this method 
    return factPreservingOriginalValue(number,number); 
     | 
     | 
     -----> Internally you call a method to maintain original value 
} 

Другой метод

public int factPreservingOriginalValue(int orig,int number){ // orig will remain same 
      if(number==0) 
       return 1; 
      return number*factWithTempVariable(orig,number-1); 
} 

Вы можете использовать эту orig value знать глубину в любой момент времени при обходе дерева

0

Вы можете использовать POJO:

  • Создать новый Java Bean объект в начале рекурсии
  • магазина вашего уникальное значение рекурсии
  • Добавить этот объект в список в конце рекурсии
  • Список процессов по мере необходимости после рекурсии завершения