第一次发贴求解,自学java,关于不死神兔代码的理解卡壳了,原理基本懂:f(n)=f(n-1)+f(n-2);
代码如下:
public class DiGui {
public static void main(String[] args) {
System.out.println(fib(4));
}
public static int fib(int n) {
if(n == 1 || n == 2) {
return 1;
}else {
int fib1,fib2,fib3;
fib1=fib(n-1);
fib2=fib(n-2);
fib3=fib1+fib2;
System.out.println("n="+n);
System.out.println("n1:"+(n-1));
System.out.println("n2:"+(n-2));
System.out.println("fib1="+fib1+":"+"fib2="+fib2);
System.out.println("fib3="+fib3);
System.out.println("--------------------");
return fib3;
}
}
}
运行的如果如下:
n=3
n1:2
n2:1
fib1=1:fib2=1
fib3=2
--------------------
n=4
n1:3
n2:2
fib1=2:fib2=1
fib3=3
--------------------
3
不理解的地方是:fib(n-1)和fib(n-2),输出的结果是:
fib1=fib(n-1); 当n=4时:fib1=2、当n=3时:fib1=1
fib2=fib(n-2); 当n=4时:fib2=1、当n=3时:fib2=1
请问该如何理解?
这是递归调用。
调用过程是,首先 System.out.println(fib(4));调用fib(4)
在fib(4)中n=4,
执行到 fib1=fib(n-1);时等于是调用fib(3)
在fib(3)中n=3,
又执行到 fib1=fib(n-1);时等于是调用fib(2)
在fib(2)中 直接return 1;
又回到在fib(3)中执行到 fib2=fib(n-2);时等于是调用fib(1)
在fib(1)中也是直接return 1;
又回到在fib(3)中继承执行 fib2=fib(n-2);之后的代码,输出:
n=3
n1:2
n2:1
fib1=1:fib2=1
fib3=2
等执行到return fib3;会回到fib(4)中又执行 fib2=fib(n-2);等于是又调用fib(2)一次。
在fib(2)中return 1;
又回到在fib(4)中继承执行 fib2=fib(n-2);之后的代码,输出:
n=4
n1:3
n2:2
fib1=2:fib2=1
fib3=3