递归与迭代

编程题:有n步台阶,一次只能上1步或2步,共有多少中走法

方法一:递归

思路

n=1 ——> 一步 ——> f(1)=1
n=2 ——> (1)一步一步 (2)直接两步 ——> f(2) =2
n=3 ——> (1)先到达第f(1),然后直接从f(1)直接跨2步
(2)先到达f(2),然后直接从f(2)跨步1 f(3)=f(1)+f(2)
n=x ——>(1) 先到达f(x-2),然后从f(x-2)直接垮2步
(2) 先到达f(x-1),然后从f(x-1)跨1步 f(x) =f(x-2)+f(x-1)

代码
	public static void main(String[] args) {
        Long start = System.currentTimeMillis();
        System.out.println(f(40l));
        Long end = System.currentTimeMillis();
        System.out.println(end-start);
    }

    public static Long f(Long n){
        if(n <1)
            throw new IllegalArgumentException(n +"不能小于1");
        if(n == 1 || n == 2){
            return n;
        }
        return f(n-2)+f(n-1);
    }
优点:代码精简 易懂,容易编写。
缺点:开销较大,容易造成内存溢出

方法二:迭代

思路:使用one变量存储前两步的值,使用two变量存储前一步的值
代码
	public static void main(String[] args) {
        Long start = System.currentTimeMillis();
        System.out.println(f(40l));
        Long end = System.currentTimeMillis();
        System.out.println(end-start);
    }
	public static Long loop(Long n){
        if(n <1)
            throw new IllegalArgumentException(n +"不能小于1");
        if(n == 1 || n == 2){
            return n;
        }
        Long one = 1l;
        Long two = 2l;
        Long sum = 0l;

        for(int i = 3;i<=n;i++){
            sum = one + two;
            one = two;
            two = sum;
        }
        return sum;
    }
优点:速率快。
缺点:代码不易懂。
posted @ 2020-03-05 10:00  岸北  阅读(127)  评论(0编辑  收藏  举报