Stefan_Lang
Я понятия не имею, на каком языке это должно быть, но я рискну предположить, что этот код может сделать:
1. "Что" - это имя функции, которая принимает один аргумент и возвращает некоторое значение
2. Судя по названию этой темы, x, вероятно, является двоичным деревом.
3. "If (X=null)", вероятно, относится к строчному параметру функции x - либо это опечатка, либо язык не зависит от регистра.
4. отступ вводит в заблуждение - это двойное вложенное if/else, последнее else должно быть отступом;
5. существуют вспомогательные функции left(..) и right (..), которые, вероятно, доставляют левую и правую ветви x соответственно.
6. Есть три возможных пути:
а) если x равно нулю, то результат равен -1
Б) если x не равно нулю и нет правой ветви, то результат рекурсивно вычисляется из чего(left_branch_of_x) и добавляется +1. В связи с этим возникает вопрос: для чего нужен +1?
в) Если x не равно нулю и существует правая ветвь, то результат рекурсивно вычисляется как сумма What() из обеих ветвей. Плюс 1.
7. интересным моментом в пункте 6 является то, что случай, когда левая ветвь является нулевой, не рассматривается: когда это произойдет, What() будет вызван с нулевым аргументом, что приведет к возвращаемому значению -1. На один уровень выше стека вызовов этот -1 нейтрализует +1 из суммирования, и возвращаемое значение будет результатом того, что() применяется к правой ветви.
8. Теперь давайте применим идеи из 6. и 7. в обратном направлении, от основания дерева:
а) на нижнем уровне и левая, и правая ветви равны нулю, поэтому результатом будет то, что(null)+1 = -1+1 = 0
Б) на один уровень выше мы имеем один из трех случаев: левая ветвь = null, правая ветвь = null, или обе ветви не являются null. Ветви, которые не являются нулевыми, дают 0 в качестве результата, поэтому возможные результаты уровня 1 таковы: (null)+1+0 = 0, если левая ветвь равна нулю, 0+1 = 1, если правая ветвь равна нулю, и 0+1+0 = 1, если обе ветви не равны нулю.
До сих пор остается в силе тезис о том, что результатом является число левых ветвей.
в) на уровне N мы имеем, опять же, три случая:
(1) левая ветвь=null -> результат равен -1+1+что(правая ветвь) = что(правая ветвь)
(2) левая ветвь не равна нулю, а правая ветвь равна нулю -> результат такой, что(левая ветвь)+1
(3) оба не нулевые -> результат-это то, что(левая ветвь)+1+что(правая ветвь)
Во всех трех случаях, если рекурсивный вызов функции What() выдает число левых ветвей, то результатом на этом уровне будет опять-таки число левых ветвей.
Результат: да, учитывая предположения от 1. до 5., эта функция вычисляет количество левых ветвей двоичного дерева.