Я переношу с C на Java, и у меня возникают трудности с рекурсией, особенно потому, что в Java вы не можете передавать аргумент по ссылке.Java Recursion - альтернатива передаче по ссылке:
Что я ищу, это не решение/трюк, чтобы заставить Java передать аргумент по ссылке, но рекомендуемый способ решить такую проблему на Java.
Давайте рассмотрим вставку рекурсивного узла в бинарном дереве:
void nodeInsert(Node n, int a) {
if (n == null)
n = new Node(a);
...
}
В С, к концу выполнения, узел n
в дереве будет указывать на вновь созданный узел. В Java, однако, n
по-прежнему будет null
(поскольку n передается по значению).
Что такое предлагаемый подход Java для таких проблем? Некоторые подходы я уже пробовали:
- Использование статического объекта для отслеживания родителя (вопрос усложняет при использовании дженериков).
- Передача родительского узла как часть функции. Он работает, но немного усложняет код и не выглядит хорошим решением.
- Создание дополнительного элемента, указывающего на родительский узел, но это не является хорошим решением, так как оно увеличивает пространство, необходимое для O (n);
Любые советы приветствуются.
Вы считаете, что возвращаете узел: 'Node nodeInsert (Node n, int a)'? Или вам нужно вернуть НИЧЕГО - не можете ли вы просто создать узел и добавить его в свой список или дерево внутри 'insertNode()'? Почему, по-вашему, вам нужен «выходной параметр»? – paulsm4
Этот подход может работать действительно, но не может ли он превзойти цель рекурсии, которая заключается в решении базового случая (в этом примере, когда узел является нулевым)? –
Если это сработает, значит он соответствует цели. – ajb