『递归概念与典型实例』

简介: 在调用一个函数的过程中又出现直接或间接调用该函数本身,称为函数的递 归(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的变形题,读者可自行实现


相关文章
|
6月前
|
机器学习/深度学习 NoSQL 容器
递归的本质与基本实现形式
递归的本质与基本实现形式
|
6月前
|
搜索推荐
搜索树基础:二叉搜索树(详解特性用途,图解实现过程)
搜索树基础:二叉搜索树(详解特性用途,图解实现过程)
|
6月前
|
C语言
【数据结构入门指南】二叉树链式结构的实现(保姆级代码思路解读,非常经典)
【数据结构入门指南】二叉树链式结构的实现(保姆级代码思路解读,非常经典)
126 0
|
6月前
|
存储 搜索推荐 Java
图计算中的顶点和边是什么?请解释其概念和作用。
图计算中的顶点和边是什么?请解释其概念和作用。
154 0
|
算法 C++
详细实例说明+典型案例实现 对枚举法进行全面分析 | C++
简单的来说,算法就是用计算机程序代码来实现数学思想的一种方法。学习算法就是为了了解它们在计算机中如何演算,以及在当今的信息时代,它们是如何在各个层面上影响我们的日常生活的,从而提高我们的逻辑思维能力和处理实际问题的能力。善用算法、巧用算法,是培养程序设计逻辑的重中之重,许多实际的问题都可用多个可行的算法来解决, 但是要从中找出最优的解决算法却是一项挑战。
210 0
详细实例说明+典型案例实现 对枚举法进行全面分析 | C++
|
算法 C++ Python
01算法的概念
01算法的概念
151 0
01算法的概念
|
人工智能 算法 Java
详细实例说明+典型案例实现 对递归法进行全面分析 | C++
在上面,我们通过一个生活中的实例以及两个递归的典型问题,去详细的分析了递归法的核心思想和在程序中的具体实现过程。从程序设计语言的角度来说,谈到递归的定义,可以这样来描述:假如一个函数或子程序是由它自身所定义或调用的,就称它为递归。它至少要定义两个条件,一个是可以反复执行的递归过程,另一个是跳出执行过程的出口。
299 0
详细实例说明+典型案例实现 对递归法进行全面分析 | C++
|
算法 C++
详细实例说明+典型案例实现 对迭代法进行全面分析 | C++
上面我们对迭代算法进行了细致的举例和经典代码的讲解。使用该算法时,要注意体会我们所要求的东西它在程序代码中的更新迭代过程,理解核心思想从而去更好的运用这种常用的经典算法解决常规问题。
447 0
详细实例说明+典型案例实现 对迭代法进行全面分析 | C++
|
存储 算法 C++
详细实例说明+典型案例实现 对动态规划法进行全面分析 | C++
在上面我们通过通俗易懂的例子对动态规划法进行了理解,也用该方法的核心对斐波那契数列进行了优化。动态规划是分治法的一个延伸,它增加了记忆机制的使用,将处理过的子问题的答案记录下来,从而避免去重复计算。
411 0
详细实例说明+典型案例实现 对动态规划法进行全面分析 | C++
|
算法 C++
用详细实例说明和典型案例实现对分治法进行全面分析 | C++
简单的来说,算法就是用计算机程序代码来实现数学思想的一种方法。学习算法就是为了了解它们在计算机中如何演算,以及在当今的信息时代,它们是如何在各个层面上影响我们的日常生活的,从而提高我们的逻辑思维能力和处理实际问题的能力。善用算法、巧用算法,是培养程序设计逻辑的重中之重,许多实际的问题都可用多个可行的算法来解决, 但是要从中找出最优的解决算法却是一项挑战。
161 0
用详细实例说明和典型案例实现对分治法进行全面分析 | C++