java 输入一个整数n,根据n获取Fibonacci数列的第n个值

数学基础:

1,1,2,3,5,8,13 and so on

前两位特殊,其余各位符合F(n) = F(n-1)+F(n-2); 

首先想到递归,如下:

    public static int fibonacci(int n) {
        if (n <= 0) {
            return -1;
        } else if (n == 1 || n == 2) {
            return 1;
        } else {
            return fibonacci(n - 1) + fibonacci(n - 2);
        }

    }

    private void testFibonacci(){
        for (int i = 0; i < 10; i++) {
            System.out.println("fibonacci i="+i+"--value="+TestAlgorithms.fibonacci(i));
        }

    }

12-12 15:03:15.861 29816-29816/com.example.bxh.sayhello I/System.out: fibonacci i=0--value=-1
12-12 15:03:15.861 29816-29816/com.example.bxh.sayhello I/System.out: fibonacci i=1--value=1
12-12 15:03:15.861 29816-29816/com.example.bxh.sayhello I/System.out: fibonacci i=2--value=1
12-12 15:03:15.861 29816-29816/com.example.bxh.sayhello I/System.out: fibonacci i=3--value=2
12-12 15:03:15.861 29816-29816/com.example.bxh.sayhello I/System.out: fibonacci i=4--value=3
12-12 15:03:15.861 29816-29816/com.example.bxh.sayhello I/System.out: fibonacci i=5--value=5
12-12 15:03:15.861 29816-29816/com.example.bxh.sayhello I/System.out: fibonacci i=6--value=8
12-12 15:03:15.861 29816-29816/com.example.bxh.sayhello I/System.out: fibonacci i=7--value=13
12-12 15:03:15.861 29816-29816/com.example.bxh.sayhello I/System.out: fibonacci i=8--value=21
12-12 15:03:15.861 29816-29816/com.example.bxh.sayhello I/System.out: fibonacci i=9--value=34

但有同学说:此法没有保存前面的值,每次计算时都要重复计算前面的值。所以有人提出使用‘迭代’,关于迭代我没(首)啥(次)说(听)的(说)了(衰!).可以百度一下迭代与递归之间的区别。

    public static int fibonacci02(int n) {

        if (n <= 0) {
            return -1;
        } else if (n == 1 || n == 2) {
            return 1;
        } else {
            int start = 3;
            int f = 1;//第1位
            int b = 1;//第2位
            while (start++ <= n) {
                //每次循环都把b和f右移一位,最终b就是我们要的值
                //当n=3时,只需要执行1次
                //当n=4时,移动1次以后要再移动1次
                //当n=5时,在上面的基础上再移动1次
                b = b + f;//b 变成它右边那一位
                f = b - f;//f 变成b之前的值
            }
            return b;
        }

    }
moyinghui
结果与第一种方法相同。





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值