6.递归(Recursion)

递归三部曲

1.define subproblem:定义子问题
2.find recursion rule: 找出递归规则
3.define base case: 定义退出条件

题目1

n级阶梯,每次走一步或两步,问最多有多少种走法?

    public long fibonacci(int k) {
        if (k == 0) return 0;
        if (k == 1 || k == 2) return 1; //base case
        return fibonacci(k-1)+fibonacci(k-2); //recursion rule
    }

这是斐波那契数列的一种解法,算法效率极低,时间复杂度是O(2^n),空间复杂度是O(n);
另一种非递归解法:

    public long fibonacci(int k) {
        if (k == 0) return 0;
        if (k == 1 || k == 2) return 1;
        long num1 = 1, num2 = 2, num = 0;
        for (int i = 3; i <= k; i++) {
            num = num1 + num2;
            num1 = num2;
            num2 = num;
        }
        return num;
    }

时间复杂度O(n),空间复杂度O(1)。

题目二

求a^b的结果.
subproblem: a^b= a^(b/2)* a^(b/2)

    public long power(int a, int b) {
        if (a == 0) return 0;
        if (b == 0) return 1;//base case
        //recursion rule:
        long half = power(a, b / 2);
        if (b % 2 == 0) {
            return half * half; 
        } else {
            return half * half * a;
        }
    }
6.png

时间复杂度O(lgb),空间复杂度O(lgb)

推荐阅读更多精彩内容

  • 前言 递归是算法中一种非常重要的思想,应用也很广,小到阶乘,再在工作中用到的比如统计文件夹大小,大到 Google...
    谢kun阅读 2,464评论 0 4
  • 前言 递归是算法中一种非常重要的思想,应用也很广,小到阶乘,再在工作中用到的比如统计文件夹大小,大到 Google...
    风平浪静如码阅读 75评论 0 0
  • 小时候,家里有座带有院墙的屋子。白墙绿瓦,每次下雨天晴后,墙角会出现鲜绿绿的青苔。时间久了,雨水的冲刷,给白色的墙...
    锋尘舞墨阅读 324评论 2 3
  • 1.权限 2.获取WifiManager 3.注册扫描结果广播接收器 广播接收器 4.扫描 5.限制概述(权限与节...
    啊噜啊噜阅读 1,092评论 0 4
  • 以洁来泉州和她聊了一上午,从我的原生家庭,目前的困惑,我的价值观讲了一上午,在和以洁聊天很放松,有种能掏心对她讲秘...
    郭福顺阅读 126评论 0 7