定义:
在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。递归一词还较常用于描述以自相似方法重复事物的过程。例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现的。也可以理解为自我复制的过程。
例子:
- 从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?‘从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……’”
-
一只狗来到厨房,偷走一小块面包。厨子举起杓子,把那只狗打死了。于是所有的狗都跑来了,给那只狗掘了一个坟墓,还在墓碑上刻了墓志铭,让未来的狗可以看到:“一只狗来到厨房,偷走一小块面包。厨子举起杓子,把那只狗打死了。于是所有的狗都跑来了,给那只狗掘了一个坟墓,还在墓碑上刻了墓志铭,让未来的狗可以看到:‘一只狗来到厨房,偷走一小块面包。厨子举起杓子,把那只狗打死了。于是所有的狗都跑来了,给那只狗掘了一个坟墓,还在墓碑上刻了墓志铭,让未来的狗可以看到……’”
程序语言中的递归:
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
递归的条件:
一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
- 基线条件 base case 函数不再调用自己
- 递归条件 函数调用自己
构成递归需具备的条件:
- 子问题须与原始问题为同样的事,且更为简单;
- 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
递归的缺点:
递归算法解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。
栈:
实例:求阶乘
def factorial(n): if n == 1: return n else: return n*factorial(n-1) |
上例中,n==1是基线条件(base case),n $\neq$ 1是递归条件(recursive case)。
栈
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈是限定仅在表头进行插入和删除操作的线性表。
堆叠数据结构使用两种基本操作:推入(push)和弹出(pop):
- 推入:将数据放入堆叠的顶端(阵列形式或串列形式),堆叠顶端top指标加一。
- 弹出:将顶端数据资料输出(回传),堆叠顶端资料减一。
栈的基本特点:
- 先入后出,后入先出。
- 除头尾节点之外,每个元素有一个前驱,一个后继。
相关推荐
读书笔记:android端实现的一个思维导图利用递归算法和堆栈解决节点绘制以及清除。
读书笔记:数组、链表、树、图、递归、DP、有序表等相关数据结构与算法的讲解及代码实现。
非递归中序遍历二叉树(算法2): 层次遍历二叉树: 递归计算单分支结点: 递归计算双分支结点: 递归计算叶子数: 二叉数的深度: 交换二叉树的左右子树: 二叉树已左右交换。 递归先序遍历二叉树: 递归...
从实现机制来看,递归算法包括三个基本要素:递归函数的定义、递归调用和递归关系式的计算。递归函数的定义是递归算法的基础,它描述了问题的递归结构。递归调用是递归算法的核心,它使得函数在执行过程中能够不断地...
《算法图解》这本书以图形化的方式讲述了各种算法,旨在让读者能够轻松理解并掌握算法知识。 首先,算法简介部分介绍了算法的基本概念,如算法的定义和基本构成。简单查找和二分查找是基础查找算法,分别对应着线性...
3. 动态规划:递归算法可以用于解决动态规划问题,例如斐波那契数列。 递归算法在数据结构中的应用包括: 1. 二叉树遍历:递归算法可以用于遍历二叉树,例如前序遍历、后序遍历。 2. 图遍历:递归算法可以用于遍历...
计算机算法设计与分析:第三章_递归算法.ppt
这是数据结构中二叉树的后序遍历的非递归算法的源代码。
在ACM(国际大学生程序设计竞赛)中,递归算法是一种常见的解决问题的方法,它通过函数自身调用自身来实现问题的解决。递归的核心在于找到基本情况(base case),即可以直接求解的问题,以及每次递归调用时问题规模...
在IT领域,尤其是在数据结构与算法的学习中,中序遍历二叉树的非递归算法是一个关键且实用的知识点。通常,我们首先通过递归来实现二叉树的遍历,但递归方法可能因深度过大导致栈溢出,因此掌握非递归版本的遍历算法...
在.NET编程环境中,递归算法是一种强大的工具,它允许函数或方法调用自身来解决复杂问题。递归的核心思想是将大问题分解为相同或相似的小问题,直到问题变得足够简单,可以直接得出答案。这种解决问题的方式在数据...
【递归】是一种重要的算法设计方法,它通过函数或子程序自我调用来解决复杂问题。在计算机科学中,递归通常涉及将一个大问题分解为若干个与原问题性质相同的小问题,以此类推,直到小问题变得足够简单,可以直接求解...
#### 递归算法基础 递归是一种常见的编程技术,它允许一个函数直接或间接地调用自身。递归算法通常被用来解决可以分解为相似子问题的问题,例如斐波那契数列和汉诺塔问题。 ##### 斐波那契数列 斐波那契数列是一...
### 基础算法第四章:递归算法(C++版) #### 一、递归算法概述 递归算法是一种非常强大的编程技术,在C++语言中尤为重要。递归通过函数或者过程调用自身来解决问题,使得很多复杂的问题得以简化。 **递归的特点...
这里的所有的markdown语法都是我在Mac...第3章:算法 第4章:数论与密码学 第5章:归纳和递归 第6章:计数 第7章:离散概率 第8章:高级计数技术 第9章:关系 第10章:图 第11章:树 第12章:布尔代数 第13章:计算模型
本章主要介绍递归算法的设计与分析,这是算法设计领域的一个重要分支。递归算法是一种通过函数自身调用自身的方式来解决问题的算法,它通常用于解决可以分解为相似子问题的问题。 2.1 递归算法特性 递归算法具有两...
因此,一种非递归算法被提出,这种算法通过简单的两步操作,即可有效解决汉诺塔问题。 非递归算法的基本思想是通过循环使用两个步骤来依次移动圆盘,而非递归调用。第一个步骤是针对最少的圆盘进行操作,保持最小...
递归算法的实现需要遵守三个基本条件: (1)问题可以分解成更小的子问题。 (2)每个子问题的解可以用与原问题相同的方法解决。 (3)存在一个基本情况,可以终止递归调用。 例如,计算1+2+3+4+…+(n-1)+n的...
递归算法的应用场景:递归算法常用于解决以下三种问题: * 定义是递归的 * 数据结构是递归的 * 问题的解法是递归的 3. 递归算法的工作原理: * 在函数调用中,一个函数的执行没有结束,又开始另一个函数的...