理解递归方法

news2024/12/28 4:57:41

递归相关问题

  1. 树和二叉树相关的大部分问题
  2. 二分查找相关问题
  3. 快速排序、归并排序相关问题
  4. 所有回溯的问题
  5. 所有动态规划的问题

本质与特征

本质

本质就是方法的调用,而且是方法自己调用自己。 

特征

  1. 执行时范围不断缩小,这样才能触底反弹
  2. 终止(结束)判断在调用递归的前面

理解

  • 执行范围不断缩小 

递归和数学中的递推差不多,设计递归就是寻找递推公式。

例如:

1. 阶乘的递推公式就是:f(n) = n * f(n -1);

2.斐波那契数列公式:f(n) = f(n-1) * f(n-2);

以上两个案例的n值都不断缩小

除此之外,递归在树上缩小的体现如下:

int leftNode = traverse(leftNode.left);

int rightNode = traverse(rightNode.right);

以上,每一次递归,都会将范围缩小到当前节点的左右孩子,接着继续缩小。

  •  终止条件判断在递归调用的前面

递归之后可能还会有终止条件,但是 在执行递归之前,一定会有一个终止条件。

错误示例 

public void recursion(参数0){

        recursion(参数1)

        if(终止条件){

             ......           

        }

上述代码会导致recursion()不断地自己调用自己,一直无法执行if中的语句,直到抛出栈溢出异常(StackOverflowError)

正确示例

public void recursion(参数0){

        if(终止条件){
                ....

        }        

        recursion(参数1)

        // 可能有逻辑运算

        recursion(参数2)

        ......

}

因此,任何递归方法在执行之前,一定会有一个终止条件。 

写递归方法

步骤

  1. 从小到大递推
  2. 分情况讨论,明确结束条件
  3. 组合出完整方法

解释

从小到大递推 

先选几个较小的值验一下,再选择几个比较大的值,验一下即可。大部分从n = 1 , 2, 3 或者只有一两个元素开始写最简单。

        例如斐波那契数列为:1 1 2 3 5 8 13 21....

        从第n=3开始就满足f(n) = f(n-1) * f(n -2)这样的规律,然后再选几个数进行验证。

        最终发现  f(n) = f(n-1) * f(n -2)就是我们需要的递归公式

分情况讨论,明确结束条件

因为递归方法里终止条件一定是靠前的,而大部分递归的终止条件不过是n最小开始触底反弹时的几种情况。

例如:

        对于阶乘,当n = 1 时,就知道 f(1) = 1,因此就可写出阶乘的终止条件,如下:

        int f(int n){

             if(n == 1){

                retrun 1;

            }

        } 

有时候需要考虑的终止条件不止一个,例如斐波那契数列的递推公式  f(n) = f(n-1) * f(n -2)里面,当n = 2 时,会出现 f(2) = f(1) + f(0),但是并没有f(0)这一项,因此,还需要限制n == 2.所以,其终止条件如下:

        int f(int n){

             if(n  <=  2){

                retrun 1;

            }

        } 

        通过以上案例可知,终止条件就是达到某种要就就要停下递归的条件,最直接的方式就是将特殊的案例给列出来,就像枚举一样,然后逐步优化。只有枚举清楚了,才可能设计出完整的终止条件。 

组合出完整方法

 将递归公式   和      终止条件 组合起来就变成了完整的方法。继续上述的两个例子为例,组合成完整的方法如下:

n的阶乘 

int f(int n){
    // 终止条件 
    if(n == 1){
        return 1;
    }
    // 递归方法
    return f(n - 1) * f(n); 
}

斐波那契数列第n项的值

public int fabonacci(int n){
    if(n <= 2){
        return 1;
    }
    return fabonacci(n-1) * fabonacci(n - 2);
}

看懂递归方法

 递归方法的特征就是“不撞南墙不回头”,也就是不到终止条件就一直递归。

举例

阶乘的 递归方法为例,当n = 4 时,执行过程如下图:

image.png

 

 

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

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

相关文章

使用MIT Kerberos Ticket Manager在windows下浏览器访问hadoop页面

Author : Spinach | GHB Link : http://blog.csdn.net/bocai8058文章目录 前言准备配置说明安装Firefox浏览器安装MIT Kerberos Ticket Manager客户端配置krb5.ini文件配置MIT Kerberos Ticket Manager客户端配置Firefox浏览器代理参数 访问WebUI 前言 kerberos是一种计算机…

亚马逊关键词下单的作用

在亚马逊上&#xff0c;关键词对于商品的搜索和发现起着非常重要的作用。当卖家在亚马逊上发布商品时&#xff0c;他们可以使用相关的关键词来描述该商品&#xff0c;这些关键词通常是与该商品相关的词汇或短语。 关键词下单的作用如下&#xff1a; 1、商品搜索&#xff1a; 买…

vue3+antd——实现个人中心页面+同步更改头部用户信息——基础积累

之前写过一篇文章关于vue3antd的框架模板&#xff0c;链接如下&#xff1a;http://t.csdn.cn/9dZMS 首先感谢大神提供的后台管理系统的模板&#xff0c;在此基础上改动要简单很多&#xff0c;主要是自己有很多内容不太敢随意改动。。。 直接看【个人中心】页面的效果图&#…

JavaScript事件委托与事件流+牛客例题

事件流&#xff1a; 概念&#xff1a;事件完整执行过程中的流动路径 说明&#xff1a;假设页面里有个div&#xff0c;当触发事件时&#xff0c;会经历两个阶段&#xff0c;分别是捕获阶段、冒泡阶段 简单来说&#xff1a;捕获阶段是 从父到子 冒泡阶段是从子到父 注意&…

TEMU美国儿童文具亚马逊CPC测试标准

美国站儿童文具类上架跨境电商平台美国站或者出口美国需要提交CPC认证&#xff0c;才能进入美国市场&#xff0c;由CPSC 认可的实验室出具的检测报告&#xff0c;确认每件商品均已过检测&#xff0c;符合上述适用要求。但许多亚马逊卖家反映&#xff1a;在亚马逊卖的文具类产品…

哪个思维导图软件好,知道这5个就够了!

思维导图作为一种有效的组织和展示思维的工具&#xff0c;广泛应用于学习、项目管理、创意发展等领域。然而&#xff0c;手工绘制思维导图费时费力&#xff0c;限制了其在快节奏的现代生活中的应用。本文将介绍5款可以一键生成思维导图的软件&#xff0c;它将通过智能化的方式&…

Chrome 谷歌浏览器,自动填充密码,提示需要输入电脑开机密码问题

我们在使用浏览器访问各个网站时&#xff0c;经常会保存密码。在下一次访问时&#xff0c;直接使用保存的密码填充&#xff0c;简单方便。 但是突然有一天&#xff08;怀疑是谷歌浏览器更新导致的&#xff09;&#xff0c;每次使用密码填充时&#xff0c;都有如下拦截 拦截提…

前端 select 标签如何创建下拉菜单?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 代码示例⭐ 代码讲解⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏…

PyTorch中ReduceLROnPlateau的学习率调整优化器

PyTorch中ReduceLROnPlateau的学习率调整优化器 作者&#xff1a;安静到无声 个人主页 简介&#xff1a; 在深度学习中&#xff0c;学习率是一个重要的超参数&#xff0c;影响模型的收敛速度和性能。为了自动调整学习率&#xff0c;PyTorch提供了ReduceLROnPlateau优化器&…

Linux IPIP隧道连通两个局域网

拓扑结构 现有两台主机&#xff0c;它们具有两个网口分别接入到不同网络中。 主机A&#xff1a; eth0&#xff1a;处于 10.0.1.2/24 网段eth1&#xff1a; 处于192.168.1.100/24 网段 主机B&#xff1a; eth0&#xff1a;处于10.0.2.3/24 网段eth1&#xff1a; 处于192.168.2…

持续同步的实时备份软件推荐!

什么是实时备份&#xff1f; 实时备份是一种持续数据保护方法&#xff0c;通过缩短自动保存文件的时间间隔&#xff0c;可以备份每个更改的副本&#xff0c;以捕获保存数据的每个版本。 传统备份方式只能将数据还原到备份完成时的状态&#xff0c;如果在故障发生时进行恢复…

收藏!!!一起来学习IGBT基础知识。

1 IGBT是什么&#xff1f; IGBT&#xff0c;绝缘栅双极型晶体管&#xff0c;是由&#xff08;BJT&#xff09;双极型三极管和绝缘栅型场效应管&#xff08;MOS&#xff09;组成的复合全控型电压驱动式功率半导体器件, 兼有&#xff08;MOSFET&#xff09;金氧半场效晶体管的高…

init_pg_dir 的大小及作用

init_pg_dir 的大小 vmlinux.lds.S 中 在vmlinux.lds.S 中&#xff0c;有 init_pg_dir .; . INIT_DIR_SIZE; init_pg_end .;/*include/asm/kernel-pgtable.h*/ #define EARLY_ENTRIES(vstart, vend, shift) \ ((((vend) - 1) >&g…

Zebec Protocol 将进军尼泊尔市场,通过 Zebec Card 推动该地区金融平等

流支付正在成为一种全新的支付形态&#xff0c;Zebec Protocol作为流支付的主要推崇者&#xff0c;正在积极的推动该支付方案向更广泛的应用场景拓展。目前&#xff0c;Zebec Protocol成功的将流支付应用在薪酬支付领域&#xff0c;并通过收购WageLink将其纳入旗下&#xff0c;…

3.7v升压5v4A芯片用什么型号

问&#xff1a;我需要一个能够将3.7V锂电池的电压升压到5V&#xff0c;并且能够提供4A的电流输出的芯片。请问有什么推荐的型号吗&#xff1f; 答&#xff1a;小编为您推荐AH6922B芯片&#xff0c;它具备以下特点来满足您的需求&#xff1a; 1. 输入电压范围适配&#xff1a;…

SAP 计划独立需求屏幕增强(MD61/MD62/MD63)

需求&#xff1a;在计划独立需求界面新增一列自定义字段 效果如下&#xff1a; MD63&#xff1a;显示:&#xff08;注&#xff1a;客户字段在显示界面不可以编辑&#xff09; MD61&#xff1a;创建/MD62&#xff1a;修改&#xff08;注&#xff1a;创建和修改的时候客户字段可…

C语言学习笔记 vscode使用外部console-11

前言 在默认情况下&#xff0c;我们运行C语言程序都是在vscode终端的&#xff0c;在小程序运行时这个是没有问题的&#xff0c;但是当程序变得复杂它就不好用了&#xff0c;这时我们可以将这个终端设置为外部console&#xff0c;这样方便处理更多、更复杂的程序。 步骤 1.点击…

4基础篇:自定义日志

前言 在所有的后端服务中,日志是必不可少的一个关键环节,毕竟日常中我们不可能随时盯着控制台,问题的出现也会有随机性、不可预见性。一旦出现问题,要追踪错误以及解决,需要知道错误发生的原因、时间等细节信息。 之前的需求分析部分,在网关基础代理的服务中,网关作为…

局域网内共享打印机遇到的一些问题

局域网内共享打印机遇到的一些问题 常规共享步骤主机关机后开机&#xff0c;打印机用不起了报错&#xff1a;没有权限使用报错&#xff1a;Windows无法连接到打印机报错&#xff1a;0x0000011b报错&#xff1a;0x00000709 常规共享步骤 win7作为主机使用USB连接打印机&#xf…

Python AI 绘画

Python AI 绘画 本文我们将为大家介绍如何基于一些开源的库来搭建一套自己的 AI 作图工具。 需要使用的开源库为 Stable Diffusion web UI&#xff0c;它是基于 Gradio 库的 Stable Diffusion 浏览器界面 Stable Diffusion web UI GitHub 地址&#xff1a;GitHub - AUTOMATI…