您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

程序算法——递归

时间:2022-07-30 11:29:24  来源:  作者:小圆子学编程

一、什么是递归?

当函数的定义中,其内部操作又直接或间接地出现对自身的调用,则称这样的程序嵌套定义为递归定义。

递归通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,从而大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出的程序往往十分简洁易懂。

二、递归的应用

用递归算法求x!

当x=0时,x!= 1

当x>0时, x!=x*(x-1)!

根据数学中的定义把求x!定义为求x*(x-1)!,其中求(x-1)!仍然用求x!的方法,需要定义一个求x!的函数,逐级调用此函数。

假设x=3时,3!=3*2*1=6,它执行的流程图如图:

 

编写的程序如下:

#include <IOStream>

using namespace std;

int t;

int f(int);

int mAIn()

{

int x;

cin >> x;

f(x);

cout << t <<endl;

return 0;

}

int f(int x)

{

if( x == 1)

t = 1;

else

{

f( x-1 );

t = t * x;

}

}

 

从上面这个例子中可以知道,递归算法的本质就是自己调用自己,用调用自己的方法去处理问题,可使解决问题变得简洁明了。

1、递归程序在执行过程中,一般具有如下模式:

① 将调用程序的返回地址、相应地调用前的变量都保存在系统堆栈中,

② 执行被调用的函数;

③ 若满足退出递归的条件,则退出,并从栈顶上弹回返回地址,取回保存起来的变量值,继续沿着返回地址向下执行程序;

④ 否则继续递归调用,只是递归调用的参数发生变化:增加一个量或减少一个量,重复执行直到递归调用结束。

2、能够用递归算法解决的问题,一般满足如下要求:

① 需要求解的问题可以化为子问题求解,其子问题的求解方法与原问题相同,只是规模上的增加或减少

② 递归调用的次数是有限的,必须有递归结束的条件。

 

一个经典的益智游戏——汉诺塔,就是典型的递归算法:

有A、B、C三个塔座和n个大小不一样的圆盘子,需要把A、B、C三个塔座上的盘子利用中间B座,把所有盘子从A盘移动到C盘,规则是每次只允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在下。

分析如下:

当盘子数n=1时,只需移动一次:A--->C。

当盘子数n=2时,需要移动三次:A--->B,A--->C,B--->C。

当盘子数n=3时,需要移动7次:A--->C,A--->B,C--->B,A--->C,B--->A,B--->C,A--->C。

由以上分析可知:如果盘子数为n时,则移动的次数为2n-1.

那么如何编写一个盘子数为n的程序呢?我们利用递归的算法来设计程序,你会发现,要把A座上的n个盘子以B座为中转移动到C座,可以分为以下3个步骤来完成:

1、将A座上的n-1个盘子,以C座为中转,移到B座上。

2、把A座上最低下的一个盘子移到C座上。

3、将B座上n-1个盘子,以A座为中转,移到C座上。

可以发现步骤1和3是和原问题本质相同的子问题(规模数量少了1),不停地递归下去,直到当子问题的规模数为1时,只需执行第1个步骤。

这是盘子n=3时,递归算法运行的过程:

 

图中的数字顺序表示程序运行的顺序。

程序代码可以看我主页里分享的视频。



Tags:递归   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Python的函数递归与调用,你会吗?
Python中的函数递归是一种函数调用自身的编程技术。递归可以用来解决问题,特别是那些可以分解为更小、相似子问题的问题。一、函数递归的基本概念1、什么是函数递归?函数递归...【详细内容】
2023-12-04  Search: 递归  点击:(124)  评论:(0)  加入收藏
SQL如何求解省市区中的递归问题?
递归递归是指程序调用自身的一种编程技巧,在SQL中也有递归查询。下面我们通过一个省市区的示例来讲解递归查询的用法。问题有如下一张表City,图片希望得到如下结果图片该如何...【详细内容】
2023-11-02  Search: 递归  点击:(191)  评论:(0)  加入收藏
深入了解:DNS递归解析与迭代解析的差异与选择
DNS解析是互联网中的重要环节,承担着将域名翻译为可由计算机直接读取的IP地址的基础功能。根据查询对象不同,DNS解析可分为递归解析和迭代解析两种方式,接下来,国科云将简单介绍...【详细内容】
2023-09-27  Search: 递归  点击:(273)  评论:(0)  加入收藏
一文精通递归算法
一、什么是递归?自己调用自己,当业务逻辑符合以下三个条件的时候,就可以考虑使用递归来实现。 一个问题可以分解为多个子问题; 当前问题与其子问题除了数据规模不同外,求解思路...【详细内容】
2022-10-07  Search: 递归  点击:(273)  评论:(0)  加入收藏
程序算法——递归
一、什么是递归?当函数的定义中,其内部操作又直接或间接地出现对自身的调用,则称这样的程序嵌套定义为递归定义。递归通常把一个大型复杂的问题层层转化为一个与原问题相似的...【详细内容】
2022-07-30  Search: 递归  点击:(405)  评论:(0)  加入收藏
Python 3.11比3.10 快60%:使用冒泡排序和递归函数对比测试
Python 3.11 pre-release已经发布。 更新日志中提到:Python 3.11 is up to 10&ndash;60% faster than Python 3.10. On average, we measured a 1.25x speedup on the standa...【详细内容】
2022-05-20  Search: 递归  点击:(470)  评论:(0)  加入收藏
java递归算法的实例最细讲解
递归三要素:1、明确递归终止条件;2、给出递归终止时的处理办法;3、提取重复的逻辑,缩小问题的规模。1、1+2+3+&hellip;+nimport java.util.Scanner; public class Recursion {...【详细内容】
2022-03-18  Search: 递归  点击:(270)  评论:(0)  加入收藏
JS函数式编程和递归探索:路由树的操作
开始切入正题之前,有必要告知大家一下,这篇文章可能有一些深度,初学者可能理解会有些吃力。我会尽量把复杂问题简单化,争取让每个阅读的童鞋们都能看得懂。希望你对element-ui,vu...【详细内容】
2022-03-16  Search: 递归  点击:(338)  评论:(0)  加入收藏
C语言习题:苹果装盘问题!用递归如何求解?
一、问题提出问题:把m个苹果放入n个盘子中,允许有的盘子为空,共有多少种方法?注:5,1,1和1 5 1属同一种方法m,n均小于10二、算法分析设f(m,n) 为m个苹果,n个盘子的放法数目,则先对...【详细内容】
2021-11-17  Search: 递归  点击:(495)  评论:(0)  加入收藏
java分别使用递归和非递归实现二叉树中序遍历
对于二叉树,它的特点就是任何一个节点,左节点小于父节点、右节点大于父节点遍历二叉树有多种方式,如中序遍历、层序遍历、后序遍历,中序遍历的思路就是左-->父--->右的顺序,下面...【详细内容】
2021-11-02  Search: 递归  点击:(265)  评论:(0)  加入收藏
▌简易百科推荐
小红书、视频号、抖音流量算法解析,干货满满,值得一看!
咱们中国现在可不是一般的牛!网上的网友已经破了十个亿啦!到了这个互联网的新时代,谁有更多的人流量,谁就能赢得更多的掌声哦~抖音、小红书、、视频号,是很多品牌必争的流量洼地...【详细内容】
2024-02-23  二手车小胖说    Tags:流量算法   点击:(18)  评论:(0)  加入收藏
雪花算法详解与Java实现:分布式唯一ID生成原理
SnowFlake 算法,是 Twitter 开源的分布式 ID 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 ID。在分布式系统中的应用十分广泛,且 ID 引入了时间戳...【详细内容】
2024-02-03   一安未来  微信公众号  Tags:雪花算法   点击:(54)  评论:(0)  加入收藏
程序开发中常用的十种算法,你用过几种?
当编写程序时,了解和使用不同的算法对解决问题至关重要。以下是C#中常用的10种算法,每个算法都伴随着示例代码和详细说明。1. 冒泡排序 (Bubble Sort):冒泡排序是一种简单的比...【详细内容】
2024-01-17  架构师老卢  今日头条  Tags:算法   点击:(46)  评论:(0)  加入收藏
百度推荐排序技术的思考与实践
本文将分享百度在推荐排序方面的思考与实践。在整个工业界的推广搜场景上,特征设计通常都是采用离散化的设计,需要保证两方面的效果,一方面是记忆,另一方面是泛化。特征都是通过...【详细内容】
2024-01-09  DataFunTalk  微信公众号  Tags:百度推荐   点击:(81)  评论:(0)  加入收藏
什么是布隆过滤器?如何实现布隆过滤器?
以下我们介绍了什么是布隆过滤器?它的使用场景和执行流程,以及在 Redis 中它的使用,那么问题来了,在日常开发中,也就是在 Java 开发中,我们又将如何操作布隆过滤器呢?布隆过滤器(Blo...【详细内容】
2024-01-05  Java中文社群  微信公众号  Tags:布隆过滤器   点击:(94)  评论:(0)  加入收藏
面向推荐系统的深度强化学习算法研究与应用
随着互联网的快速发展,推荐系统在各个领域中扮演着重要的角色。传统的推荐算法在面对大规模、复杂的数据时存在一定的局限性。为了解决这一问题,深度强化学习算法应运而生。本...【详细内容】
2024-01-04  数码小风向    Tags:算法   点击:(106)  评论:(0)  加入收藏
非负矩阵分解算法:从非负数据中提取主题、特征等信息
非负矩阵分解算法(Non-negativeMatrixFactorization,简称NMF)是一种常用的数据分析和特征提取方法,主要用于从非负数据中提取主题、特征等有意义的信息。本文将介绍非负矩阵分解...【详细内容】
2024-01-02  毛晓峰    Tags:算法   点击:(75)  评论:(0)  加入收藏
再谈前端算法,你这回明白了吗?
楔子 -- 青蛙跳台阶一只青蛙一次可以跳上一级台阶,也可以跳上二级台阶,求该青蛙跳上一个n级的台阶总共需要多少种跳法。分析: 当n=1的时候,①只需要跳一次即可;只有一种跳法,即f(...【详细内容】
2023-12-28  前端爱好者  微信公众号  Tags:前端算法   点击:(114)  评论:(0)  加入收藏
三分钟学习二分查找
二分查找是一种在有序数组中查找元素的算法,通过不断将搜索区域分成两半来实现。你可能在日常生活中已经不知不觉地使用了大脑里的二分查找。最常见的例子是在字典中查找一个...【详细内容】
2023-12-22  小技术君  微信公众号  Tags:二分查找   点击:(81)  评论:(0)  加入收藏
强化学习算法在资源调度与优化中的应用
随着云计算和大数据技术的快速发展,资源调度与优化成为了现代计算系统中的重要问题。传统的资源调度算法往往基于静态规则或启发式方法,无法适应动态变化的环境和复杂的任务需...【详细内容】
2023-12-14  职场小达人欢晓    Tags:算法   点击:(169)  评论:(0)  加入收藏
站内最新
站内热门
站内头条