吊打面试官系列:你会「递归」么?
递归,是一个非常重要的概念,也是面试中非常喜欢考的。因为它不但能考察一个程序员的算法功底,还能很好的考察对时间空间复杂度的理解和分析。
本文只讲一题,也是几乎所有算法书讲递归的第一题,但力争讲出花来,在这里分享四点不一样的角度,让你有不同的收获。
时空复杂度的详细分析
识别并简化递归过程中的重复运算
披上羊皮的狼
算法思路
大家都知道,一个方法自己调用自己就是递归,没错,但这只是对递归最表层的理解。
那么递归的实质是什么?
答:递归的实质是能够把一个大问题分解成比它小点的问题,然后我们拿到了小问题的解,就可以用小问题的解去构造大问题的解。
那小问题的解是如何得到的?
答:用再小一号的问题的解构造出来的,小到不能再小的时候就是到了零号问题的时候,也就是 base case 了。
那么总结一下递归的三个步骤:
Base case:就是递归的零号问题,也是递归的终点,走到最小的那个问题,能够直接给出结果,不必再往下走了,否则,就会成死循环;
拆解:每一层的问题都要比上一层的小,不断缩小问题的 size,才能从大到小到 base case;
组合:得到了小问题的解,还要知道如何才能构造出大问题的解。
所以每道递归题,我们按照这三个步骤来分析,把这三个问题搞清楚,代码就很容易写了。
斐波那契数列
这题虽是老生常谈了,但相信我这里分享的一定会让你有其他收获。
题目描述
斐波那契数列是一位意大利的数学家,他闲着没事去研究兔子繁殖的过程,研究着就发现,可以写成这么一个序列:1,1,2,3,5,8,13,21… 也就是每个数等于它前两个数之和。那么给你第 n 个数,问 F(n) 是多少。
解析
用数学公式表示很简单:
代码也很简单,用我们刚总结的三步:
base case: f(0) = 0, f(1) = 1. 分解:f(n-1), f(n-2) 组合:f(n) = f(n-1) + f(n-2)
class Solution {
public int fib(int N) {
if (N == 0) {
return 0;
} else if (N == 1) {
return 1;
}
return fib(N-1) + fib(N-2);
}
}
过程分析
时间复杂度分析
如何评价一个算法的好坏?
时间复杂度:随着自变量的增长,算法所需时间的增长情况。
Theta: 描述的是 tight bound
Omega(n): 这个描述的是 best case,最好的情况,没啥意义
那对于这个题来说,时间复杂度是多少呢?
第二层 2 个,
第三层 4 个,
第四层 8 个,
第五层 16 个,如果填满的话,想象成一颗很大的树:)
1 + 2 + 4 + 8 + 16
空间复杂度分析
算法运行期间所需占用的所有内存空间
Auxiliary space complexity:
运行算法时所需占用的额外空间。
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
随时掌握互联网精彩
- 1 习近平G20里约峰会展现大国担当 7903958
- 2 一个金镯子省出1200元 金价真跌了 7957999
- 3 胖东来:员工不许靠父母买房买车 7860809
- 4 二十国集团里约峰会将会卓有成效 7723132
- 5 俄导弹击中乌水电站大坝 7642818
- 6 孙颖莎王艺迪不敌日本削球组合 7550835
- 7 高三女生酒后被强奸致死?检方回应 7406942
- 8 第一视角记录虎鲨吞下手机全程 7394966
- 9 73岁王石独自带娃被偶遇 7218143
- 10 智慧乌镇点亮数字经济新未来 7182262