Вообще, две переменные не обязательны, можно использовать только одну, разберитесь сами, как.
Вы не представляете, как это выглядит со стороны.
«Объясните, пожалуйста». — «Разбирайтесь сами».
-- Mon Aug 14, 2017 19:47:25 --Мне тоже было трудно понять код. На функциональном япе он выглядит элегантнее, потому что там разделены изменяемые и неизменяемые типы данных. Вообще императивность не добавляет ясности. Для сравнения привожу код на Standard ML:
datatype 'a tree_set = tip |
node of {value : 'a,
left : 'a tree_set ref, right : 'a tree_set ref};
fun add a =
let fun loop t =
case ! t of
tip => (t := node {value = a,
left = ref tip, right = ref tip};
true)
| node n => if a < #value n then loop (#left n)
else if a > #value n then loop (#right n)
else false
in loop end
В узле дерева лежат не просто поддеревья, а ячейки («ref»), содержащие поддеревья. Содержимое ячеек менять можно, компоненты узла дерева менять нельзя. Функция «add» находит ячейку, которая должна содержать «a». Если эта ячейка содержит «tip» (аналогичен «None» в Python), тогда заменяем её содержимое на новый узел, содержащий «a». В Python метод «add» находит некий «last_node». Так вот, та ячейка, которую находит функция «add» в Standard ML, соответствует правому или левому компоненту «last_node». Какому именно компоненту, определяется последним «if». Этот «if» лишний с точки зрения Standard ML.
В Standard ML можно манипулировать ячейкой. Аналогичный код можно написать на C, в качестве ячейки будет указатель на компонент узла дерева. В Python так сделать нельзя, потому что в Python сборка мусора автоматическая, и для сборщика мусора нужно, чтобы каждый указатель указывал на целый объект кучи, а не на его компоненты.