2009-04-02 2 views
0

Я работаю над рекурсивным методом ...Возможно ли выполнить проверку того, что может быть неинициализированной переменной?

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

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

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

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

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

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

ответ

1

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

Передача зеркала в качестве аргумента метода является очень хорошим вариантом.

EDIT: Если вы не можете изменить подпись метода, можете ли вы создать частный метод и вызвать его для выполнения рекурсии?

0

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

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

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

2

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

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

0

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