斐波那契数列中的第一个数和第二个数都是1, 从第三个数开始,每个数都是前两个数的和。
用数学公式表示就是:
当n=1,2 时: F(1)=1 F(2)=1
当n>=3 时:F(n)=F(n−1)+F(n−2)
数列前10项: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55
斐波那契数列一般都会选择用递归方法实现,代码如下:
public class MainClass {
public static void main(String[] args) {
for (int counter = 1; counter <= 10; counter++) {
System.out.printf("Fibonacci of %d is: %d\n", counter, f(counter));
}
}
public static long f(long number) {
if (number == 1 || number == 2) {
return 1;
} else {
return f(number - 1) + f(number - 2);
}
}
}
用代数替换的思想理解递归,以f(4)为例:
f(4) =f(3)+f(2)
= f(2)+f(1)+f(1)
=1+1+1
=3
代码是运行在线程中的,这里只有一个main线程
在线程中,每次方法调用就会产生一个栈帧如下图,
实际上不止截图中的3个栈帧, f(2) 和 f(1) 会直接return(在栈帧中被弹出,出栈)
调用过程中实际产生的栈帧有:
f(4) f(3) f(2) f(2) f(2) f(1) f(1) , 和上述代数式的函数个数能完全对应。