上台阶案例(递归和非递归实现,斐波那契)

N个台阶,一次可以走一步或者两步,求走这n个台阶有多少种方法??(递归和非递归实现)

package test;

import java.util.Date;

/**
 * 
* @ClassName: FibonacciSequence 
* @Description: TODO(N个台阶,一次可以走一步或者两步,求走这n个台阶有多少种方法(递归和非递归实现)) 
* @author chenliming
* @date 2017年11月3日 上午8:18:57 
*
 */
public class FibonacciSequence {
    /*
     * 分析:
     * f(1) = 1
     * f(2) = 1
     * f(3) = f(1) + f(2)
     * f(4) = f(2) + f(3)
     */

    //1.递归实现
    public static long getNum(int n) {
        if(n <= 2) {
            return 1;
        }
        return getNum(n - 1) + getNum(n - 2);
    }

    //2.非递归实现
    public static long getNum1(int n) {
        if(n <= 2) {
            return 1;
        }

        long a1 = 1;
        long a2 = 1;
        long a3 = 0;
        while(n > 2) {
            a3 = a1 + a2;
            a1 = a2;
            a2 = a3;
            n--;
        }
        return a3;
    }

    public static void main(String[] args) {
//      System.out.println("n=" + 47 + ":" + getNum(47));

        Date date1 = new Date();
        for (int i = 1; i < 50; i++) {
            System.out.println("n=" + i + ":" + getNum(i));
        }
        Date date2 = new Date();
        System.out.println("递归耗时:" + (date2.getTime() - date1.getTime()) + "ms");

        Date date11 = new Date();
        for (int i = 1; i < 50; i++) {
            System.out.println("n=" + i + ":" + getNum1(i));
        }
        Date date22 = new Date();
        System.out.println("非递归耗时:" + (date22.getTime() - date11.getTime()) + "ms");

    }
}

打印结果:

n=1:1
n=2:1
n=3:2
n=4:3
n=5:5
n=6:8
n=7:13
n=8:21
n=9:34
n=10:55
n=11:89
n=12:144
n=13:233
n=14:377
n=15:610
n=16:987
n=17:1597
n=18:2584
n=19:4181
n=20:6765
n=21:10946
n=22:17711
n=23:28657
n=24:46368
n=25:75025
n=26:121393
n=27:196418
n=28:317811
n=29:514229
n=30:832040
n=31:1346269
n=32:2178309
n=33:3524578
n=34:5702887
n=35:9227465
n=36:14930352
n=37:24157817
n=38:39088169
n=39:63245986
n=40:102334155
n=41:165580141
n=42:267914296
n=43:433494437
n=44:701408733
n=45:1134903170
n=46:1836311903
n=47:2971215073
n=48:4807526976
n=49:7778742049
递归耗时:52271ms
n=1:1
n=2:1
n=3:2
n=4:3
n=5:5
n=6:8
n=7:13
n=8:21
n=9:34
n=10:55
n=11:89
n=12:144
n=13:233
n=14:377
n=15:610
n=16:987
n=17:1597
n=18:2584
n=19:4181
n=20:6765
n=21:10946
n=22:17711
n=23:28657
n=24:46368
n=25:75025
n=26:121393
n=27:196418
n=28:317811
n=29:514229
n=30:832040
n=31:1346269
n=32:2178309
n=33:3524578
n=34:5702887
n=35:9227465
n=36:14930352
n=37:24157817
n=38:39088169
n=39:63245986
n=40:102334155
n=41:165580141
n=42:267914296
n=43:433494437
n=44:701408733
n=45:1134903170
n=46:1836311903
n=47:2971215073
n=48:4807526976
n=49:7778742049
非递归耗时:0ms

递归效率较低;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值