首页 > 编程语言 >算法篇--递归

算法篇--递归

时间:2022-12-23 20:00:40浏览次数:37  
标签:return 函数 递归 -- 问题 int 算法 阶乘

递归

一、算法思想:

1、定义 :在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。简单来说,递归表现为函数调用函数本身。

2、特点:

递归有两个显著的特征,终止条件和自身调用:

  • 自身调用:原问题可以分解为子问题,子问题和原问题的求解方法是一致的,即都是调用自身的同一个函数。
  • 终止条件:递归必须有一个终止的条件,即不能无限循环地调用本身。

二、典型例题:求n!的递归函数

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int Factorial(int n)
 6 {
 7     if (n == 0)
 8         return 1;
 9     else
10     {
11         return n * Factorial(n - 1);
12     }
13 
14 }
15 
16 
17 int main()
18 {
19     int sum = Factorial(3);
20     cout << sum << endl;
21     return 0;
22 }

 

递归解题思路

解决递归问题一般就三步曲,分别是:

  • 第一步,定义函数功能
  • 第二步,寻找递归终止条件
  • 第二步,递推函数的等价关系式

1.定义函数功能

定义函数功能,就是说,你这个函数是干嘛的,做什么事情,换句话说,你要知道递归原问题是什么呀?比如你需要解决阶乘问题,定义的函数功能就是n的阶乘,如下:

//求n的阶乘(n为大于0的自然数)
int factorial (int n){
 
}

2.寻找递归终止条件

递归的一个典型特征就是必须有一个终止的条件,即不能无限循环地调用本身。所以,用递归思路去解决问题的时候,就需要寻找递归终止条件是什么。比如阶乘问题,当n=1的时候,不用再往下递归了,可以跳出循环啦,n=1就可以作为递归的终止条件,如下:

//n的阶乘(n为大于0的自然数)
int factorial (int n){
    if(n==1){
      return 1;
    }
}

3.递推函数的等价关系式

递归的本义,就是原问题可以拆为同类且更容易解决的子问题,即原问题和子问题都可以用同一个函数关系表示。递推函数的等价关系式,这个步骤就等价于寻找原问题与子问题的关系,如何用一个公式把这个函数表达清楚。阶乘的公式就可以表示为 f(n) = n * f(n-1), 因此,阶乘的递归程序代码就可以写成这样,如下:

int factorial (int n){
    if(n==1){
      return 1;
    }
    return n * factorial(n-1);
}

递归与栈的关系

其实,递归的过程,可以理解为出入栈的过程的,为了更容易理解一些,我们来看一下 函数Factorial(n=5)的递归执行过程,如下:

 

 

 

递归的经典应用场景

哪些问题我们可以考虑使用递归来解决呢?即递归的应用场景一般有哪些呢?

  • 阶乘问题
  • 二叉树深度
  • 汉诺塔问题
  • 斐波那契数列
  • 快速排序、归并排序(分治算法也使用递归实现)
  • 遍历文件,解析xml文件

 

标签:return,函数,递归,--,问题,int,算法,阶乘
From: https://www.cnblogs.com/Gaowaly/p/17000459.html

相关文章

  • 流处理基础概念-延迟/吞吐/窗口/时间
    在批处理场景中,我们主要通过一次计算的总耗时来评价性能。在流处理场景,数据源源不断地流入系统,大数据框架对每个数据的处理越快越好,大数据框架能处理的数据量越大越好。衡量......
  • 教你用JavaScript实现进度条
    案例介绍欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个进度条。进度条数字自动增加,条状图片动画演示进度完成度。通过实......
  • Sentinel
    Sentinel—高可用流量管理框架/服务容错组件一.为什么要用Sentinel?1.微服务架构中当某服务挂掉的时候常见的原因有哪些?1.异常没处理比如DB连接失败,文件读取失败等2.突然的......
  • Java中资源文件的使用(properties)
    properties文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件,文件的内容是格式是"键=值"的格式,在properties文件中,可以用"#"来作注释。 一......
  • 重学c#系列—— 反射深入一点点[三十三]
    前言在上一章中介绍了什么是反射:https://www.cnblogs.com/aoximin/p/16440966.html正文上一节讲述反射的基本原理和为什么要用反射,还用反射的优缺点这些。其二者的......
  • springboot中service自己注入自己启动报错
    springboot中service自己注入自己:  启动报错:F:\jdk8-32bit\bin\java-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:56333,suspend=y,server=n-XX:Tiered......
  • CSS-父类边框塌陷问题-2022-12-23
    1、增加DIV空的但不建议2、在父元素中设置高度3、使用OVERFLOW 宁愿用hidden,不要用scroll滚动条,看上去很怪异4、在父类后添加一个伪类:写法稍微复杂一点,但是推荐......
  • 开发“你帮我助”软件心得体会
    时间飞逝,不知不觉间《软件工程》的学习已经过了大半了。在这将近半学期的学习中,虽然我不能说我将《软件工程》学习的有多么的好,但是通过学习,我还是受益良多。在以前,我一直......
  • CSRF校验策略及装饰器和auth认证模块
    目录csrf跨站请求伪造csrf校验策略csrf相关装饰器auth认证模块auth认证相关模块及操作扩展auth_user表csrf跨站请求伪造钓鱼网站:模仿一个正规的网站让用户在该网站上做......
  • 教你用JavaScript实现进度条
    案例介绍欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个进度条。进度条数字自动增加,条状图片动画演示进度完成度。通过......