Поскольку temp
- это , в данном случае корневое значение.Не волнуйтесь, это единственное, что вам нужно понять, чтобы понять саму рекурсию.
Отличная возможность понять функциональность вашего кода - использовать отладчик.Установите точку останова для вызова функции, и вы сможете пройтись по программе, наблюдая, как меняются переменные.
Помимо этого, давайте посмотрим на ваш код.
Важно отметитьзаключается в том, что всякий раз, когда вы вызываете ваш sortedLists(first, second, temp);
, указатель будет входить в него до тех пор, пока функция не завершится (например, когда он вернет temp).Вы будете вызывать эту функцию несколько раз, так как программа продолжит работу, поэтому она углубится в свою собственную функцию.Затем он переносит информацию шаг за шагом до уровня, пока не завершится первый вызов sortedLists(first, second, temp);
, и это будет в вашем основном методе Node result = sortedLists(n1, n2, s1.root);
Я постараюсь согласиться с вашим примером:
Node result = sortedLists(n1, n2, s1.root);
, вызываемый в методе main()
.Таким образом, корень равен 0, и у вас есть ваши узлы 10 и 5,15.
При первом вызове sortedLists()
temp становится 5, а second
теперь несет 15, потому что first.data > second.data
.
СЕЙЧАС Вы вызываете метод sortedLists()
снова, но с новыми значениями: корень теперь 5, первый остается 10, а второй 15. Мышаг внутри функции и начните с новых значений:
- из-за
first.data < second.data
, temp становится 10, сначала ноль. - и снова:мы позвонили на
sortedLists()
.Мы передаем значения: first = null second = 15 root = 10
в функцию и идем на один шаг глубже. - , поскольку
first
теперь равно нулю, temp.next
будет second
(15) - temp теперь выглядит так: 10-> 15, и мы возвращаемся.(это первый раз, когда
sortedLists()
завершается!)
- Теперь мы вернулись сюда и можем перейти к
root.next = temp;
Помните, какой темп был в этом контексте?Temp был 10, но он был обновлен функцией выше.Новый temp
равен 10-> 15, поэтому наш root
выглядит следующим образом: 5-> 10-> 15. - Затем вы печатаете заголовок temp, который равен 10. Эта функция также завершается.
Теперь мы вернулись к нашему первому вызову и посмотрим, что произойдет: в 3.3 мы обновили его корень.Корнем 3.3 был temp из 3, потому что мы назвали sortedLists(first, second, temp)
(temp действует как корень, потому что последний аргумент этой функции - Node root
).
Подводя итог:Наш корень по-прежнему равен 0, а наш темп 5-> 10-> 15
root.next
после этого назначения 0-> 5-> 10-> 15.Теперь корень, который вы объявили в своем классе выше метода main, имеет значение.
, мы возвращаем temp, равную 5-> 10-> 15, и все готово.
Теперь мы можем продолжить в основном методе, распечатывая результаты.
Чтобы избавиться от ---> при отсутствии result.next
, вы можете обработать нулевое значениевот так:
while (result != null) {
if (result.next != null)
System.out.print(result.data + "--->");
else System.out.println(result.data);
result = result.next;
}
Надеюсь, это немного поможет в рекурсии.