首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我对递归函数的Big-O表示法有点困惑

递归函数的Big-O表示法是用来描述递归函数的时间复杂度的一种方法。在计算机科学中,递归函数是一种通过调用自身来解决问题的函数。Big-O表示法是一种用来衡量算法时间复杂度的标记方法,它描述了算法在最坏情况下的运行时间增长率。

对于递归函数的Big-O表示法,通常可以通过递归树来进行分析。递归树是一种图形化的表示方法,它将递归函数的调用过程展示为一棵树状结构。每个节点表示递归函数的一次调用,而边表示函数调用之间的关系。

在分析递归函数的时间复杂度时,需要考虑两个因素:递归的深度和每次递归的操作复杂度。递归的深度表示递归函数被调用的次数,而每次递归的操作复杂度表示递归函数内部的操作所需的时间。

对于递归函数的时间复杂度,可以使用递归树来进行估算。通过观察递归树的结构,可以确定递归的深度和每次递归的操作复杂度。然后,将这两个因素相乘,就可以得到递归函数的时间复杂度。

举个例子,假设有一个递归函数,每次递归的操作复杂度为O(1),递归的深度为n。那么该递归函数的时间复杂度就可以表示为O(n)。

需要注意的是,递归函数的时间复杂度可能会受到递归的深度和每次递归的操作复杂度的影响。如果递归的深度很大,或者每次递归的操作复杂度很高,那么递归函数的时间复杂度可能会很高。

在实际应用中,递归函数的Big-O表示法可以帮助我们评估算法的效率,并选择合适的算法来解决问题。对于递归函数的Big-O表示法的更深入了解,可以参考腾讯云的《算法与数据结构》课程,链接地址:https://cloud.tencent.com/developer/edu/course-100010

总结起来,递归函数的Big-O表示法是用来描述递归函数的时间复杂度的一种方法。通过分析递归树,可以确定递归的深度和每次递归的操作复杂度,从而得到递归函数的时间复杂度。在实际应用中,递归函数的Big-O表示法可以帮助我们评估算法的效率,并选择合适的算法来解决问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Reading Club | 算法和人生选择:如何给洗好的袜子排序呢?

Big-O 偷懒的计算机科学家们从数学里借来了Big-O表示法,O 表示 order of function (函数的阶),而计算机科学里习惯称计算复杂度。...所以收拾房间和准备晚餐的时间一个是O(1)一个是O(n),那么到目前为止你所花费的时间用Big-O表示是不是就是O(n+1)呢?并不是。...Big-O表示法关注的并不是一个具体的数值,而是一个计算的复杂级别,这是因为n非常大时,往往低级别的计算复杂度可以直接忽略。还有n前的常数项都要省去,比如2n和n的Big-O表示法都是O(n)。...这种方法叫做桶排序 (Bucket Sort) 法,那么假设有m个类和n本书,需要比较的最大次数就是mn次,而当n很大m比较小时,其中m可被忽略表示成O(n),线性复杂度就这样达成了。...这样超前的排序方式一方面让李世民大叹:“天下英雄入我轂中矣!”,另一方面也着实漏掉了不少后人公认的才子,毕竟一次比赛或考试的结果也是由很多因素决定的。

54830

算法概要

算法虐我千万遍,我待算法如初恋;IT人永远逃脱不了的算法 概念 算法是特定问题求解步骤的描述,在计算机中表现为指令的有限序列 算法是独立存在的一种解决问题的方法和思想 对于算法而言,实现的语言并不重要,...大O表示法 大O表示法被用来描述一个算法的性能或复杂度。...大O表示法可以用来描述一个算法的最差情况,或者一个算法执行的耗时或占用空间(例如内存或磁盘占用) 假设一个算法的时间复杂度是 O(n),n在这里代表的意思就是数据的个数。...,只关心复杂度最重要的部分 规律 Big-O 2 O(1) --> 就是一个常数 2n + 10 O(n) --> n 对整体结果会产生最大影响...下面的例子同时也表明了大O表示法其实是用来描述一个算法的最差情况的:在for循环中,一旦程序找到了输入数据中与第二个传入的string匹配时,程序就会提前退出,然而大O表示法却总是假定程序会运行到最差情况

46720
  • 【经典干货】GitHub标星10万+,史上最强Google面试指南!

    为何写这篇教程 作者Washam本人并非计算机学位,但在儿时就已经展现出对计算机的浓厚兴趣,从事的工作是关于web程序的构建、服务器的构建。 作为一名非专业人士转行,Washam已经算是相当成功。...然后补充计算机专业的基础数学知识,如算法复杂度 / Big-O / 渐进分析法、数据结构、树、排序、图论。 ?...此外还有递归、动态规划、组合与概率、NP&NP-完全和近似算法、缓存、线程与进程、系统设计、可伸缩性、数据处理。 看到这么多知识点,你会不会觉得有点懵呢?Washam告诉你一点小技巧。...所以需要把要回顾的知识点做成抽认卡(flashcard):正常的及带有代码的,类似于背单词。 ? 每种卡都会有不同的格式设计。项目主页中就有抽认卡的源代码,可以根据自己的学习特点去制作。...Washam还留有一组 ASCII 码表、OSI 堆栈、Big-O 记号及更多的小抄纸,以便在空余的时候可以学习。每编程半个小时就要休息一下,并去回顾你的抽认卡。

    62020

    一份来自亚马逊工程师的Google面试指南,GitHub收获9.8万星,已翻译成中文

    为何写这篇教程 作者Washam本人并非计算机学位,但在儿时就已经展现出对计算机的浓厚兴趣,从事的工作是关于web程序的构建、服务器的构建。 作为一名非专业人士转行,Washam已经算是相当成功。...然后补充计算机专业的基础数学知识,如算法复杂度 / Big-O / 渐进分析法、数据结构、树、排序、图论。 ?...此外还有递归、动态规划、组合与概率、NP&NP-完全和近似算法、缓存、线程与进程、系统设计、可伸缩性、数据处理。 看到这么多知识点,你会不会觉得有点懵呢?Washam告诉你一点小技巧。...所以需要把要回顾的知识点做成抽认卡(flashcard):正常的及带有代码的,类似于背单词。 ? 每种卡都会有不同的格式设计。项目主页中就有抽认卡的源代码,可以根据自己的学习特点去制作。...Washam还留有一组 ASCII 码表、OSI 堆栈、Big-O 记号及更多的小抄纸,以便在空余的时候可以学习。每编程半个小时就要休息一下,并去回顾你的抽认卡。

    54720

    python实现斐波那契数列的多种方式

    你要做的,就是做到他们认为你做不到的事情,不是为了向他们证明自己,而是告诉自己『我的人生我做主,我说行,不行也行!』 ?...因为下文中我们需要用时间复杂度衡量一下各算法的效率怎么样,寻找一种最优方法。 ? 上图代表的是大量数据的增加,函数所耗费的时间怎么样。...Element元素 operations 运算,作用 Big-O Complexity Chart 大O表示法时间复杂度图 最简单的实现 a, b= 0, 1 while b < 1000: print...函数实现 1.递推法 首先忽略我代码中无聊的注释方法,哈哈哈~~~~ ############################## # 使用`递推法`实现斐波那契数列 # #############...2.递归法 ############################## # 使用`递归法`实现斐波那契数列 # ############################# def fib_recursive

    3.4K30

    如何更好地理解递归算法?Python实例详解

    维基百科对递归的解释是: ❝递归(英语:Recursion),又译为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。递归一词还较常用于描述以自相似方法重复事物的过程。...实质上,递归就是把一个大问题不断拆解,像剥洋葱一样,最终拆解到最小层面,会返回解题结果。 用Python举一个最简单的递归函数例子,讲一讲什么是递归的应用。...大家看上图,递归函数会一层层往下调用,最终到n=1的时候,往上返回结果。...1的整数n:fab(n) = fab(n-1)+ fab(n-2)(递归定义) 其实以上两个递归的案例都可以用数学归纳法来解释,就是高中数学的知识。...除了数学的解释,之前也看到有人对递归更加形象的解释: ❝1、我们已经完成了吗?如果完成了,返回结果。如果没有这样的终止条件,递归将会永远地继续下去。

    73620

    翻译连载 | 第 9 章:递归(上)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

    在这个意义上,我把它放在与正则表达式相同的类别中。递归技术强大但又令人困惑,因此被视为 不值得我们投入努力。 我是递归编程的超级粉丝,你,也可以的!...在这一章节中我的目标就是说服你:递归是一个重要的工具,你应该将它用在你的函数式编程中。当你正确使用时,递归编程可以轻松地描述复杂问题。...对自身进行了两次递归调用,这通常叫作二分递归查找。后面我们将会更多地讨论二分递归查找。 在整个章节中,我们将会用不同形式的 fib(..)...虽然这些相互递归的示例有点不切实际,但是在更复杂的使用场景下,相互递归是非常有用的。 为什么选择递归? 现在我们已经给出了递归的定义和说明,下面来看下,为什么说递归是有用的。...在阅读整个实现过程中,与命令式的方法相比,我所做这个例子的推理过程更加直接,核心点更加突出,少做无用功;比 for 循环中引用 无穷数值 这一方法 更具有声明性。

    77790

    算法细节系列(9):动态规划之01背包

    曾困惑我的一点在于它的准确性,我始终不理解为什么递归最后能引向正确答案。...(感性的认识) 动态规划思想来源 重复子问题对我来说有点难以分析,这要看具体的问题场景,但在分析重复子问题相对复杂的情况下,我们不管三七二十一,可以在它的搜索路径上记录状态,而为了记录状态,我们需要【标识...所以,如果对记忆化搜索不熟练的话,容易犯以上错误。 总结 简单总结一下我所理解的动态规划。就拿01背包问题来说,它的解法可以非常暴力,直接用递归,对每种情况进行遍历,但我们看到。...既然存在重复子问题,我们需要在递归时把这些状态给区分出来,所以我们有了dp数组,也就是第二种记忆化方案,而这才是我认为动态规划的雏形或者叫精髓,用唯一标识表示状态(唯一标识变量需要我们去寻找)。...既然有了递归,而递归本质上是数学归纳法的逆向过程,而且很大程度上记忆化搜索依赖递归的解法,如果对递归不熟悉容易出现记忆化搜索失灵,与其这样,我们不如由递归式写出递推式,建立初始态,和状态转移递推式,以迭代的方式一步步求解正确解

    43530

    时间复杂度分析,这个很多人都不知道,更别谈会了!

    关于时间复杂度和空间复杂度分析的文章其实不少,但大多数都充斥着复杂的数学计算,让很多读者感到困惑,我就不跟大家扯皮了,关于什么是渐近分析、最坏时间复杂度、平均时间复杂度和最好的时间复杂度,以及大 记法等等...很多算法都是基于递归思想的,我们分析这些递归算法,可以得到关于时间复杂度的递归关系式。比如 「归并排序」 的时间复杂度一般表示为 ,还有二分查找,汉诺塔问题等等,但是关于递归的时间复杂度并不简单。...对于递归的时间复杂度的计算主要有三种方式: 一、代入法:先对解进行猜想,然后用数学归纳法证明猜想的正确性。 已知 ,注意 前面的系数 ; 又很容易得到 和 之间的关系式,即 ....二、主定理 令 和 是常数, 是一个函数, 是定义在非负整数上的递归式: 其中我们将 解释为 或 ,那么 有如下渐近界: 若对某个常数 有 ,则 . 若 ,则 ....为了绘制递归树,我们从给定的递归开始,不断绘制,直到在级别之间找到一个模式。通常是算术或几何级数。 以递归关系 为例,其递归树可以表示为: ? 我们进一步打开表达式 ,以及表达式 : ?

    1.3K10

    GitHub上最励志的计算机自学教程:8个月,从中年Web前端到亚马逊百万年薪软件工程师 | 中文版

    Washam表示: 无论你要面试哪家软件公司,这里的项目可以让你做好充分的准备,包括像亚马逊、Facebook、谷歌和微软这样的科技巨头。...然后补充计算机专业的基础数学知识,如算法复杂度 / Big-O / 渐进分析法、数据结构、树、排序、图论。 ?...此外还有递归、动态规划、组合与概率、NP&NP-完全和近似算法、缓存、线程与进程、系统设计、可伸缩性、数据处理。 看到这么多知识点,你会不会觉得有点懵呢?Washam告诉你一点小技巧。...一个优秀的软件工程师应该精通数据结构和算法、汇编语言、内存设计等,还要综合考虑代码和程序结构对机器在应用场景下的影响。 于是他以这份谷歌试题为指导,开始了编程自学。...切忌「我觉得……」。 二、视频比看书效率更高 观看视频的学习效率自然要比自己啃书快。 找到好的教学视频,意味着你有更多的时间实际演练编程题目。 ?

    90120

    算法导论第四章分治策略剖根问底(二)

    解递归式的三种方法 这里有三种方法:代入法、递归树法和主方法。(下面这一部分结合有些网友的总结和我的总结得来) 代入法: 定义:先猜测某个界的存在,再用数学归纳法去证明该猜测的正确性。...用途:画出一个递归树是一种得到好猜测的直接方法。 分析(重点):在递归树中,每一个结点都代表递归函数调用集合中一个子问题的代价。...通过上面的讲述,我相信自己应该讲清楚了这三种方法,你也许还是有些困惑,但没关系,你只是缺乏例子的引导,下面我们就来看几个例子,其充分应用到了这三种方法。...递归树法: 1)、对递归式T(n) = 3T(n/2) +n,利用递归树确定一个好的渐近上界,用代入法进行验证。 ?...2)、对递归式T(n) = T(n/2) + n2,利用递归树确定一个好的渐近上界,用代入法进行验证。 ? 主方法: 1)、对于下列递归式,使用主方法求出渐近紧确界。

    1.6K60

    关于回溯算法,你该了解这些!

    「所以以下讲解中,回溯函数也就是递归函数,指的都是一个函数」。 回溯法的效率 回溯法的性能如何呢,这里要和大家说清楚了,「虽然回溯法很难,很不好理解,但是回溯法并不是什么高效的算法」。...如何理解回溯法 「回溯法解决的问题都可以抽象为树形结构」,是的,我指的是所有回溯法的问题都可以抽象为树形结构!...在讲二叉树的递归中我们说了递归三部曲,这里我再给大家列出回溯三部曲。 回溯函数模板返回值以及参数 在回溯算法中,我的习惯是函数起名字为backtracking,这个起名大家随意。...如果从来没有学过回溯算法的录友们,看到这里会有点懵,后面开始讲解具体题目的时候就会好一些了,已经做过回溯法题目的录友,看到这里应该会感同身受了。...今天是回溯算法的第一天,按照惯例Carl都是先概述一波,然后在开始讲解具体题目,没有接触过回溯法的同学刚学起来有点看不懂很正常,后面和具体题目结合起来会好一些。 在留言区留下你的思路吧!

    1.5K41

    数据结构:1. 绪论

    图状结构:数据元素之间是多对多的关系。 ---- 1.2.2 数据的存储结构 ---- 概念: 存储结构是指数据结构在计算机中的表示(又称映像),也称物理结构。...---- 1.4.2 算法的时间复杂度 ---- 概念: 算法执行时间的这一变化趋势可表示为输入规模的一个函数,称作该算法的时间复杂度(time complexity)。...估计方法: 大\mathcal{O}记号(big-O notation):我们关注 T(n) 的上界,则时间复杂度的公式可以表示为 T(n) = \mathcal{O}(f(n))。...估计方法: 大\mathcal{O}记号(big-O notation):我们关注 S(n) 的上界,则时间复杂度的公式可以表示为 S(n) = \mathcal{O}(g(n))。...常见量级: 常量空间 \mathcal{O}(1) 线性空间 \mathcal{O}(n) 二维空间 \mathcal{O}(n^2) 三维空间 \mathcal{O}(n^3) 递归空间:与递归函数的空间和递归深度有关

    28010

    要想学机器学习,先科学把妹!

    3、尾递归把妹法 尾递归是针对传统的递归算法而言的,传统的递归算法在很多时候被视为洪水猛兽。它的名声狼籍,好像永远和低效联系在一起。...尾递归就是从最后开始计算,每递归一次就算出相应的结果,也就是说,函数调用出现在调用者函数的尾部,因为是尾部,所以根本没有必要去保存任何局部变量。...因此,只需要在递归函数的尾部返回妹子在下一天吃完早餐之后的返回值,即可实现尾递归。 由于尾递归并不需要额外的堆栈空间,因此,可以更高效地获得妹子的最终返回值。...(她并不知道会是谁放的) 原则是:她没有对你示好,就不放,她有一点点好,就通过放早餐(正强化),她如果对你表示厌恶,可以用不动声色的负强化(具体的可以参考她讨厌什么)。...此法经济实惠,缺陷是有点耗时间,不过爱因斯坦的粉丝应该不缺时间。 ? 10、凯恩斯和货币主义把妹法 货币主义:每天早上在MM的桌子上放固定的RMB,以供MM购买早餐。钱的多少根据CPI来浮动。

    92990

    【数据结构】初识数据结构与复杂度总结

    ,而只需要大概执行次数,那么这里我们使用大O的渐进表示法 那么要求大概值,哪个表达式对次数影响最大呢,是不是N^2 最大,我么可以这样想一下,如果N越来越大,后面俩表达式2*N和10是不是对时间复杂度影响越来越小...,我们取极限,那后面俩就没影响,只有N^2对次数影响特别大,所以只保留这一项,我们也可以从这里看出来,若为多项式,我们只取次数高的那一项 那么这个函数的时间复杂度为O(N^2) 这也就是大O的渐进表示法...O(N^2) 我们继续看一个 这个是不是也是有点眼熟,对我之前总结的猜数字游戏里的二分查找,那它的时间复杂度是多少那,我们先来想一想这个函数怎么实现的,是每次查找缩小一半范围,相当于除2,查找一次除一次...2,那N次就是除N个2,那时间复杂度不就是除2的次数嘛,那不就是log2N嘛,用大O表示就是O(N)=log2N 我们再来看一个 还记得这个吧,没错这个也是我之前总结的递归问题中的青蛙跳台阶——斐波那契数列...递归函数在创建函数栈帧的特点,第一列的函数栈帧创建完,调用完再销毁,后几列的函数递归再用第一列的曾经函数栈帧所用的空间,不会额外再开辟新的函数栈帧,简单来说就是第一列函数递归的深度就是它的空间复杂度,后面的函数递归

    8010

    为什么你学不会递归?告别递归,谈谈我的经验

    递归的三大要素 第一要素:明确你这个函数想要干什么 对于递归,我觉得很重要的一个事就是,这个函数的功能是什么,他要完成什么样的一件事,而这个,是完全由你自己来定义的。...这就是递归最重要的三要素,每次做递归的时候,你就强迫自己试着去寻找这三个要素。 还是不懂?没关系,我再按照这个模式讲一些题。 有些有点小基础的可能觉得我写的太简单了,没耐心看?...1、第一递归函数功能 假设 f(n) 的功能是求青蛙跳上一个n级的台阶总共有多少种跳法,代码如下: int f(int n){ } 2、找出递归结束的条件 我说了,求递归结束的条件,你直接把...第一种跳法:第一次我跳了一个台阶,那么还剩下n-1个台阶还没跳,剩下的n-1个台阶的跳法有f(n-1)种。...1、定义递归函数功能 假设函数 reverseList(head) 的功能是反转但链表,其中 head 表示链表的头节点。

    83330

    为什么你学不会递归?告别递归,谈谈我的一些经验

    这就是递归最重要的三要素,每次做递归的时候,你就强迫自己试着去寻找这三个要素。 还是不懂?没关系,我再按照这个模式讲一些题。 有些有点小基础的可能觉得我写的太简单了,没耐心看?...1、第一递归函数功能 假设 f(n) 的功能是求青蛙跳上一个n级的台阶总共有多少种跳法,代码如下: 1int f(int n){ 2 3} 2、找出递归结束的条件 我说了,求递归结束的条件,你直接把 n...第一种跳法:第一次我跳了一个台阶,那么还剩下n-1个台阶还没跳,剩下的n-1个台阶的跳法有f(n-1)种。...1、定义递归函数功能 假设函数 reverseList(head) 的功能是反转但链表,其中 head 表示链表的头节点。...有些人可能觉得讲的有点简单,没事,我后面会找一些不怎么简单的题。最后如果觉得不错,还请给我转发 or 点赞一波!

    95210

    为什么你学不会递归?告别递归,谈谈我的一些经验

    这就是递归最重要的三要素,每次做递归的时候,你就强迫自己试着去寻找这三个要素。 还是不懂?没关系,我再按照这个模式讲一些题。 有些有点小基础的可能觉得我写的太简单了,没耐心看?...1、第一递归函数功能 假设 f(n) 的功能是求青蛙跳上一个n级的台阶总共有多少种跳法,代码如下: 1int f(int n){ 2 3} 2、找出递归结束的条件 我说了,求递归结束的条件,你直接把 n...第一种跳法:第一次我跳了一个台阶,那么还剩下n-1个台阶还没跳,剩下的n-1个台阶的跳法有f(n-1)种。...1、定义递归函数功能 假设函数 reverseList(head) 的功能是反转但链表,其中 head 表示链表的头节点。...有些人可能觉得讲的有点简单,没事,我后面会找一些不怎么简单的题。最后如果觉得不错,还请给我转发 or 点赞一波! (完)

    52110

    二分查找法的实现和应用汇总

    在学习算法的过程中,我们除了要了解某个算法的基本原理、实现方式,更重要的一个环节是利用big-O理论来分析算法的复杂度。在时间复杂度和空间复杂度之间,我们又会更注重时间复杂度。...时间复杂度按优劣排差不多集中在: O(1), O(log n), O(n), O(n log n), O(n2), O(nk), O(2n) 到目前位置,似乎我学到的算法中,时间复杂度是O(log n)...二分查找法的基本实现 二分查找法在算法家族大类中属于“分治法”,分治法基本都可以用递归来实现的,二分查找法的递归实现如下: int bsearch(int array[], int low, int high...stack来解递归,所以二分查找法也可以不用递归实现,而且它的非递归实现甚至可以不用栈,因为二分的递归其实是尾递归,它不关心递归前的所有信息。...因为这样可以为二分查找法写一个template,又能减少对目标对象的要求。

    1.1K50
    领券