看好了,这才是递归的正确打开方式

UDPProbe UDP端口存活探测(发送特征包+响应分析)、UDP服务识别 qDebug() << "收到响应:" << ip.toString() << ":" << port << " 服务:" << serviceName << " 响应长度:" << response.size();qDebug() << "开始探测:" << targetIp << ":" << port << " 超时时间:" << timeout << "ms";qInfo() << "\n==================== UDP探测结果 ===================="; 阅读详情

递归,是一个非常重要的概念,也是面试中非常喜欢考的。因为它不但能考察一个程序员的算法功底,还能很好的考察对时间空间复杂度的理解和分析。

本文只讲一题,也是几乎所有算法书讲递归的第一题,但力争讲出花来,在这里分享四点不一样的角度,让你有不同的收获。

  • 时空复杂度的详细分析
  • 识别并简化递归过程中的重复运算
  • 披上羊皮的狼
  • 适当炫技助我拿到第一份工作

算法思路

大家都知道,一个方法自己调用自己就是递归,没错,但这只是理解递归的最表层的理解。

那么递归的实质是什么?

答:递归的实质是能够把一个大问题分解成比它小点的问题,然后我们拿到了小问题的解,就可以用小问题的解去构造大问题的解。

那小问题的解是如何得到的?

答:用再小一号的问题的解构造出来的,小到不能再小的时候就是到了零号问题的时候,也就是 base case 了。

撸篇长文教你递归题的正确打开方式

 

那么总结一下递归的三个步骤:

Base case:就是递归的零号问题,也是递归的终点,走到最小的那个问题,能够直接给出结果,不必再往下走了,否则,就会成死循环;

拆解:每一层的问题都要比上一层的小,不断缩小问题的 size,才能从大到小到 base case;

组合:得到了小问题的解,还要知道如何才能构造出大问题的解。

所以每道递归题,我们按照这三个步骤来分析,把这三个问题搞清楚,代码就很容易写了。

斐波那契数列

这题虽是老生常谈了,但相信我这里分享的一定会让你有其他收获。复制代码

题目描述

斐波那契数列是一位意大利的数学家,他闲着没事去研究兔子繁殖的过程,研究着就发现,可以写成这么一个序列:1,1,2,3,5,8,13,21…也就是每个数等于它前两个数之和。那么给你第 n 个数,问 F(n) 是多少。

解析

用数学公式表示很简单:

f(n) = f(n-1) + f(n-2)

代码也很简单,用我们刚总结的三步:

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);
    }
}复制代码

但是这种解法 Leetcode 给出的速度经验只比 15% 的答案快,因为,它的时间复杂度实在是太高了!

撸篇长文教你递归题的正确打开方式

 

过程分析

那这就是我想分享的第一点,如何去分析递归的过程。

首先我们把这颗 Recursion Tree 画出来,比如我们把 F(5) 的递归树画出来:

撸篇长文教你递归题的正确打开方式

 

那实际的执行路线是怎样的?

首先是沿着最左边这条线一路到底:F(5) → F(4) → F(3) → F(2) → F(1),好了终于有个 base case 可以返回 F(1) = 1 了,然后返回到 F(2) 这一层,再往下走,就是 F(0),又触底反弹,回到 F(2),得到 F(2) = 1+0 =1 的结果,把这个结果返回给 F(3),然后再到 F(1),拿到结果后再返回 F(3) 得到 F(3) = 左 + 右 = 2,再把这个结果返上去...

这种方式本质上是由我们计算机的冯诺伊曼体系造就的,目前一个 CPU 一个核在某一时间只能执行一条指令,所以不能 F(3) 和 F(4) 一起进行了,一定是先执行了 F(4) (本代码把 fib(N-1) 放在前面),再去执行 F(3).

我们在 IDE 里 debug 就可以看到栈里面的情况:这里确实是先走的最左边这条线路,一共有 5 层,然后再一层层往上返回。

撸篇长文教你递归题的正确打开方式

 

时间复杂度分析

如何评价一个算法的好坏?

很多问题都有多种解法,毕竟条条大路通罗马。但如何评价每种方法的优劣,我们一般是用大 O 表达式来衡量时间和空间复杂度。

时间复杂度:随着自变量的增长,所需时间的增长情况。

这里大 O 表示的是一个算法在 worst case 的表现情况,这就是我们最关心的,不然春运抢车票的时候系统 hold 不住了,你跟我说这个算法很优秀?

当然还有其他衡量时间和空间的方式,比如

Theta: 描述的是 tight bound Omega(n): 这个描述的是 best case,最好的情况,没啥意义

这也给我们了些许启发,不要说你平时表现有多好,没有意义;面试衡量的是你在 worst case 的水平;不要说面试没有发挥出你的真实水平,扎心的是那就是我们的真实水平。

那对于这个题来说,时间复杂度是多少呢?

答:因为我们每个节点都走了一遍,所以是把所有节点的时间加起来就是总的时间。

在这里,我们在每个节点上做的事情就是相加求和,是 O(1) 的操作,且每个节点的时间都是一样的,所以:

总时间 = 节点个数 * 每个节点的时间

那就变成了求==节点个数==的数学题:

在 N = 5 时,

撸篇长文教你递归题的正确打开方式

 

最上面一层有1个节点, 第二层 2 个, 第三层 4 个, 第四层 8 个, 第五层 16 个,如果填满的话,想象成一颗很大的树:)

这里就不要在意这个没填满的地方了,肯定是会有差这么几个 node,但是大 O 表达的时间复杂度我们刚说过了,求的是 worst case.

那么总的节点数就是: 1 + 2 + 4 + 8 + 16

这就是一个等比数列求和了,当然你可以用数学公式来算,但还有个小技巧可以帮助你快速计算:

其实前面每一层的节点相加起来的个数都不会超过最后一层的节点的个数,总的节点数最多也就是最后一层节点数 * 2,然后在大 O 的时间复杂度里面常数项也是无所谓的,所以这个总的时间复杂度就是:

最后一层节点的个数:2^n

空间复杂度分析

一般书上写的空间复杂度是指:

算法运行期间所需占用的所有内存空间

但是在公司里大家常用的,也是面试时问的指的是 Auxiliary space complexity:

运行算法时所需占用的额外空间。

举例说明区别:比如结果让你输出一个长度为 n 的数组,那么这 O(n) 的空间是不算在算法的空间复杂度里的,因为这个空间是跑不掉的,不是取决于你的算法的。

那空间复杂度怎么分析呢?

我们刚刚说到了冯诺伊曼体系,从图中也很容易看出来,是最左边这条路线占用 stack 的空间最多,一直不断的压栈,也就是从 5 到 4 到 3 到 2 一直压到 1,才到 base case 返回,每个节点占用的空间复杂度是 O(1),所以加起来总的空间复杂度就是 O(n).

优化算法

那我们就想了,为什么这么一个简简单单的运算竟然要指数级的时间复杂度?到底是为什么让时间如此之大。

那也不难看出来,在这棵 Recursion Tree 里,有太多的重复计算了。

比如一个 F(2) 在这里都被计算了 3 次,F(3) 被计算了 2 次,每次还都要再重新算,这不就是狗熊掰棒子吗,真的是一把辛酸泪。

那找到了原因之后,为了解决这种重复计算,计算机采用的方法其实和我们人类是一样的:记笔记。

对很多职业来说,比如医生、律师、以及我们工程师,为什么越老经验值钱?因为我们见得多积累的多,下次再遇到类似的问题时,能够很快的给出解决方案,哪怕一时解决不了,也避免了一些盲目的试错,我们会站在过去的高度不断进步,而不是每次都从零开始。

回到优化算法上来,那计算机如何记笔记呢?

我们要想求 F(n),无非也就是要 记录 F(0) ~ F(n-1) 的值, 那选取一个合适的数据结构来存储就好了。

那这里很明显了,用一个数组来存: |Index |0 |1 |2 |3 |4 | 5| |--|--|--|--|--|--|--| | F(n) | 0 | 1| 1| 2| 3| 5| 那有了这个 cheat sheet,我们就可以从前到后得到结果了,这样每一个点就只算了一遍,用一个 for loop 就可以写出来,代码也非常简单。

class Solution {
    public int fib(int N) {
        if (N == 0) {
            return 0;
        }
        if (N== 1) {
            return 1;
        }
        int[] notes = new int[N+1];
        notes[0] = 0;
        notes[1] = 1;
        for(int i = 2; i <= N; i++) {
            notes[i] = notes[i-1] + notes[i-2];
        }
        return notes[N];
    }
}复制代码

这个速度就是 100% 了~

撸篇长文教你递归题的正确打开方式

 

但是我们可以看到,空间应该还有优化的余地。

那仔细想想,其实我们记笔记的时候需要记录这么多吗?需要从幼儿园到小学到初中到高中的笔记都留着吗?

那其实每项的计算只取决于它前面的两项,所以只用保留这两个就好了。

那我们可以用一个长度为 2 的数组来计算,或者就用 2 个变量。

更新代码:

class Solution {
    public int fib(int N) {
        int a = 0;
        int b = 1;
        if(N == 0) {
            return a;
        }
        if(N == 1) {
            return b;
        }
        for(int i = 2; i <= N; i++) {
            int tmp = a + b;
            a = b;
            b = tmp;
        }
        return b;
    }
}复制代码

这样我们就把空间复杂度优化到了 O(1),时间复杂度和用数组记录一样都是 O(n).

这种方法其实就是动态规划 Dynamic Programming,写出来的代码非常简单。

那我们比较一下 Recursion 和 DP:

Recursion 是从大到小,层层分解,直到 base case 分解不了了再组合返回上去; DP 是从小到大,记好笔记,不断进步。 也就是 Recursion + Cache = DP

如何记录这个笔记,如何高效的记笔记,这是 DP 的难点。

有人说 DP 是拿空间换时间,但我不这么认为,这道题就是一个很好的例证。

在用递归解题时,我们可以看到,空间是 O(n) 在栈上的,但是用 DP 我们可以把空间优化到 O(1),DP 可以做到时间空间的双重优化。

其实呢,斐波那契数列在现实生活中也有很多应用。

比如在我司以及很多大公司里,每个任务要给分值,1分表示大概需要花1天时间完成,然后分值只有>1,2,3,5,8这5种,(如果有大于8分的任务,就需要把它 break down 成8分以内的,以便大家在>两周内能完成。) 因为任务是永远做不完的而每个人的时间是有限的,所以每次小组会开会,挑出最重要的任务让大家来>做,然后每个人根据自己的 available 的天数去 pick up 相应的任务。

那有同学可能会想,这题这么简单,这都 2020 年了,面试还会考么?

答:真的会。

只是不能以这么直白的方式给你了。

比如很有名的爬楼梯问题:

一个 N 阶的楼梯,每次能走一层或者两层,问一共有多少种走法。

这个题这么想:

站在当前位置,只能是从前一层,或者前两层上来的,所以 f(n) = f(n-1) + f(n-2).

这题是我当年面试时真实被问的,那时我还在写 python,为了炫技,还用了lambda function:

f = lambda n: 1 if n in (1, 2) else f(n-1) + f(n-2)复制代码

递归的写法时间复杂度太高,所以又写了一个 for loop 的版本

def fib(n)
  a, b = 1, 1
  for i in range(n-1):
    a, b = b, a+b
  return a 复制代码

然后还写了个 caching 的方法:

def cache(f):
    memo = {}
    def helper(x):
        if x not in memo:
            memo[x] = f(x)
        return memo[x]
    return helper
@cache
def fibR(n):
    if n==1 or n==2: return 1
    return fibR(n-1) + fibR(n-2)复制代码

还顺便和面试官聊了下 tail recursion:

tail recursion 尾递归:就是递归的这句话是整个方法的最后一句话。

那这个有什么特别之处呢?

尾递归的特点就是我们可以很容易的把它转成 iterative 的写法,当然有些智能的编译器会自动帮我们做了(不是说显性的转化,而是在运行时按照 iterative 的方式去运行,实际消耗的空间是O(1))

那为什么呢?

因为回来的时候不需要 backtrack,递归这里就是最后一步了,不需要再往上一层返值。

def fib(n, a=0, b=1):
    if n==0: return a
      if n==1: return b
    return fib(n-1, b, a+b)复制代码

最终,拿出了我的杀手锏:lambda and reduce

fibRe = lambda n: reduce(lambda x, n: [x[1], x[0]+x[1]], range(n), [0, 1])复制代码

看到面试官满意的表情后,就开始继续深入的聊了...

所以说,不要以为它简单,同一道题可以用七八种方法来解,分析好每个方法的优缺点,引申到你可以引申的地方,展示自己扎实的基本功,这场面试其实就是你 show off 的机会,这样才能骗过面试官啊~l

【STM32Cube_14】使用硬件I2C读写环境光强度传感器(BH1750) 本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外设读取环境光强度传感器数据(BH1750) 阅读详情

相关推荐

“迎圣诞,拿大奖” 活动赛题 Web-SQLi

1. php中sprintf()函数漏洞原理及其利用; 2. mysql盲注语法及python脚本; 3. sqlmap的需要进一步学习;

qq_34106499的博客 674

Java8 归约 reduce

Java8 归约 reduce 本节将看到如何把一个流中的元素组合起来,使用reduce操作来表达更复杂的查询,比如“计算菜单中的总的卡路里”或“菜单中卡路里最高的菜时哪一个”。此类查询需要将流中所有元素反复结合起来,得到一个值,比如一个Integer。这样的查询可以被归类为归约操作(将流归约成一个值)。用函数式编程语言的术语来说,这称为折叠(fold),因为你可以将一个操作看成一张长长的纸(你...

有梦的博客 2034

转录因子详细介绍(motif)

转录因子详细介绍(motif) TF: transcription factor转录因子TFBS: transcription factor binding site转录因子结合位点TFBS是序列内的location,TF特异结合在这里,这个site有这种特点 1 和一些参考相关的一个位置(开始,结束,strand),这些reference可以是染色体开始,geneTSS。也可以是一段sequence 2 A SITE可以是实验证实的(已知的),也可以是一些算法(预测的) 3 例子,下面这个图是酵母

wangprince2017 3万+

纠结了好久的递归算法,终于彻底搞明白...

对于递归算法,我之前是真的半懂不懂,着实无奈,总抱着以后能懂的想法。现在学到的内容却发现递归是真的不懂。平时我们对于递归算法的要求比较低,因为觉得它的效率很低,但是它对于一些问题却能帮我们快速地解决,所以为了彻底搞懂它想了好久,一天两天了吧…希望这篇文章对你有帮助。 目录1.递归的概念:2.递归的优缺点:3.递归的执行过程:4.五种情况输出顺序去理解递归4.1.数的阶乘(单层递归)4.2.二叉树的...

IT博客-wusheng_z 1289

ubuntu 安装node和npm

在ubuntu中经常需要用到node ,npm,因为npm基本会和node同时安装,所以只需要安装node即可。可以使用 nvm(Node Version Manager)来管理你的 Node.js 版本。

风吹落叶的博客 2291

2025.05.28【读书笔记】|如何用SILVA和RFAM数据库高效去除rRNA污染

摘要: 在Ribo-seq等测序数据分析中,清除rRNA污染对结果准确性至关重要。仅使用SILVA数据库可能遗漏5S rRNA污染,建议结合RFAM数据库(特别是RF00001家族)全面清除。操作要点包括:下载两库序列、将RNA碱基U替换为DNA的T、合并序列建立索引,使用bowtie2过滤rRNA reads。注意U/T转换是关键,否则会导致比对失败。该方法能有效提升数据清洁度,为后续分析奠定基础。

979

python 递归(十分厉害的操作我认为)

递归操作其实用处还挺广泛的,个人认为在秋招中也属于面试官常考问题之一。列举几个经典的例子来帮助自己理解一下递归这个牛13的操作。最近才搞懂一点点。 example-1: 实现的阶乘。 这个题如果不知道的递归的我来写,肯定是要写for循环。但是用递归的话其实就很简单了。(递归中要重点考虑终止条件) def jiecheng(n): if n==1: return 1...

iamzxxing的博客 290

深入剖析 Hive 中 CASE WHEN 与 IF 函数的性能差异:解锁高效数据处理的关键

CASE WHEN 函数堪称 Hive 中条件判断的多面手,它具备两种强大的语法形式,以应对各种复杂的业务逻辑。简单 CASE 表达式这种形式适用于对某一列的值进行直接的条件匹配。其语法如下:END例如,我们有一个记录学生成绩的表CASE scoreELSE 'D'搜索 CASE 表达式当业务逻辑需要更灵活的条件判断时,搜索 CASE 表达式便派上用场。它的语法为:CASEENDCASEELSE 'D'

2401_83088008的博客 1125

这才是递归题正确的打开方式,面试官听了都说精辟

算法思路 大家都知道,一个方法自己调用自己就是递归,没错,但这只是理解递归的最表层的理解。 那么递归的实质是什么? 答:递归的实质是能够把一个大问题分解成比它小点的问题,然后我们拿到了小问题的解,就可以用小问题的解去构造大问题的解。 那小问题的解是如何得到的? 答:用再小一号的问题的解构造出来的,小到不能再小的时候就是到了零号问题的时候,也就是 base case 了。 那么总结一下递归的三个步骤: Base case:就是递归的零号问题,也是递归的终点,走到最小的那个问题,能够直接.

Java架构师联盟 889

如何通过 GitHub Actions 使用 SSH 自动化部署到阿里云 ECS 实例

通过 GitHub Actions 和 SSH 自动化部署,可以显著提高你的开发效率和部署的可靠性。本文介绍了如何生成 SSH 密钥、将公钥添加到阿里云 ECS 实例、将私钥添加到 GitHub Secrets,以及编写 GitHub Actions 工作流来实现自动化部署。希望这篇文章对你有所帮助!

吃面不喝汤的博客 1510

ROS机器人未知环境自主探索功能包explore_lite最全源码详细解析(五)

本系列文章主要针对ROS机器人常使用的未知环境自主探索功能包explore_lite展开全源码的详细解析,并进行概括总结。 本系列文章共包含六篇文章,前五篇文章主要介绍explore_lite功能包中 explore.cpp、costmap_tools.h、frontier_search.cpp、costmap_client.cpp等源码实现文件中全部函数的详细介绍,第六篇文章进行概括总结,包含自主探索功能包explore_lite的简介,实现未知环境自主探索功能的原理及流程总结,效果演示,使用功能包exp

慕羽★的博客 1510

递归调用的简单操作

递归,就是函数在执行时自己调用自己。 首先,要使用递归,待解决的问题有如下两个要求: 原问题能分解为有限个规模更小的子问题; 最小规模的子问题的解能作为递归的出口。 这样来看的话,递归其实是可以转化为非递归的循环语句的。子问题相当于每一次循环执行的操作,递归出口则相当于循环的终止条件。 因为递归这样的特性,对刚接触C语言的新人可能会比较难以理解。 下面举一些简单的例子。 1.递归实现计算一个数...

weixin_44788162的博客 244

使用openclaw出现blocked URL fetch (url-fetch) reason=Blocked: resolves to private/internal/special 解决方案

本文主要介绍了使用openclaw出现blocked URL fetch (url-fetch) target=https://news.google.com/search reason=Blocked: resolves to private/internal/special-use IP address 解决方案,希望能对使用xx的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

详解「递归」正确的打开方式

前言 递归,是一个非常重要的概念,也是面试中非常喜欢考的。因为它不但能考察一个程序员的算法功底,还能很好的考察对时间空间复杂度的理解和分析。 本文只讲一题,也是几乎所有算法书讲递归的第一题,但力争讲出花来,在这里分享四点不一样的角度,让你有不同的收获。 时空复杂度的详细分析 识别并简化递归过程中的重复运算 披上羊皮的狼 适当炫技助我拿到第一份工作 算法思路 大家都知道,一个方法自己调用自己就是递归,没错,但这只是对递归最表层的理解。 那么递归的实质...

qq_28938511的博客 278

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

这才是面试官想听的:详解「递归」正确的打开方式

前言 递归,是一个非常重要的概念,也是面试中非常喜欢考的。因为它不但能考察一个程序员的算法功底,还能很好的考察对时间空间复杂度的理解和分析。 本文只讲一题,也是几乎所有算法书讲递归的第一题,但力争讲出花来,在这里分享四点不一样的角度,让你有不同的收获。 时空复杂度的详细分析 识别并简化递归过程中的重复运算 披上羊皮的狼 适当炫技助我拿到第一份工作 算法思路 大家都知道,一个方法自己调用自己...

码农田小齐 4566

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

详解【递归】的正确打开方式

老和尚给小和尚讲故事,故事是:从前有座山,山里有个庙,庙里有个老和尚,老和尚给小和尚讲故事,故事是......

林高禄 9595

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

这才是面试官想听的:详解「递归题」正确的打开方式

前言 递归,是一个非常重要的概念,也是面试中非常喜欢考的。因为它不但能考察一个程序员的算法功底,还能很好的考察对时间空间复杂度的理解和分析。 本文只讲一题,也是几乎所有算法书讲递归的第一题,但力争讲出花来,在这里分享四点不一样的角度,让你有不同的收获。 时空复杂度的详细分析 识别并简化递归过程中的重复运算 披上羊皮的狼 适当炫技助我拿到第一份工作 算法思路 大家都知道,一个方法自己调用自己就是递归,没错,但这只是理解递归的最表层的理解。 那么递归的实质是什么? 答:递归的实质是能够把一个大问题分解成比它

weixin_46577306的博客 506

excel结束某个递归_正确的「递归」打开方式

文章整理:加米谷大数据调用通常发生在彼此不同的函数之间。其实,函数还有一种特殊的调用方式,那就是自己调用自己,这种方式称为函数递归调用。递归,在程序设计中也是一个常用的技巧,甚至是一种思维方式,非常值得我们掌握。本文选自《Python极简讲义:一本书入门数据分析与机器学习》一书,将与我们一同探讨函数的递归,并在文末与大家分析了谷歌经典递归面试题。01 感性认识递归 在讲解“递归”这个抽象概念之前,...

weixin_33678821的博客 543

递归查询控制层级_正确的「递归」打开方式

调用通常发生在彼此不同的函数之间。其实,函数还有一种特殊的调用方式,那就是自己调用自己,这种方式称为函数递归调用。递归,在程序设计中也是一个常用的技巧,甚至是一种思维方式,非常值得我们掌握。本文选自《Python极简讲义:一本书入门数据分析与机器学习》一书,将与我们一同探讨函数的递归,并在文末与大家分析了谷歌经典递归面试题。01 感性认识递归 在讲解“递归”这个抽象概念之前,让我们来重温一下昔...

weixin_34733070的博客 417

实用贴丨正确的「递归」打开方式:让计算机像计算机一样去计算

调用通常发生在彼此不同的函数之间。其实,函数还有一种特殊的调用方式,那就是自己调用自己,这种方式称为函数递归调用。递归,在程序设计中也是一个常用的技巧,甚至是一种思维方式,非常值得我们掌握。 本文选自《Python极简讲义:一本书入门数据分析与机器学习》一书,将与我们一同探讨函数的递归,并在文末与大家分析了谷歌经典递归面试题。 01 感性认识递归 在讲解“递归”这个抽象概念之前,让我们来重温一下昔日往事。 小时候,当我们在缠着长辈讲故事时,长辈们可能就用下面的故事来“忽悠”我们: 从前有座山,山里有座...

博文视点(北京)官方博客 963

算法入门——递归的理解

在计算机这个行业,特别是做算法的萌新们,在学习算法或者程序设计时都会遇到一个问题,那就是递归。对于递归,再书上通常就是这样一句话,程序或者方法自己调用自己。萌新们的问题可能就出在这句话上了,那么究竟什么叫做自己调用自己呢?这怎么个调用的方式呢?是把自己所有的代码再跑一次还是什么呢?其实,要回答这几个问题就要想明白这种调用对应什么结构,然后有了清晰的结构自然就能够明白这句话的具体内涵是什么了。  

Lucine_Bill的博客 910

(专栏索引版) leetcode高效刷题路径正确打开方式

(专栏索引版) leetcode高效刷题路径正确打开方式

qq_46118239的博客 740
上一篇: 高性能架构面试题总结
下一篇: Web中的Spring
java架构学习基地
博客等级 码龄6年 8粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值