日期:2014-05-20  浏览次数:20691 次

关于Hanoi tower(汉诺塔)的问题
本人在学习递归的算法,以下代码是从书上抄的, 关于汉诺塔问题。



public class towersApp {
static int nDisks = 3;

public static void main(String[] args) {
doTowers(nDisks, 'A', 'B', 'C');
}

public static void doTowers(int topN, char from, char inter, char to)
{
if(topN ==1)
System.out.println("Disk 1 from " + from + " to " + to);
else
{
doTowers(topN-1, from, to ,inter);
System.out.println("the topN is " + topN);
System.out.println("from is "+from + " inter is " + inter + " to is " + to);

System.out.println("Disk " + topN + " from " + from + " to " +to);
    doTowers(topN-1, inter, from, to);
    System.out.println("the topN is  " + topN);
}

}


}




在eclipse 一步步debug时,输出结果为:
Disk 2 from A to B
Disk 1 from C to B
the topN is  2
the topN is 3

问题:
在run 16行时,为什么 还能输出”the topN is 3 “, topN不是等于2 吗? 不是特别理解这个执行调用的步骤,难道是因为static的原因吗?

希望大家能帮忙解答。 谢谢~


------解决方案--------------------
看到你问的问题,我想你应该是初学编程吧。。。。
你这个问题实际上表现出来的是你对递归的不理解

首先,Java的static和C语言的static根本不同,Java的static只是表示声明的域或方法是类的而不是对象的

至于递归,我简单的和你说一下
函数递归的实质就是函数层层递进
举个例子:

void func(int i) {
    if (i == 0) {
        return;
    } else {
        printf("This is func %d\n", i);
        func(i-1);
        printf("This is func %d\n", i);
    }
}

调用 func(5),结果是什么?

// Output
This is func 5
This is func 4
This is func 3
This is func 2
This is func 1
This is func 1
This is func 2
This is func 3
This is func 4
This is func 5


然后从本质上分析一下递归(需要一定的汇编语言知识):
一个函数中的变量称为局部变量,局部变量保存在栈中,当调用一个函数时,其拥有的局部变量入栈,而当函数返回时,其所拥有的局部变量便会出栈,所以说局部变量在函数外是不能被使用的。
结合上面的例子,调用func(5)时,传入的参数i=5入栈,当在func(5)中调用func(4)时,func(4)的参数i=4入栈,接下来func(4)返回,i=4出栈,程序继续从func(5)中的调用func(4)的下一句执行,这时的局部变量i仍然是在func(5)中之前入栈的i=5。
(为了便于理解,简化了很大一部分内容,事实上当调用一个函数时所做的操作比这些要多)

我写的不见得好理解,自己网上 Google 一下,先搞懂了递归再说吧