Можно ли выполнить проверку того, что может быть неинициализированной переменной? - PullRequest
0 голосов
/ 02 апреля 2009

Я работаю над рекурсивным методом ...

public BinaryTree<T> TreeMirror ( BinaryTree<T> tree ) {
   BinaryTree mirror = new BinaryTree();
   mirror = clone(tree);
   ...
   TreeMirror(...)
   ...
} 

Я не хочу, чтобы метод mirror ссылался на отдельный объект BinaryTree на каждом рекурсивном шаге, и не повторял оператор mirror = clone(tree) после первой итерации. Мне интересно, можно ли поставить проверку if-оператора, чтобы увидеть, был ли уже инициализирован экземпляр mirror - в этом случае операторы mirror = new BinaryTree() и mirror = clone(tree) будут пропущены.

Я не думаю, что это возможно без передачи mirror в качестве аргумента в метод или определения его в определении класса ... но я хочу убедиться.

Любой совет очень ценится.

--------- EDIT -----------

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

Ответы [ 4 ]

2 голосов
/ 02 апреля 2009

Редко можно увидеть такие общедоступные рекурсивные функции. Лучшим решением может быть открытый метод, который создает объект, а затем вызывает рекурсивную частную функцию, которая просто вносит необходимые изменения.

Как правило, рекурсивная сигнатура функции трудно сопоставить с тем, что вы хотите показать своим клиентам.

1 голос
/ 02 апреля 2009

Переменная зеркала является локальной для метода и ВСЕГДА будет унифицирована в каждом вызове.

Передача mirror в качестве аргумента методу - очень хороший вариант.

РЕДАКТИРОВАТЬ: Если вы не можете изменить сигнатуру метода, можете ли вы создать закрытый метод и вызвать его для выполнения рекурсии?

0 голосов
/ 02 апреля 2009

Ответ Ури - лучший .... преобразовать его в закрытый метод и просто инициализировать зеркало, а затем вызвать закрытый (рекурсивный) метод, передавая зеркало в качестве параметра.

0 голосов
/ 02 апреля 2009

«Я не думаю, что это возможно без передачи зеркала в качестве аргумента в метод или определения его в определении класса ... но я хочу убедиться».

Правильно, это был бы один из способов сделать то, что вы хотите, поскольку зеркало не является инвариантом рекурсии.

Другой способ состоит в том, что ваш рекурсивный алгоритм клонирует только узлы, а не целые поддеревья.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...