【发布时间】:2014-10-29 15:00:26
【问题描述】:
我是一名计算机工程专业的学生,刚刚学习数据结构。今天的讲座涵盖了递归函数作为解决阶乘问题或排序问题的简单方法。我的教授使用了河内塔的例子,我真的想确保我理解递归函数被调用的顺序。我已经尝试一步一步地写出函数是如何执行的,但我没有得到正确的顺序。
我将在下面发布我的源代码,它非常简单。如果有人能帮我解释一下,我会非常感激的。谢谢!
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");
}
【问题讨论】:
-
你有什么特别不明白的地方?
-
我试图从逻辑上理解递归函数是如何流动的。我使用 N=3 作为输入,并尝试在每次执行 hanoi 函数时进行跟踪。
-
想象一棵树。根是
N=3,它有两个分支,用于N=2,每个分支都有两个分支用于N=1。现在调用是从根开始对树进行深度优先搜索。所以N=3会被调用,从N=2开始,比方说,left,N=1left,这里没有进一步的调用,因为if语句,所以函数返回,N=right得到调用并返回,N=2left 拥有返回所需的一切,所以N=2right 被调用。这个经过左右两个N=1,返回,最后N=3返回。我希望我能在评论中画出来:-) -
我不明白那些对初学者问题投反对票的人。这个问题很好理解,有例子。
标签: c++ recursion data-structures towers-of-hanoi