递归算法及应用

news2024/9/20 10:39:00

一.简介

1.介绍

   递归(Recursion)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法,其核心思想是分治策略。

在日常开发中,我们使用循环语句远远大于递归,但这不能说明递归就没有用武之地,实际上递归算法的解决问题的步骤更符合人类解决问题的思路,这是递归算法的优点,同时也是它的缺点。递归算法是比较好用,但是理解起来可能不太好理解,所以在递归算法和循环算法对比中,流行一句话:人理解循环,神理解递归。

  

2.什么是递归?

  递归就是程序调用自身的编程技巧。递归通常把一个大型复杂的问题层层转化为一个与原问题相似,规模较小的问题来求解。递归策略只需要少量的程序就可以描述出解题过程所需要的多次重复的计算,大大减少程序的代码量。

递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

3.什么时候使用递归?

(1)大问题可以拆分成若干小问题。

(2)原问题与子问题除数据规模不同,求解思路完全相同。

(3)存在递归终止条件。

(4)当不满足终止条件时,要如何缩小函数值,并让其进入下一层循环中。

4.递归的两个基本要素:

边界条件:确定递归到何时终止,也称为递归出口。

递归模式:大问题是如何分解为小问题的,也称为递归体。递归函数只有具备了这两个要素,才能在有限次计算后得出结果

5.设计递归算法的步骤:

(1).确定递归公式

(2).确定边界(终了)条件

二.递归的简单示例:求阶乘

    int fun(int num)

    {

        if(num == 0){

            return 1;

        }else{

            return num *fun(num-1);

        }

    }

    

    void main(void)

    {

        int result = fun(5);

        printf("结果为:"%d\r\n", result);

    }

    

结运行果为:

结果为:120

三.递归的基本原理

1.每一级的函数调用都有自己的变量。

2.每一次函数调用都会有一次返回。当程序执行到某一级递归的结尾处时,它会转移到前一级递归继续执行。程序不能直接返回到main()中的初始调用部分,而是通过递归的每一级逐步返回,即从func()的某一级递归返回到调用它的那一级。

3.递归函数中,位于递归调用前的语句和各级被调函数具有相同的执行顺序。

4.递归函数中,位于递归调用后的语句的执行顺序和各个被调函数的顺序相反。

5.虽然每一级递归都有自己的变量。但是函数代码并不会得到复制。函数代码是一系列的计算机指令。而函数调用就是从头执行相应函数的指令集,除了会每次创建变量,递归调用非常类似于一个循环语句。

6.递归函数中必须包含可以终止递归调用的语句。

四.递归的优缺点

1.优点

简洁清晰:递归能够将复杂的问题简化成更小的子问题,使得代码更加清晰易懂。

问题建模:递归能够自然地将问题建模成递归结构,使得问题的解决变得更加直观。

提高代码复用性:通过递归,可以在不同的情景中复用相同的解决方案。

2.缺点

性能损耗:递归调用涉及函数的重复调用和堆栈的频繁使用,可能会导致性能下降。

内存消耗:每次递归调用都需要在堆栈中存储函数的调用信息,可能会导致堆栈溢出的问题。

难以理解和调试:复杂的递归调用可能会导致代码的难以理解和调试,特别是递归函数中存在多个递归调用时。

五.应用场景:

   实际上递归算法的使用场景,在排序算法,链表,树,图及其他只要符合分治思想的问题中,其实都可以采用递归来处理。

1.递归算法一般用于解决三类问题:

(1)数据的定义是按递归定义的。(例如:Fibonacci函数)

(2)问题解法按递归算法实现。

   这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。

(3)数据的结构形式是按递归定义的。

   如二叉树、广义表等,由于结构本身固有的递归特性,则它们的操作可递归地描述。

2.常用场景

(1)树和图的遍历:树和图的结构天然适合递归的处理方式,如深度优先搜索(DFS)。

(2)分治算法:许多分治算法,如归并排序和快速排序,都是通过递归实现的。

(3)动态规划:动态规划问题中,递归可以帮助描述问题的递归结构,但通常需要使用记忆化搜索或者自底向上的迭代方式来提高性能。

(4)排列组合问题:许多排列组合问题,如子集、组合、排列等,可以通过递归实现。

3.代码示例

(1)求阶乘和

求 1!+2!+3!+4!+5!+6!+7!+…+n!的和。

代码演示:

int factorial(int n)

{

if (n == 1)

return 1;

return n * factorial(n - 1);

}

int main()

{

int n = 0;

int sum = 0;

int i = 0;

scanf("%d", &n);

for (i = 1; i <= n; i++)

{

sum += factorial(i);

}

printf("%d\n", sum);

return 0;

}

(2)求斐波那契额数列

这个数列从第3项开始,每一项都等于前两项之和。

代码:

int Fib(int n)

{

if (n <= 2)

return 1;

else

return Fib(n - 1) + Fib(n - 2);

}

int main()

{

int n = 0;

scanf("%d", &n);//20

int ret = Fib(n);

printf("%d\n", ret);

return 0;

}

(3)函数实现n的k次方

代码演示:

double Pow(n, k)

{

if (k > 0)

{

return n * Pow(n, k-1);

}

else if(k == 0)

{

return 1;

}

else

{

return 1.0 / Pow(n, -k);//实现指数为负数

}

}

int main()

{

int n = 0;

int k = 0;

scanf("%d %d", &n, &k);

double ret = Pow(n, k);

printf("%lf\n", ret);//double打印用lf

return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2077104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器(百度云)部署项目(jar包)

java项目打包成jar包&#xff1a;clean------compile------install jar包上传到服务器上 和jar包相同的文件里&#xff0c;创建Dockerfile文件。 Dockerfile文件的内容informationerasure是jar包名&#xff0c;这里可根据自己定义的名字进行更换。 Dockerfile文件内容&#x…

chrome打印dom节点不显示节点信息

正常直接console dom节点 代码改成 var parser new DOMParser(); var docDom parser.parseFromString(testHtml, text/html); console.log(docDom) let htmlHeader ref< HTMLElement | null>(null) let htmlBoby ref< HTMLElement | null>(null) htmlHeader.v…

Datawhale AI 夏令营 第五期 CV Task1

活动简介 活动链接&#xff1a;Datawhale AI 夏令营&#xff08;第五期&#xff09; 以及CV里面的本次任务说明&#xff1a;Task 1 从零上手CV竞赛 链接里的教程非常详细&#xff0c;很适合小白上手&#xff0c;从报名赛事到使用服务器平台再到跑模型&#xff0c;手把手教&…

【Go语言基础】调度器模型GPM与垃圾回收器GC

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了Go语言学习的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于Go语言趣学指南进行的&#xff0c;每个知识点的修正和深入主要参…

ubuntu系统在线安装下载firefox-esr流览器

1、在线firefox流览器 Firefox ESR(Extended Support Release)是火狐浏览器的长期支持版本&#xff0c;针对同一个主版本提供一年左右的安全性与稳定性支持。如果您因为火狐浏览器改版而导致有原本能用的功能变得不能使用的话(例如Firefox 64.0把RSS订阅的功能拿掉了)&#xf…

IO进程day02(文件IO)

目录 【1】什么是文件IO 1》概念 2》特点 3》操作 【2】函数接口 1》打开文件open() 思考&#xff1a;文件IO和标准IO的打开方式的对应关系 2》关闭文件 close() 3》读写文件 read write 1> 读文件 read() 2> 写文件 write() 练习&#xff1a;文件IO实现cp…

使用AWS的EC2服务如何降低成本

在现代企业中&#xff0c;云计算已经成为推动业务创新和发展的重要工具。亚马逊云服务&#xff08;AWS&#xff09;的弹性计算云&#xff08;EC2&#xff09;提供了灵活的计算能力&#xff0c;企业可以根据需求快速部署和管理应用。然而&#xff0c;如何在使用EC2服务的过程中有…

无人机之多旋翼无人机的用途

一、航拍与摄影 高清摄像&#xff1a;多旋翼无人机搭载高清摄像头&#xff0c;可以进行高空拍摄&#xff0c;获取清晰的图像和视频资料&#xff0c;广泛应用于影视制作和新闻报道。 实时传输&#xff1a;无人机可通过图像传输设备&#xff0c;实现实时画面回传&#xff0c;为…

linux常见基础命令

Linux基础命令 (下面这些命令都是最常见的命令.更复杂的会在之后的C语言学习陆续深入) 1、 pwd 功能&#xff1a; print work directory的缩写&#xff0c;显示当前目录的绝对路径 2、 cd 功能&#xff1a; change directory的缩写&#xff0c;切换目录 绝对路径&#xff1a;以…

知识改变命运 数据结构【二叉树OJ题】

1. 检查两颗树是否相同OJ链接 class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {if(pnull&&q!null||p!null&&qnull) {return false;}if (pnull&&qnull) {return true;}if (p.val!q.val) {return false;}boolean leftisSameTree(p.…

数据库内容保密检查系统:及时发现“潜在”安全威胁

日前&#xff0c;国内专注于保密与非密领域的分级保护、等级保护、业务连续性安全和大数据安全产品解决方案与相关技术研究开发的领军企业——国联易安自主研发的国联数据库内容保密检查系统V1.0通过国保局涉密检测&#xff0c;获得涉密信息系统产品检测证书。其主要具备以下主…

nginx访问控制,用户认证,https

nginx访问控制 用于location段Allow&#xff1a;设定允许哪台或哪些主机访问&#xff0c;多个参数间用空格隔开Deny&#xff1a;设定禁止那台或哪些主机访问&#xff0c;多个参数间用空格隔开比如&#xff1a;allow 192.168.100.20 192.168.100.30;deny all;拒绝某台主机访问…

JavaEE 第18节 TCPUDP优缺点(对比)

目录 前言1、UDP(User Datagram Protocol)优点缺点 2、TCP(Transmission Control Protocol)优点缺点 3、总结 前言 基于TCP/IP协议栈&#xff0c;TCP和UDP属于传输层协议。在Java生态中也分别提供了相关套接字&#xff08;Socket&#xff09;1的API&#xff0c;方便网络编程。…

基于OpenCV+MFC的KCF测速软件

基于OpenCVMFC的KCF测速软件 引言原理介绍使用介绍&#xff08;1&#xff09;主界面&#xff08;2&#xff09;打开视频&#xff08;3&#xff09;点击KCF测速&#xff08;4&#xff09;框选待检测目标&#xff08;5&#xff09;测速结果 资源链接&#xff08;包含源码&#xf…

How do I do function calling in Azure Openai using the javascript sdk

题意&#xff1a;如何使用 JavaScript SDK 在 Azure OpenAI 中进行函数调用&#xff1f; 问题背景&#xff1a; I want to be able to call functions based on the user input, I could do this with the openai library but cant find a way to do so in the azure openai l…

uniapp中$off没写正确引发的问题~

你们好&#xff0c;我是金金金。 场景 我正在使用uniapp开发微信小程序&#xff0c;涉及到几个页面之间的事件通信&#xff0c;采用的是uniapp里面的$on和&off来达到页面之间的互相通信功能如下&#xff1a;有一个选择城市的页面&#xff0c;当选择了某个城市&#xff0c;另…

树数据结构(Tree Data Structures)的全面指南:深度解析、算法实战与应用案例

树数据结构&#xff08;Tree Data Structures&#xff09;的全面指南&#xff1a;深度解析、算法实战与应用案例 引言 树数据结构&#xff08;Tree Data Structures&#xff09;作为计算机科学中的基石之一&#xff0c;以其独特的层次结构和分支特性&#xff0c;在众多领域发…

Hive SQL

一、基本数据类型 tinyint 1byte 有符号整数 smallint 2byte 有符号整数 int 4byte 有符号整数 bigint 8byte 有符号整数 boolean 布尔类型&#xff0c;true或者false float 单精度浮点数 double 双精度浮点数 decim…

系统数据迁移脱敏方案(word)

数据脱敏工作不仅要确保敏感信息被去除&#xff0c;还需要尽可能的平衡脱敏所花费的代价、使用方的业务需求等多个因素。因此&#xff0c;为了确保数据脱敏的过程、代价可控&#xff0c;得到的结果正确且满足业务需要&#xff0c;在实施数据脱敏时&#xff0c;应从技术和管理两…

stm32之I2C通信协议

文章目录 前言一、I2C通信协议二、I2C硬件电路三、I2C时序基本单元3.1 起始与终止信号3.2 发送与接收一个字节3.3 发送与接收应答 四、I2C时序分析4.1 指定地址写4.2 当前地址读4.3 指定地址读 前言 提示&#xff1a;本文主要用作在学习江科大自化协STM32入门教程后做的归纳总…