Я сейчас учусь на факультета компьютерной инженерии, изучаю структуры данных. Сегодняшняя лекция посвящена рекурсивным функциям как простому способу решения факторных задач или задач сортировки. Мой профессор использовал пример Towers of Hanoi, и я действительно хочу убедиться, что понимаю порядок, в котором вызываются рекурсивные функции. Я попытался написать шаг за шагом, как выполняются функции, но я не получаю правильную последовательность.
Я опубликую свой исходный код ниже, это довольно просто. Если бы кто-нибудь мог помочь мне объяснить это, я был бы очень благодарен. Спасибо!
void hanoi(int N, char S, char D, char I){
//Step1: Anchor Value or Base Case
if(N==1){
cout <<"Move " << N << " from " << S << " to " << D << endl;
}
else {
//Step2: Make progress towards base case
hanoi(N-1, S, I, D);
cout << "Move " << N << " from " << S << " to " << D << endl;
hanoi (N-1, I, D, S);
}
}
int main(){
int N; //Number of disks
cout << "Enter number of discs: " << endl;
cin >> N;
char S = 'S'; //Source
char D = 'D'; //Destination
char I = 'I'; //Intermediary
hanoi(N, S, D, I);
system("pause");
}
Пример исполнения с 3 дисками:
hanoi( 3, 'S', 'D', 'I')
(else)
hanoi(2, 'S', 'I', 'D')
(else)
hanoi(1, 'S', 'D', 'I')
(cout) move 1 from 'S' to 'D'
(cout) move 2 from 'S' to 'I'
hanoi(1, 'D', 'I', 'S'
(cout) move 1 from 'D' to 'I'
(cout) move 3 from 'S' to 'D'
hanoi(2, 'I', 'D', 'S')
(else)
hanoi(1, 'I', 'S', 'D')
(cout) move 1 from 'I' to 'S'
(cout) move 2 from 'I' to 'D'
hanoi(1, 'S', 'D', 'I')
(cout) move 1 from 'S' to 'D'
Чтобы понять заголовок, учтите, что «S» осталось, «D» — середина, а «I» — слева. 1 — меньший диск, 2 — средний диск и 3 — больший диск.