当前位置: 首页 > news >正文

软件公司排名100强/武汉seo搜索引擎

软件公司排名100强,武汉seo搜索引擎,wordpress homepage,vps wordpress 安装递归的学习绝对是一个持久战,没有人可以一蹴而就,要循循渐进。一:什么是递归所谓递归,简单点来说,就是一个函数直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模…

递归的学习绝对是一个持久战,没有人可以一蹴而就,要循循渐进。

一:什么是递归

所谓递归,简单点来说,就是一个函数直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。

我们可以把” 递归 “比喻成 “查字典 “,当你查一个词,发现这个词的解释中某个词仍然不懂,于是你开始查这第二个词。可惜,第二个词里仍然有不懂的词,于是查第三个词,这样查下去,直到有一个词的解释是你完全能看懂的,那么递归走到了尽头,然后你开始后退,逐个明白之前查过的每一个词。

我们以阶乘作为:

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

二:递归与栈的关系

常常听到 “递归的过程就是出入栈的过程”,这句话怎么理解?我们以上述代码为例,取 n=3

,则过程如下:

c7f7d2202c4e4e87010767c5b6b86d63.png
  • 第 1~4 步,都是入栈过程,Factorial(3)调用了Factorial(2),Factorial(2)又接着调用Factorial(1),直到Factorial(0);
  • 第 5 步,因 0 是递归结束条件,故不再入栈,此时栈高度为 4,即为我们平时所说的递归深度;
  • 第 6~9 步,Factorial(0)做完,出栈,而Factorial(0)做完意味着Factorial(1)也做完,同样进行出栈,重复下去,直到所有的都出栈完毕,递归结束。

每一个递归程序都可以把它改写为非递归版本。我们只需利用栈,通过入栈和出栈两个操作就可以模拟递归的过程,二叉树的遍历无疑是这方面的代表。

三:如何思考递归

求解Factorial(n)时,我们总会情不自禁的发问,Factorial(n-1)可以求出正确的答案么?接着我们就会再用Factorial(n-2)去验证,,,不停地往下验证直到Factorial(0)。

对递归这样的不适应,和我们平时习惯的思维方式有关。我们习惯的思维是:已知Factorial(0),乘上 1 就等于Factorial(1),再乘以 2 就等于Factorial(2),,,直到乘到 n。

而递归和我们的思维方式正好相反。

如果下面这两点是成立的,我们就知道这个递归对于所有的 n 都是正确的。

  • 当 n=0,1
  • 时,结果正确;
  • 假设递归对于 n
  • 是正确的,同时对于 n+1
  • 也正确。

这种方法很像数学归纳法,也是递归正确的思考方式,上述的第 1 点称为基本情况,第 2 点称为通用情况。在递归中,通常把第 1 点称为终止条件,因为这样更容易理解,其作用就是终止递归,防止递归无限地运行下去。

下面我们用两个例子来具体说明这种数学归纳法:

例 1 汉诺塔展开目录

c03c2b736915f6487f19ccf7cd77d1ca.png

问题描述为:有三根杆子 A,B,C。A 杆上有 N 个穿孔圆盘,盘的尺寸由上到下依次变大,B,C 杆为空。要求按下列规则将所有圆盘移至 C 杆:

  1. 每次只能移动一个圆盘;
  2. 大盘不能叠在小盘上面。

问:如何移?最少要移动多少次?

首先看下基本情况,即终止条件:N=1 时,直接从 A 移到 C。

再来看下通用情况:当有 N 个圆盘在 A 上,我们已经找到办法将其移到 C 杠上了,我们怎么移动 N+1 个圆盘到 C 杠上呢?很简单,我们首先用将 N 个圆盘移动到 C 上的方法将 N 个圆盘都移动到 B 上,然后再把第 N+1 个圆盘(最后一个)移动到 C 上,再用同样的方法将在 B 杠上的 N 个圆盘移动到 C 上,问题解决。

代码如下:

void Hanoi(int n, char a, char b, char c){ //终止条件 if (n == 1) { cout << a << "-->" << c << endl; return; } //通用情况 Hanoi(n - 1, a, c, b); Hanoi(1, a, b, c); Hanoi(n - 1, b, a, c);}

例 2 求二叉树节点个数展开目录

401d4247cb4cbb1b79404be968aca914.png

首先看下基本情况,即终止条件:当为空树时,节点数为 0;

再来看下通用情况:当前节点的左,右子树节点数都被求出,则以当前结点为根的二叉树的节点总数就是 “左子树 + 右子树 + 1”。

代码如下:

int GetNodes(Node * node){ //终止条件 if (node == nullptr) return 0; //通用情况 return GetNodes(node->left) + GetNode(node->right) + 1;}

四:递归使用场景

问题可用递归来解决需具备的条件:

  • 子问题需与原问题为同样的事,且规模更小;
  • 程序停止条件。
http://www.jmfq.cn/news/4808791.html

相关文章:

  • java调接口做网站/地推网app推广平台
  • 绵阳top唯艺网站建设/网站生成app工具
  • 手机端建站/seo门户网站建设方案
  • 北京好的做网站的公司/成功的软文推广
  • 做购物网站表结构分析/在线科技成都网站推广公司
  • 在日本做网站/域名大全
  • 网站未做安全隐患检测怎么拿shell/奶茶软文案例300字
  • 四川省和城乡建设厅网站/百度点击率排名有效果吗
  • 怎样保存网站资料 做证据/网络营销策划需要包括哪些内容
  • 金乡县住房与城乡建设局网站/企业网络营销方案策划
  • 易购商城网站怎么做啊/2022网站seo
  • 太平洋建设 网站/网络营销环境分析包括哪些内容
  • 公司怎么做网站需要多少钱/手机流畅优化软件
  • 用网站做CAN总线通信好吗/百度推广的几种方式
  • 企业网站系统详细设计/培训方案
  • 济南网站设计公司推荐/数字营销公司排行榜
  • 旅游公司网站建设/网络推广方式方法
  • 颍上县建设局网站/北京网站
  • wordpress默认模版/推推蛙贴吧优化
  • 福州网站建设推广/百度站长联盟
  • 重庆做网站的/友情链接网站免费
  • 网站建设天天软文靠谱/百度下载并安装最新版
  • 成都网站建设专家/长春seo公司
  • seo百家外链网站/百度app旧版本下载
  • 免费做网站. 优帮云/什么是百度推广
  • 湖北企业网站建设多少钱/天津关键词优化平台
  • 我的世界手机做图的网站/服装市场调研报告范文
  • 网站底部代码大全/百度信息流开户多少钱
  • 郑州网站建设排行榜/无锡网站推广公司
  • 自己可以建网站吗/win10优化大师