算法基础:递归算法知识笔记

1、递归算法定义

递归算法是将重复问题分解为同类的子问题而解决问题的方法,其核心思想是分治策略。

简单来说就是自己调用自己。直到达到退出递归的条件,则完成递归。

2、递归的步骤

1、找整个递归的终止条件:递归应该在什么时候结束?

2、找返回值:应该给上一级返回什么信息?

3、本级递归应该做什么:在这一级递归中,应该完成什么任务?

3、递归的优点和缺点

优点:递归的核心思想就是将一个大问题,拆解成一个小问题,然后将小问题再次拆解,层层拆分从而简化问题的实现。从而达到简化重复的代码让程序变得更加简洁。

缺点:使用递归算法时每次方法的调用都需要在栈中开辟出一个空间保存相关数据,频繁的压栈、弹栈会导致效率变低。

4、递归的案例

4.1 阶乘的算法

    // 阶乘的递归实现

    public static long f(int n){

        if(n == 1)   // 结束递归终止条件 

            return 1;   

 

        return n*f(n-1);  // 相同重复逻辑,缩小问题的规模

    }

4.2 斐波纳契数列

斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……

在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)。

public static int fibonacci(int n) {

        if (n == 1 || n == 2) {     // 递归终止条件

            return 1;       // 简单情景

        }

        return fibonacci(n - 1) + fibonacci(n - 2); // 相同重复逻辑,缩小问题的规模

}

4.3  汉诺塔问题

/** 

* Title: 汉诺塔问题 

* Description:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。 

* 有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下, 

* 小盘在上。在移动过程中可以利用B座。要求输入层数,运算后输出每步是如何移动的。 

 */

public class HanoiTower {

 

    /**     

     * @description 在程序中,我们把最上面的盘子称为第一个盘子,把最下面的盘子称为第N个盘子

     * @author rico       

     * @param level:盘子的个数

     * @param from 盘子的初始地址

     * @param inter 转移盘子时用于中转

     * @param to 盘子的目的地址

     */

    public static void moveDish(int level, char from, char inter, char to) {

 

        if (level == 1) { // 递归终止条件

            System.out.println("从" + from + " 移动盘子" + level + " 号到" + to);

        } else {

            // 递归调用:将level-1个盘子从from移到inter(不是一次性移动,每次只能移动一个盘子,其中to用于周转)

            moveDish(level - 1, from, to, inter); // 递归调用,缩小问题的规模

            // 将第level个盘子从A座移到C座

            System.out.println("从" + from + " 移动盘子" + level + " 号到" + to); 

            // 递归调用:将level-1个盘子从inter移到to,from 用于周转

            moveDish(level - 1, inter, from, to); // 递归调用,缩小问题的规模

        }

    }

 

    public static void main(String[] args) {

        int nDisks = 30;

        moveDish(nDisks, 'A', 'B', 'C');

    }

4.4 二叉树深度 

public static int getTreeDepth(Tree t) { 

        // 树为空

        if (t == null) // 递归终止条件

            return 0; 

        int left = getTreeDepth(t.left); // 递归求左子树深度,缩小问题的规模

        int right = getTreeDepth(t.left); // 递归求右子树深度,缩小问题的规模 

        return left > right ? left + 1 : right + 1;

    }

 

 

 

IT技术分享社区

个人博客网站:https://programmerblog.xyz

文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识

 1、递归算法定义

递归算法是将重复问题分解为同类的子问题而解决问题的方法,其核心思想是分治策略。

简单来说就是自己调用自己。直到达到退出递归的条件,则完成递归。

2、递归的步骤

1、找整个递归的终止条件:递归应该在什么时候结束?

2、找返回值:应该给上一级返回什么信息?

3、本级递归应该做什么:在这一级递归中,应该完成什么任务?

3、递归的优点和缺点

优点:递归的核心思想就是将一个大问题,拆解成一个小问题,然后将小问题再次拆解,层层拆分从而简化问题的实现。从而达到简化重复的代码让程序变得更加简洁。

缺点:使用递归算法时每次方法的调用都需要在栈中开辟出一个空间保存相关数据,频繁的压栈、弹栈会导致效率变低。

4、递归的案例

4.1 阶乘的算法

    // 阶乘的递归实现

    public static long f(int n){

        if(n == 1)   // 结束递归终止条件 

            return 1;   

 

        return n*f(n-1);  // 相同重复逻辑,缩小问题的规模

    }

4.2 斐波纳契数列

斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……

在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)。

public static int fibonacci(int n) {

        if (n == 1 || n == 2) {     // 递归终止条件

            return 1;       // 简单情景

        }

        return fibonacci(n - 1) + fibonacci(n - 2); // 相同重复逻辑,缩小问题的规模

}

4.3  汉诺塔问题

/** 

* Title: 汉诺塔问题 

* Description:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上。 

* 有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下, 

* 小盘在上。在移动过程中可以利用B座。要求输入层数,运算后输出每步是如何移动的。 

 */

public class HanoiTower {

 

    /**     

     * @description 在程序中,我们把最上面的盘子称为第一个盘子,把最下面的盘子称为第N个盘子

     * @author rico       

     * @param level:盘子的个数

     * @param from 盘子的初始地址

     * @param inter 转移盘子时用于中转

     * @param to 盘子的目的地址

     */

    public static void moveDish(int level, char from, char inter, char to) {

 

        if (level == 1) { // 递归终止条件

            System.out.println("从" + from + " 移动盘子" + level + " 号到" + to);

        } else {

            // 递归调用:将level-1个盘子从from移到inter(不是一次性移动,每次只能移动一个盘子,其中to用于周转)

            moveDish(level - 1, from, to, inter); // 递归调用,缩小问题的规模

            // 将第level个盘子从A座移到C座

            System.out.println("从" + from + " 移动盘子" + level + " 号到" + to); 

            // 递归调用:将level-1个盘子从inter移到to,from 用于周转

            moveDish(level - 1, inter, from, to); // 递归调用,缩小问题的规模

        }

    }

 

    public static void main(String[] args) {

        int nDisks = 30;

        moveDish(nDisks, 'A', 'B', 'C');

    }

4.4 二叉树深度 

public static int getTreeDepth(Tree t) { 

        // 树为空

        if (t == null) // 递归终止条件

            return 0; 

        int left = getTreeDepth(t.left); // 递归求左子树深度,缩小问题的规模

        int right = getTreeDepth(t.left); // 递归求右子树深度,缩小问题的规模 

        return left > right ? left + 1 : right + 1;

    }

 

 

 

IT技术分享社区

个人博客网站:https://programmerblog.xyz

文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识

 

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

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

相关文章

ttl继承逻辑门的逻辑功能与参数测试 实验总结_LMS电声测试仪,LMS-V测试系统,精声电声...

LMS-V测试系统LMS扬声器测试仪从推出到现在25年的时间,在全世界被很多扬声器开发与制造厂家广泛应用研发与生产质量控制,传统的LMS扬声器测试仪采用ISA卡的形式提供,所以面临着越来越多的零件过时,所以为了彻底解决这些问题&#…

java中break标记的使用

笔试题目&#xff1a;break目前位于内层的for循环&#xff0c;如何才能让break作用于外层 的for循环。可以标记解决 标记的命名只要符合标识符的命名规则即可。 Test public void test2(){aaa:for(int j 0 ; j<3 ; j){ // j0 外层for循环for(int i 0 ; i< 2 ; i){ //…

电脑基础知识入门:键盘上的英文,意思和功能汇总!

电脑键盘是把文字信息的控制信息输入电脑的通道&#xff0c;从英文打字机的键盘演变而来的。它最早出现在电脑上的时候&#xff0c;还是一种叫做“电传打字机”的部件。那些陌生的键盘按键都有什么用途?很多孩子不知道键盘上功能键和字母数字键以外的键盘按键有什么用&#xf…

elementui el-dialog 离顶部的位置_驻马店建筑物避雷带的安装位置,本月报价

首页 > 新闻中心发布时间&#xff1a;2020-11-06 18:23:42 导读&#xff1a;科杰防雷为您提供驻马店建筑物避雷带的安装位置的相关知识与详情&#xff1a; 该系统在正常运行时&#xff0c;不管三相负荷平衡不平衡&#xff0c;在中性线N带电情况下&#xff0c;PE线不会带电。…

android 弹出框带标题栏,Android开发靠标题栏的弹框

一、效果图title_dialog.png二、思路首先它是一个弹框&#xff0c;只是弹框的布局做些处理&#xff0c;布局占满屏幕&#xff0c;只有需要白色的布局的背景设为白色。其他没设置背景颜色&#xff0c;自然用dialog的style的windowBackground三、案例关键代码dialog的xmlxmlns:ap…

算法基础:图的相关算法知识笔记

一、图的相关算法1、图的分类知识如下图&#xff1a;2、生成树概念对连通图进行遍历&#xff0c;过程中所经过的边和顶点的组合可看做是一棵普通树&#xff0c;通常称为生成树。连通图的生成树具有这样的特征&#xff1a;边的数量 顶点数 - 13、最小生成树在连通网的所有生成树…

java中break和continue的用法例子

break用于switch语句 1. break用于switch语句中&#xff0c;终止switch语句 下面先看 加上break,效果如下 我们可以看到&#xff0c;没有用过break关键字时&#xff0c;不会在判断下一个case的值&#xff0c;直接向后运行&#xff0c;直到遇到break&#xff0c;或者整体swit…

ftp 工具_ftp工具,ftp工具有哪些

对于ftp工具&#xff0c;你了解多少&#xff1f;其实一般人也接触不到这种软件。ftp工具主要是针对从事网站管理的工作人员比较有利的一款工具。可以帮助他们快速的解决工作中的问题。方便、简单、快捷又明了的解决问题。那ftp工具有哪些呢&#xff1f;接下来给大家推荐四款好用…

盘点世界十大软件外包公司排名是哪些公司

排名第一:IBMIBM,总部在纽约的阿蒙克。托马斯沃森19世纪80年代在美国成立,是全球最大的信息技术和商业解决方案公司,在全球拥有超过30万名员工,业务遍及160多个国家和地区。电脑上的制作非常出名,事实上,IBM在软件方面取得了巨大的成就,特别是在一些IBM服务器上使用的软件平台上…

判断不为空和不为空串的方法java

判断不为空和不为空串的方法 方法一:用StringUtils工具类 首先要引入依赖 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId> </dependency> if( StringUtils.isNotBlank(str3) && St…

android xml事件,安卓事件

1、自定义内部类2、匿名内部类3、当前activity去实现事件接口4、在布局文件xml中添加点击事件属性(使用频率非常高)补充&#xff1a;a、Android 在xml文件中 给某个控件声明 id 是: "/自定义名字" &#xff0c;获取是&#xff1a; "/自定义的名字" &#x…

Cocos2d-x v3.0物理系统 利用PhysicsEditor创建多边形

Cocos2d-x 3.0的新物理系统我就不必多说了&#xff0c;接触一段时间&#xff0c;感觉还是不错的。对于那些基本概念&#xff0c;网上的教程已经泛滥了&#xff0c;就不多说了&#xff0c;不过对于创建多边形物体的教程&#xff0c;还真不多&#xff0c;很多都是创建圆形和矩形&…

公众号开发 单独 给某个用户 推送消息_韩国5G用户6月底已达134万 较5月底增加近70%...

中关村在线消息&#xff1a;韩国三大运营商SK、KT和LG率先于去年12月开始向企业用户提供商用5G 服务&#xff0c;今年4月初推出面向个人消费者的5G民用服务。韩国作为全球首个推出5G 服务的国家&#xff0c;他们的5G用户数量在6月时已经突破100万大关。日前韩国公布6月底最新的…

程序语言的概念知识笔记

1、低级语言和高级语言 计算机指令程序&#xff1a;0、1 组成的机器指令序列。特点&#xff1a;效率低、可读性差、难以维护。 汇编指令&#xff1a;用常用的符号代替0、1 序列来 表示机器指令&#xff0c;例如用ADD表示加法。 高级语言&#xff1a;面向对象设计的各类应用的程…

java lambda 表达式中的双冒号和箭头的用法 ::

先构造一些数据,创建一个User类 java lambda 表达式中的双冒号的用法 &#xff1a;&#xff1a; 双冒号运算就是Java中的[方法引用],[方法引用]的格式是 类名::方法名 如下图所示 User是一个类, getAge是方法名,注意是方法名呀&#xff0c;后面没有括号()的。为什么不要括号…

linux内核设计与实现 中文第三版 pdf_大牛推荐的5本 Linux 经典必读书

今天给大家推荐5本Linux学习相关的书籍&#xff1b;这些书籍基本都是很多大牛推荐过&#xff0c;并且深受业界好评的书&#xff1b;虽然只有5本&#xff0c;但是相信把5本全都认真看过的同学应该不多吧&#xff1f;希望这些书能够帮助你进阶为大牛&#xff01;5.《鸟哥的 Linux…

号称最好的国产操作系统在 Windows 10 面前能否一战?

统信软件旗下的UOS操作系统正式推出UOS V20个人版&#xff0c;并开启99元预售活动。统信UOS虽名不见经传&#xff0c;但身披“国产操作系统”外衣的它却让科技圈炸开了锅。有人说它是“国货之光”&#xff0c;堪称最好的国产系统&#xff0c;但也因为“收费”的问题引发一致批评…

js打开android应用程序,浏览器通过JS打开Android程序

做项目的时候&#xff0c;项目中有个需求&#xff0c;需要通过网页打开app&#xff0c;听到这个功能&#xff0c;我先是蛋疼了一会&#xff0c;但是在网上查了一下资料发现原理其实很简单&#xff0c;本质就是通过浏览器输入我们本地android程序的路径&#xff0c;不过这个路径…

lamba统计最大值,最小值,平均值,总和,个数

代码如下: List<Integer> ages Arrays.asList(1,3,5,7,8,10,12); IntSummaryStatistics intSummaryStatistics ages.stream().mapToInt(e -> e).summaryStatistics(); System.out.println("最大值: " intSummaryStatistics.getMax()); System.out.print…

程序语言的组成知识笔记

程序语言的基本成分包括数据‘运算、控制、传输。 1、程序语言的数据成分 数据成分指程序中的数据对象&#xff0c;数据是程序程序操作的对象&#xff0c;具有存储类型、数据类型、数据名称、作用域、生存周期等属性。 1.1 常量和变量 按照程序运行时数据能否改变&#xff0c;将…