图解算法:递归、斐波那契数列、方法调用栈

斐波那契数列中的第一个数和第二个数都是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) , 和上述代数式的函数个数能完全对应。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值