Попытка лучше понять рекурсию
Привет.
В данный момент я изучаю рекурсию и пытаюсь хорошо ее понять.
У меня есть пример, над которым я работаю, и мне нужно шаг за шагом выяснить, что происходит.
До сих пор я понимаю некоторые его части, но, похоже, не могу понять, как все это сочетается.
Может ли кто-нибудь объяснить, как вызывается рекурсия и как перемещаются части?
Это код:
private void btnExecute_Click(object sender, EventArgs e) { Hanoi(1, 2, 3, 3); } void Hanoi(int Tower1, int Tower2, int Tower3, int n) { if (n == 1) txtOutput.Text += "Move from " + Tower1 + " to " + Tower3 + "\r\n"; if (n > 1) { Hanoi(Tower1, Tower3, Tower2, n - 1); Hanoi(Tower1, Tower2, Tower3, 1); Hanoi(Tower2, Tower1, Tower3, n - 1); } }
Он выводит следующее, И мне нужно выяснить, как он работает:
Move from 1 to 3 Move from 1 to 2 Move from 3 to 2 Move from 1 to 3 Move from 2 to 1 Move from 2 to 3 Move from 1 to 3
Sampath Lokuge
Самое лучшее,что вы можете сделать, это просто поставить точку торможения и понять, как она отступает.
Sergey Alexandrovich Kryukov
Вы понимаете, как работает стек вызовов? Если вы это понимаете, это дает вам ключ к глубокому пониманию ключевых вещей: рекурсии, структурной обработки исключений и потоковой обработки...
—СА
phil2846
Я тоже рассматривал эту проблему в школе. Это мой вывод из окна txt, регистрирующего значения переменных по пути. a-это ссылка на то, какой метод был вызван. Что я в основном не понимаю на данный момент, так это то, как N увеличивается на одном из шагов. Я тоже не совсем понимаю логику рекурсивных вызовов.
вызов n=3 t1=1 t2=2 t3=3 a=1
вызов n=2 t1=1 t2=3 t3=2 a=1
вызов n=1 t1=1 t2=2 t3=3 a=1
Переход от 1 к 3
вызов n=1 t1=1 t2=3 t3=2 a=2
Переход от 1 к 2
вызов n=1 t1=3 t2=1 t3=2 a=3
Переход от 3 к 2
вызов n=1 t1=1 t2=2 t3=3 a=2
Переход от 1 к 3
вызов n=2 t1=2 t2=1 t3=3 a=3
вызов n=1 t1=2 t2=3 t3=1 a=1
Переход от 2 к 1
вызов n=1 t1=2 t2=1 t3=3 a=2
Переход от 2 к 3
вызов n=1 t1=1 t2=2 t3=3 a=3
Переход от 1 к 3