之前还是有些漏,现在补充,望高手指教一下
hanoi(3,a,b,c) //执行这个函数
{
if(0) //约束条件还没有触发,所以执下面语句
...
hanoi(2,a,c,b); //准备调用hanoi(2,a,c,b),这个所谓"自己调用自己"迫使hanoi(3,a,b,c)入栈,保留hanoi(3,a,b,c)一些数据
nove(a,c); //等上面函数执行完,才执行这个
hanoi(2,b,a,c); //等上面函数执行完,才执行这个
}
hanoi(2,a,c,b) //执行hanoi(2,a,c,b)函数,从头执行到尾
{
if(0) //约束条件还没有触发,所以执下面语句
...
hanoi(1,a,b,c); //准备调用hanoi(1,a,b,c),迫使hanoi(2,a,c,b)入栈,保留hanoi(2,a,c,b)一些数据
nove(a,b); //等上面函数执行完,才执行这个
hanoi(1,c,a,b); //等上面函数执行完,才执行这个
}
hanoi(1,a,b,c) //执行完这个函数,退栈hanoi(2,a,c,b),记住从那地方调用,就从那地方回去,执行下一条语句.
{
if(1) //约束条件触发,所以打印出语句
printf a->c
}
hanoi(2,a,c,b) //执行这个函数,记住从那地方调用,就从那地方回去.
{
if(0) //约束条件还没有触发,所以执下面语句
...
hanoi(1,a,b,c); //这个执行完,所以执行下面语句
nove(a,b); //打印 printf a->b
hanoi(1,c,a,b); //准备调用hanoi(1,c,a,b),迫使hanoi(2,a,c,b)入栈,保留hanoi(2,a,c,b)一些数据
}
hanoi(1,c,a,b) //执完这个函数,退栈hanoi(2,a,c,b), 记住从那地方调用,就从那地方回去,执行下一条语句.
{
if(1) //约束条件触发,所以打印出语句
printf c->b
}
hanoi(2,a,c,b) //下面没有执行语句,结束这个函数,现在退栈hanoi(3,a,b,c), 记住从那地方调用,就从那地方回去,执行下一条语句.
{}
hanoi(3,a,b,c) //执行这个函数
{
if(0) //约束条件还没有触发,所以执下面语句
...
hanoi(2,a,c,b); //执行完这个函数,开始执行下面函数
nove(a,c); //打印 printf a->c
hanoi(2,b,a,c); //准备调用hanoi(2,b,a,c),迫使hanoi(3,a,b,c)入栈,保留hanoi(3,a,b,c)一些数据
}
hanoi(2,b,a,c) //再一次,再行这个函数
{
if(0) //约束条件还没有触发,所以执下面语句
...
hanoi(1,b,c,a); //准备调用hanoi(1,b,c,a),迫使hanoi(2,b,a,c)入栈,保留hanoi(2,b,a,c)一些数据
nove(b,c); //等上面函数执行完,才执行这个
hanoi(1,a,b,c); //等上面函数执行完,才执行这个
}
hanoi(1,b,c,a) //执完这个函数,退栈hanoi(2,b,a,c),记住从那地方调用,就从那地方回去,执行下一条语句.
{
if(1) //约束条件触发,所以打印出语句
printf b->a
}
hanoi(2,b,a,c) //继续执行这个函数
{
if(0) //约束条件还没有触发,所以执下面语句
...
hanoi(1,b,c,a); //这个函数己经完成
nove(b,c); //执行这个函数,开始打印 b->c
hanoi(1,a,b,c); //准备调用hanoi(1,a,b,c),迫使hanoi(2,b,a,c)入栈,保留hanoi(2,b,a,c)一些数据
}
hanoi(1,a,b,c) //执完这个函数,退栈hanoi(2,b,a,c),记住从那地方调用,就从那地方回去,顺便执行下一条语句.
{
if(1) //约束条件触发,所以打印出语句
printf a->c
}
hanoi(2,b,a,c) //下面没有执行语句,结束这个函数,现在退栈hanoi(3,a,b,c), 记住从那地方调用,就从那地方回去,执行下一条语句.
{}
hanoi(3,a,b,c) //下面没有执行语句,结束这个函数,出栈与入栈在这里划上句号.
{}
p.s 这个最好有汇编基础,不然不好明白
[
本帖最后由 点线面 于 2011-2-1 16:11 编辑 ]