『递归概念与典型实例』

简介: 在调用一个函数的过程中又出现直接或间接调用该函数本身,称为函数的递 归(Recursion)调用,这种函数称为递归函数 • 若p函数定义中调用p函数,称之为直接递归 • 若p函数定义中调用q函数,而q函数定义中又调用p函数,称之为间接递归


👨‍🎓作者简介:一位喜欢写作,计科专业的大二菜鸟

🏡个人主页:starry陆离

🌌上期文章:『算法导论』什么是算法?什么是程序?

📚订阅专栏:『算法笔记HNUCM-OJ』如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦


『递归概念与典型实例』

1.引言

1-100求和

方法1:使用循环求和 1+2+3+4+5+6+……+99+100

伪代码:

fori=1to100

  sum=sum+i

方法2:换个角度思考

sum(n)表示1…n的和

 

sum(100) =sum(99) +100  

 

=sum(98) +99+100  

 

=……  

 

=sum(1) +2+3+4+……+99+100  

 

=1+2+3+4+……+99+100

2.递归的定义

在调用一个函数的过程中又出现直接或间接调用该函数本身,称为函数的递 归(Recursion)调用,这种函数称为递归函数

  • 若p函数定义中调用p函数,称之为直接递归
  • 若p函数定义中调用q函数,而q函数定义中又调用p函数,称之为间接递归

3.递归的要素

1、递归表达式(递归方程)

2、递归结束条件(边界条件)

网络异常,图片无法展示
|

intsum(intn){

    if(n==1)return1;//递归结束条件

    elsesum(n-1)+n;//递归表达式

}

4.递归特点

(1) 需要解决的问题可以转化为一个或多个子问题来求解,而这些子问题的 求解方法与原问题完全相同,只是在数量规模上不同

(2) 递归调用的次数必须是有限的

(3) 必须有结束递归的条件来终止递归

5.递归的使用条件

(1) 定义是递归的(阶乘、斐波那契数列等)

(2) 数据结构是递归的(单链表、二叉树等)

(3) 问题的求解方法是递归的(汉诺塔、回溯法等)

6.递归的优缺点

递归的优缺点

优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性, 因此它为设计算法、调试程序带来很大方便

缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空 间都比非递归算法要多

解决方法:在某些递归算法中可消除递归调用,使其转化为非递归算法

7.典型递归实例

7.1求阶乘

n!=1×2×3×……×n

网络异常,图片无法展示
|

intf(intn){

    if(n==1)return1;//递归结束条件

    elsen*f(n-1);//递归表达式

}

7.2Fibonacci数列

斐波那契(Fibonacci)数列因数学家列奥纳多·斐波那 契以兔子繁殖为例引入,故又称为“兔子数列”

网络异常,图片无法展示
|

网络异常,图片无法展示
|

intfibonacci(intn){

    if(n<=1)return1;//递归结束条件

   returnfibonacci(n-1)+fibonacci(n-2);//递归表达式

}

7.3青蛙跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级。

  • 求该青蛙跳上一个n级的台阶总共有多少种跳法?

就是fibonacci的变形题,读者可自行实现


相关文章
|
数据库
主题域、概念、逻辑、物理四种模型有什么区别与联系?
主题域、概念、逻辑、物理四种模型有什么区别与联系?
|
5月前
|
数据库
业务系统架构实践问题之当一个模型既有独立性又有与其他模型的关联时,判断它是否为聚合根问题如何解决
业务系统架构实践问题之当一个模型既有独立性又有与其他模型的关联时,判断它是否为聚合根问题如何解决
|
7月前
|
算法 项目管理 数据中心
【数据结构】拓扑网络(AOE算法举例+源码)
【数据结构】拓扑网络(AOE算法举例+源码)
【数据结构】拓扑网络(AOE算法举例+源码)
|
7月前
|
搜索推荐
搜索树基础:二叉搜索树(详解特性用途,图解实现过程)
搜索树基础:二叉搜索树(详解特性用途,图解实现过程)
|
7月前
|
C语言
【数据结构入门指南】二叉树链式结构的实现(保姆级代码思路解读,非常经典)
【数据结构入门指南】二叉树链式结构的实现(保姆级代码思路解读,非常经典)
199 0
|
7月前
|
Java 程序员
揭秘编程世界的构造块:一文教你理解方法的本质与运用
揭秘编程世界的构造块:一文教你理解方法的本质与运用
46 0
|
算法 C++
详细实例说明+典型案例实现 对枚举法进行全面分析 | C++
简单的来说,算法就是用计算机程序代码来实现数学思想的一种方法。学习算法就是为了了解它们在计算机中如何演算,以及在当今的信息时代,它们是如何在各个层面上影响我们的日常生活的,从而提高我们的逻辑思维能力和处理实际问题的能力。善用算法、巧用算法,是培养程序设计逻辑的重中之重,许多实际的问题都可用多个可行的算法来解决, 但是要从中找出最优的解决算法却是一项挑战。
225 0
详细实例说明+典型案例实现 对枚举法进行全面分析 | C++
|
人工智能 算法 Java
详细实例说明+典型案例实现 对递归法进行全面分析 | C++
在上面,我们通过一个生活中的实例以及两个递归的典型问题,去详细的分析了递归法的核心思想和在程序中的具体实现过程。从程序设计语言的角度来说,谈到递归的定义,可以这样来描述:假如一个函数或子程序是由它自身所定义或调用的,就称它为递归。它至少要定义两个条件,一个是可以反复执行的递归过程,另一个是跳出执行过程的出口。
319 0
详细实例说明+典型案例实现 对递归法进行全面分析 | C++
|
存储 算法 C++
详细实例说明+典型案例实现 对动态规划法进行全面分析 | C++
在上面我们通过通俗易懂的例子对动态规划法进行了理解,也用该方法的核心对斐波那契数列进行了优化。动态规划是分治法的一个延伸,它增加了记忆机制的使用,将处理过的子问题的答案记录下来,从而避免去重复计算。
443 0
详细实例说明+典型案例实现 对动态规划法进行全面分析 | C++
|
算法 C++
详细实例说明+典型案例实现 对迭代法进行全面分析 | C++
上面我们对迭代算法进行了细致的举例和经典代码的讲解。使用该算法时,要注意体会我们所要求的东西它在程序代码中的更新迭代过程,理解核心思想从而去更好的运用这种常用的经典算法解决常规问题。
474 0
详细实例说明+典型案例实现 对迭代法进行全面分析 | C++