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

数据结构-递归

如何理解“递归”? 递归是一种应用非常广泛的算法(或者编程技巧)。之后我们要讲的很多数据结构和算法的编码实现都要用到递归,比如 DFS 深度优先搜索、前中后序二叉树遍历等等。...所以,搞懂递归非常重要,否则,后面复杂一些的数据结构和算法学起来就会比较吃力。 一个简单例子,电影院里面太黑了,看不清,没法数,请问现在坐在第几排的问题。...刚刚这个例子是非常典型的递归,那究竟什么样的问题可以用递归来解决呢?...为了避免重复计算,我们可以通过一个数据结构(比如散列表)来保存已经求解过的 f(k)。当递归调用到 f(k) 时,先看下是否已经求解过了。...所以,在开发过程中,我们要根据实际情况来选择是否需要用递归的方式来实现。 那我们是否可以把递归代码改写为非递归代码呢?

46520

递归算法 数据结构_数据结构递归的定义

一、什么是递归 所谓递归,简单点来说,就是一个函数直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。...引用知乎大佬的例子: 我们可以把” 递归 “比喻成 “查字典 “,当你查一个词,发现这个词的解释中某个词仍然不懂,于是你开始查这第二个词。...return n * mult(n - 1); } 二、递归和栈的关系 递归的过程就是出入栈的过程 递归的问题实际上都能拆分成出入栈问题,我们可以举上面计算1*2*3*........,此时栈深度就是4,这也叫递归深度 满足停止条件后出栈,mult(1)的结果出栈,与mult(2)的结果出栈相乘,再与随后出栈的mult(3)的结果相乘…..以此类推 递归的本质就是栈的出入过程,所以实际上当深度过深...,超过了jvm规定允许的栈最大深度的时候,就会出现栈溢出的问题,也就是java里的StackOverflowError 三、递归的使用条件 那么,我们是时候可以使用递归来解决问题呢: 当问题可以拆分为子问题

63010
您找到你想要的搜索结果了吗?
是的
没有找到

数据结构与算法-递归

本文为王争老师在『极客时间』中的课程《数据结构与算法之美》的学习笔记,想要学习原文的同学购买相关课程学习。如有侵权请联系作者删除。 如何理解递归?...在学习数据结构与算法的过程中一般都会遇到一个坎——递归。今天我们就来分析分析递归。 首先我们通过一个生活中的例子入手。假如你现在正在排队买票,前面有很多人,怎么才能知道你现在是第几号呢?...如何编写递归代码 理解递归的过程和递归需要满足的条件后,我们接下来想想如何才能写出递归代码来呢?对于递归代码的编写,最重要的是写出递归公式,找到递归终止条件。...,最后将递归公式和递归终止条件翻译成代码。...为了避免重复计算,我们可以通过一个数据结构(比如散列表)来保存已经求解过的 f(k)。当递归调用到 f(k) 时,先看下是否已经求解过了。

63910

数据结构之链表与递归

1、提起链表,有一块非常重要的内容,就是递归,这是因为链表本身具有天然的递归性,同时,链表也是一种结构非常简单的数据结构,使得链表是一种非常好的来学习和研究递归这种逻辑机制的数据结构。...递归函数的调用,本质就是函数调用,和普通函数的调用没有区别,只不过调用的函数是自己而已。 5.1、数组求和,使用递归算法进行计算。递归调用的函数微观解读。 ?...100 * @param depth 递归深度,每一个函数在内部调用一次自己,可以理解为递归深度多了一。 101 * 递归深度帮助理解递归的一个变量。...递归深度每次加一。...7、关于递归,链表具有天然的递归结构,近乎和链表相关的所有操作,都可以使用递归的形式来完成,比如,可以使用递归对链表进行增加,删除,修改和查询操作的。 7.1、双链表的结构。 ?

75720

数据结构与算法 --- 递归(一)

存在递归终止的条件。递归问题必须得有终止条件,否则将会无限循环。 如何编写递归代码 编写递归代码的关键是将符合递归条件的问题公式化,将问题变成递推公式,寻找终止条件,然后根据公式“翻译”为代码。...使用递归编程有利有弊,递归编程的好处是使用递归编写的代码的表达能力强,写起来简洁,而递归编程的劣势是空间复杂度高,且存在堆栈溢出和重复计算的问题,因此,在实际开发过程中,可以根据实际情况来决定是是否使用递归实现...具体来说,可以通过使用一个栈或队列等数据结构来模拟递归函数的调用过程。每当递归函数需要调用自身时,将当前的参数值和程序计数器等信息保存到栈或队列中,然后继续执行下一个语句。...总结 递归式一种高效,简洁的编码模式,只要满足递归的3个条件,就可以使用递归算法去实现。不过,递归代码比较难写,难理解。...递归也有它自己的弊端,比如堆栈溢出,重复计算,函数调用耗时多和空间复杂度高,所以在编写递归算法代码时,要避免出现这些问题。 ❝参考资料 [1] 数据结构与算法之美 / 王争 著.

29020

数据结构与算法 --- 递归(二)

引言 上文数据结构与算法 --- 递归(一) 讲述了什么是递归算法,如何编写递归算法及如何写好递归算法,本文着重讲述一下如何避免递归过深导致的堆栈溢出问题。...函数调用栈是内存中开辟的一块存储空间,它被组织成“栈”这种数据结构,数据先进后出。...讨论尾递归避免堆栈溢出 什么是尾递归? 「尾递归是指一个递归函数的最后一个操作是递归调用自身,并且该调用的返回值直接返回给函数的调用者,而不进行任何其他的计算或处理。这种形式的递归称为尾递归」。...但是在实际开发过程中,尾递归其实并没有太大作用,不能期望它来规避递归导致的堆栈溢出问题,主要表现在: 并不是所有编程语言都支持尾递归优化 并不是所有的递归都可以改成尾递归 能改成尾递归的代码也就都可以改成迭代方式...尾递归代码的可读性差 ❝参考资料 [1] 数据结构与算法之美 / 王争 著.

15010

数据结构与算法 --- 递归(一)

存在递归终止的条件。递归问题必须得有终止条件,否则将会无限循环。 如何编写递归代码 编写递归代码的关键是将符合递归条件的问题公式化,将问题变成递推公式,寻找终止条件,然后根据公式“翻译”为代码。...使用递归编程有利有弊,递归编程的好处是使用递归编写的代码的表达能力强,写起来简洁,而递归编程的劣势是空间复杂度高,且存在堆栈溢出和重复计算的问题,因此,在实际开发过程中,可以根据实际情况来决定是是否使用递归实现...具体来说,可以通过使用一个栈或队列等数据结构来模拟递归函数的调用过程。每当递归函数需要调用自身时,将当前的参数值和程序计数器等信息保存到栈或队列中,然后继续执行下一个语句。...总结 递归式一种高效,简洁的编码模式,只要满足递归的3个条件,就可以使用递归算法去实现。不过,递归代码比较难写,难理解。...递归也有它自己的弊端,比如堆栈溢出,重复计算,函数调用耗时多和空间复杂度高,所以在编写递归算法代码时,要避免出现这些问题。 ❝参考资料 [1] 数据结构与算法之美 / 王争 著.

24320

数据结构与算法:递归算法

递归算法 什么是递归? 函数直接或间接调用自身的过程称为递归,相应的函数称为递归函数。使用递归算法,可以很容易地解决某些问题。...需要基本条件来停止递归,否则会发生无限循环。 算法步骤 在函数中实现递归的算法步骤如下: 第1步: 定义基本情况:确定解决方案已知最简单情况。这是递归的停止条件,因为它防止函数无限地调用自身。...步骤2: 定义递归情况:用更小的子问题来定义问题。将问题分解为更小的子问题,并递归调用函数来解决每个子问题。 步骤3: 确保递归终止:确保递归函数最终到达基本情况,并且不会进入无限循环。...递归函数如何存储在内存中? 递归使用更多内存,因为递归函数会在每次递归调用时将值添加到堆栈中,并将值保留在那里,直到调用完成。递归函数使用 LIFO(后进先出)结构,就像堆栈数据结构一样。...直接递归和间接递归有什么区别? 如果函数 fun 调用相同的函数 fun,则该函数被称为直接递归

11610

数据结构与算法之递归系列

而且有了这篇文章的支撑和动力,往后还会写出关于数据结构与算法一些难懂的概念简单化。如果文章中有错误的地方,希望大家指正,能够为他人分享出更有质量的文章!...什么问题该用递归,什么问题用递归简洁,什么问题就不能使用递归解决,以及对于特定的问题用递归解决的陷阱,能不能进一步对递归进行二次优化,这些都是今天小鹿分享的内容。...什么是递归 递归,顾名思义,有递有归才叫递归,有递无归,有归无递那叫 “耍流氓” 。...后来我就开始刷了一个月的 LeetCode 题,发现递归数据结构与算法中有着一席之地,统治着江山。...2)函数中变量是存储到系统中的栈中的,栈数据结构的特点就是先进后出,后进先出。一个函数中的变量的使用情况就是随函数的声明周期变化的。

68530

怒肝 JavaScript 数据结构递归

前面我们学习了很多线性的数据结构,包括数组,栈,队列,链表等,当需要操作其中的元素时,大多时候是通过遍历数据结构来实现的。 接下来我们会学习更复杂的数据结构 —— 树和图。...这两种数据结构的元素连接关系非常复杂,不是靠简单的遍历就能全部捕获到的。 因此,在学习这两个复杂数据结构之前,我们需要弄明白一个基本操作,这个操作就是 递归。...本篇要讲的递归并不是一个数据结构,只是为了学好后面的复杂数据结构,需要我们必须补充的一个基本技能,因此单独拎出来介绍。 什么是递归 递归其实大家多多少少都使用过。...总结 本篇介绍了递归的概念和如何使用递归,然后用递归实现了数的阶乘。最后我们还介绍了如何在浏览器更好的调试递归函数,相信你看完这篇对递归的理解更深了。...下一篇,我们继续用递归,实现著名的斐波那契数列。 本文来源公众号:程序员成功。这是学习 JavaScript 数据结构与算法的第 20 篇,本系列会连续更新一个月。

47420

Java数据结构和算法(八)——递归

什么是递归,上面的小故事就是一个明显的递归。以编程的角度来看,程序调用自身的编程技巧称为递归( recursion)。   百度百科中的解释是这样的:递归做为一种算法在程序设计语言中广泛应用。...递归的能力在于用有限的语句来定义对象的无限集合。 1、递归的定义   递归,就是在运行的过程中调用自己。   ...递归必须要有三个要素:   ①、边界条件   ②、递归前进段   ③、递归返回段   当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 2、求一个数的阶乘:n! n!...O(logN),递归的二分查找更加简洁,便于理解,但是速度会比非递归的慢。...,把递归的算法转换为非递归的算法是非常有用的。

1.2K70

数据结构与算法之递归系列

而且有了这篇文章的支撑和动力,往后还会写出关于数据结构与算法一些难懂的概念简单化。如果文章中有错误的地方,希望大家指正,能够为他人分享出更有质量的文章!...什么问题该用递归,什么问题用递归简洁,什么问题就不能使用递归解决,以及对于特定的问题用递归解决的陷阱,能不能进一步对递归进行二次优化,这些都是今天小鹿分享的内容。...什么是递归 递归,顾名思义,有递有归才叫递归,有递无归,有归无递那叫 “耍流氓” 。...后来我就开始刷了一个月的 LeetCode 题,发现递归数据结构与算法中有着一席之地,统治着江山。...2)函数中变量是存储到系统中的栈中的,栈数据结构的特点就是先进后出,后进先出。一个函数中的变量的使用情况就是随函数的声明周期变化的。

72320

数据结构与算法之递归系列

而且有了这篇文章的支撑和动力,往后还会写出关于数据结构与算法一些难懂的概念简单化。如果文章中有错误的地方,希望大家指正,能够为他人分享出更有质量的文章!...什么问题该用递归,什么问题用递归简洁,什么问题就不能使用递归解决,以及对于特定的问题用递归解决的陷阱,能不能进一步对递归进行二次优化,这些都是今天小鹿分享的内容。...什么是递归 递归,顾名思义,有递有归才叫递归,有递无归,有归无递那叫 “耍流氓” 。...后来我就开始刷了一个月的 LeetCode 题,发现递归数据结构与算法中有着一席之地,统治着江山。...2)函数中变量是存储到系统中的栈中的,栈数据结构的特点就是先进后出,后进先出。一个函数中的变量的使用情况就是随函数的声明周期变化的。

69520

JavaScript 数据结构与算法之美 - 递归

因为之后要讲有内容和算法,其代码的实现都要用到递归,所以,搞懂递归非常重要。 2. 定义 方法或函数调用自身的方式称为递归调用,调用称为递,返回称为归。简单来说就是:自己调用自己。...递归常见问题及解决方案 警惕堆栈溢出:可以声明一个全局变量来控制递归的深度,从而避免堆栈溢出。 警惕重复计算:通过某种数据结构来保存已经求解过的值,从而避免重复计算。 6. 如何实现递归 ? 1....递归代码理解 对于递归代码,若试图想清楚整个递和归的过程,实际上是进入了一个思维误区。 那该如何理解递归代码呢 ?...数据结构格式,参考如下代码: const json = { name: 'A', children: [ { name: 'B', children: [...文章输出计划 JavaScript 数据结构与算法之美 的系列文章,坚持 3 - 7 天左右更新一篇,暂定计划如下表。

49130

【C语言数据结构】排序(快速排序及多种优化|递归及非递归版本)

这是单趟的,后续过程重复,可以思考二叉树的递归过程,快排递归与其相似(见下图)。 下图中,划红线的地方是容易出错的地方。 理解了前面,这里解释一下为什么相遇位置比keyi位置的值要小?...快排优化 三数取中法选key 递归到小的子区间时,可以考虑使用插入排序 三数取中法 快排对于有序的数据,效率不是很高。 如上图,我们前面的快排是固定选key的,也就是左边第一幅图,效率很低。...,递归到最后面几层时,假设还剩7个数,我们还得递归7次,这样明显不好。...非递归版本的快排需要用到栈。...先模拟递归左边,像二叉树递归那样,先入右边的数,再入左边,这样出的时候就先出左边的,然后就可以模拟先往左边递归了。

10010

数据结构】二叉树(遍历,递归

递归结构遍历 上图是要遍历的树的模型。 前序 假设树已构建好,下图是前序遍历的函数,执行后即可得到前序遍历的结果。...下图是递归的流程图: 分析:开始先打印根1,然后递归调用根2,以此类推到3的左子树N。此时左子树遍历完,返回到3的右子树,每次调用完就返回到上一层的函数中。...上图是递归调用占用的大致空间,每次调用完函数,返回到上一层,上一层接着调用,就会重复利用之前销毁的空间,如果空间不足,能用多少是多少。因此,递归的空间复杂度是看递归的深度。...中序 上图是中序遍历的函数,递归过程参考前序遍历过程。 后序遍历大致过程也同上,这里就不再写出。 求节点个数 递归过程图如下: 分析:如果根结点为空,则返回0。...此递归过程会先找出左子树的节点个数,当遇到空节点时就返回0,然后加上根结点自身数量1,返回到上一层,以此类推。 求叶子节点个数 参考前面的递归过程理解。

8510

数据结构排序——详细讲解归并排序(c语言实现递归及非递归

上次是快排和冒泡:数据结构排序——详解快排及其优化和冒泡排序(c语言实现、附有图片与动图示意) 今天为大家带来归并排序 1.基本思想 归并排序是一种分治算法,它将序列分成两个子序列,分别对子序列进行排序...这个过程可以递归地进行,直到序列长度小于等于1时停止递归。...在实际的实现中,可以使用递归或非递归的方式来完成归并排序 2.递归实现 递归归并排序: 如果序列长度小于等于1,无需排序,直接返回 将序列分成两个子序列,分别进行递归归并排序 合并两个已排序的子序列...非递归实现归并排序是一种迭代式的排序算法,它避免了递归调用带来的额外开销,通常使用循环和迭代来实现归并排序的过程: 确定归并区间的思路:对于给定的数组,首先将相邻的元素两两归并(gap=1),然后将归并的区间长度不断扩大...,接下来复制回a中 memcpy(a + i, tmp + i, sizeof(int) * (right2 - i + 1)); } gap *= 2; } } 今天就先讲这么多了,数据结构排序部分也马上迎来了尾声

9510
领券