首页
学习
活动
专区
工具
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和nBig-O表示都是O(n)。...这种方法叫做桶排序 (Bucket Sort) ,那么假设有m个类和n本书,需要比较最大次数就是mn次,而当n很大m比较小时,其中m可被忽略表示成O(n),线性复杂度就这样达成了。...这样超前排序方式一方面让李世民大叹:“天下英雄入轂中矣!”,另一方面也着实漏掉了不少后人公认才子,毕竟一次比赛或考试结果也是由很多因素决定

53330

算法概要

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

45520

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

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

58120

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

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

53720

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

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

3.3K30

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

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

68120

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

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

75990

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

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

41730

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

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

1.2K10

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

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

1.5K60

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

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

87620

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

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

1.3K41

数据结构: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) 递归空间:与递归函数空间和递归深度有关

26110

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

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

90090

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

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

64330

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

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

51010

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

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

93610

二分查找实现和应用汇总

在学习算法过程中,我们除了要了解某个算法基本原理、实现方式,更重要一个环节是利用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

数据结构与算法入门手册

算法类族:递归算法、迭代算法、确定算法、非确定算法、Exact算法、Heuristic算法等。递归算法通过递归解决子问题,迭代通过循环;确定算法每组输入都给出同样输出,非确定算法输出随输入变化。...硬币找零:每次取面值最大硬币,直到零钱数为0。 Prim算法:每次选取与当前树相连权值最小边,直到所有点被选取。 分治算法:通过递归将问题划分为相同或相似子问题,典型例子二分查找、快速排序。...解决冲突常用开放定址与链地址。 开放定址:发生冲突时探测下一空槽位。 链地址:发生冲突时将该键值链入链表。 堆:完全二叉树,支持快速添加、删除和获取最大/小值。可实现优先队列。...KMP算法:通过生成前缀函数 skipi表示模式串中i之前字符串中最长相同前后缀长度, 降低回溯次数。 排序:给元素序列按一定顺序进行排列。...Dijkstra算法:从起点开始向外扩展,每次选取距离起点最近未选定点,直到扩展到终点。适用于有向图。 Floyd算法:通过填充dpi表示i到j最短路径,遍历所有点作为中间点更新最短路径。

54340
领券