递归设计

算法设计与分析——递归 递归何为递归递归定义何时使用递归递归模型递归算法的执行过程递归算法设计递归算法设计的一般步骤 何为递归 递归定义 在定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。 若调用自身,称之为直接递归。若过程或函数p调用过程或函数q,而q又调用p,称之为间接递归。 任何间接递归都可以等价地转换为直接递归。 如果一个递归过程或递归函数中递归调用语句是最后一条执行语句,则称这种递归调用为尾递归。 一般来说,能够用递归解决的问题应该满足以下三个条件: 1)需要解决的问题可以转化为一个或多个子问题来求解,而这 阅读详情

递归设计的核心

递归设计的核心在于两点:

  1. 递归停止条件的判断
  2. 递归中对于问题的普适情况的解决方案

抓住这两点才能巧妙的解决问题。

递归问题的经典案例:

  1. 迷宫问题
  2. 汉诺塔问题

迷宫问题

假设有如下迷宫,其中1代表通路,0代表短路,请找出走出迷宫的道路。

1110110001111
1011101111001
0000101010100
1110111010111
1010000111001
1011111101111
1000000000000
1111111111111

解决问题的思路:

  1. 终止条件:
    如果所在格子是迷宫的最右下角,且该格子数值为1,那么迷宫走通,递归结束。

  2. 递归内容
    如果所在格子是迷宫的第m行,第n列,则进行如下判断

a. 如果该格子是在迷宫矩阵中,且数值为1,那么我们将齐标记为以判定格子(改写数值为3)
b. 然后分别判断该格子的上下左右相邻格子是否为通路
c. 如果相邻格子中有一个递归判断是通路,则当前格子在走出迷宫的道路上(改写数值为7)
d. 向上层返回对格子是否在通路上的判断

代码展示
Maze.java

package recurrence.maze;

public class Maze {

    public static int UNBLOCKED = 1;

    public static int TRIED = 3;

    public static int PATH = 7;

    public static int[][] MAZE = { { 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1 }, { 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1 },
            { 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0 }, { 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1 },
            { 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1 }, { 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1 },
            { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } };

    public static boolean traverse(int row, int column) {
        boolean isValidPath = false;

        if (valid(row, column)) {
            MAZE[row][column] = TRIED;

            if (row == MAZE.length - 1 && column == MAZE[0].length - 1) {
                isValidPath = true;
            } else {
                isValidPath = traverse(row + 1, column); // down
                if (!isValidPath) {
                    isValidPath = traverse(row, column + 1); // right
                }
                if (!isValidPath) {
                    isValidPath = traverse(row - 1, column); // up
                }
                if (!isValidPath) {
                    isValidPath = traverse(row, column - 1); // left
                }
            }

            if (isValidPath) {
                MAZE[row][column] = PATH;
            }
        }

        return isValidPath;
    }

    public static boolean valid(int row, int column) {
        boolean result = false;

        if (row >= 0 && row < MAZE.length && column >= 0 && column < MAZE[row].length) {
            if (MAZE[row][column] == UNBLOCKED) {
                result = true;
            }
        }

        return result;
    }

    public static void printMaze() {
        for (int[] row : Maze.MAZE) {
            for (int column : row) {
                System.out.print("" + column);
            }
            System.out.println();
        }
    }
}

MazeSearch.java

public class MazeSearch {

    public static void main(String[] args) {
        System.out.println("Before search");
        Maze.printMaze();

        if (Maze.traverse(0, 0)) {
            System.out.println("\nThere is a path.\n");
        } else {
            System.out.println("\nNo valid path.\n");
        }

        System.out.println("After search");
        Maze.printMaze();
    }

}

最后结果

7770110001111
3077707771001
0000707070300
7770777070333
7070000773003
7077777703333
7000000000000
7777777777777

汉诺塔问题

汉诺塔问题所解决的问题模型是:
有三根柱子1柱子、2柱子和3柱子,n个盘子按照从小到大的顺序依次叠放在一根柱子上,要求在不能将大盘子放置在小盘子的规则下,将n个盘子移至另一个柱子上,从小到大按序叠放好。

解决思路:

  1. 递归停止的判断条件为将一个盘子从起点柱子直接移至终点柱子。
  2. 递归内容:如要完成n个盘子从起点柱子1移至终点柱子3需要
    a. 将n-1个盘子从柱子1移至柱子2
    b. 将最大的盘子从柱子1移至柱子3
    c. 将n-1个盘子从柱子2移至柱子3
    其中a,b又创造了新的移动问题,即移动n-1个盘子从某一起点柱至终点柱。
public class Hanoi {

    public static void main(String[] args) {
        int n = 4;
        System.out.println("Begin to resolve Hanoi problem for [" + n + "] disks.");
        Hanoi.hanoiMove(n, 1, 3, 2);
    }

    public static void hanoiMove(int n, int start, int end, int temp) {
        if (n == 1) {
            moveOneDisk(start, end);
        } else {
            hanoiMove(n - 1, start, temp, end);
            moveOneDisk(start, end);
            hanoiMove(n - 1, temp, end, start);
        }
    }

    public static void moveOneDisk(int start, int end) {
        System.out.println("Move disk from post [" + start + "] to post [" + end + "]");
    }
}

输出结果

Begin to resolve Hanoi problem for [4] disks.
Move disk from post [1] to post [2]
Move disk from post [1] to post [3]
Move disk from post [2] to post [3]
Move disk from post [1] to post [2]
Move disk from post [3] to post [1]
Move disk from post [3] to post [2]
Move disk from post [1] to post [2]
Move disk from post [1] to post [3]
Move disk from post [2] to post [3]
Move disk from post [2] to post [1]
Move disk from post [3] to post [1]
Move disk from post [2] to post [3]
Move disk from post [1] to post [2]
Move disk from post [1] to post [3]
Move disk from post [2] to post [3]
算法与程序设计之递归程序设计 文章目录递归程序设计1、递归的定义2、何时使用递归3、递归的模型4、递归算法的执行过程递归设计解题过程结语 递归程序设计 1、递归的定义 递归是指在函数定义中有吊影函数自身的方法,若函数p函数定义中又调用了函数p,这种递归称为直接递归,若p函数调用函数q, 函数q 有调用了 函数p,称之为间接递归。 一般来说,能够用递归解决的问题应该满足三个条件 1、需要解决的问题可以转换为一个或多个子问题来求解... 阅读详情

相关推荐

基础算法之二:递归

递归用处很广,可以将复杂问题简单化。 很多问题都可以使用递归算法或结合递归算法得到解决。 那么,设计递归算法的关键是什么? 其关键之处在于,正确分析出2种类型的节点:出口节点和入口节点 一 算法关键: 出口节点 , 入口节点 递归问题可看做是由各个节点构成,而所有节点只能分为出口节点、入口节点两类。 1)出口节点: 可直接计算此节点的值,

目前打算换一个工作,有招聘windows c++方向的也欢迎联系,北京、济南 最好 1564

算法设计方法:递归的内涵与经典应用

大师说:To Iterate is Human, to Recurse, Divine.毋庸置疑地,递归确实是一个奇妙的思维方式。对一些简单的递归问题,我们总是惊叹于递归描述问题和编写代码的简洁,但要想真正领悟递归的精髓、灵活地运用递归思想来解决问题却并不是一件容易的事情。本文剖析了递归的思想内涵并分析了阶乘、斐波那契数列、汉诺塔、杨辉三角的存取、字符串回文判断、字符串全排列、二分查找、树的深度求解等八个问题。

Rico's Blogs 3万+

weblogic 集群搭建,双机部署,相关问题记录

4.5.集群搭建1 参考网址https://wenku.baidu.com/view/76365129cd1755270722192e453610661ed95aa4.html IP地址 端口 角色 192.168.1.160 9001 AdminServer ...

zl386119974的专栏 1670

递归三要素

第一要素:明确你这个函数想要干什么: 第二要素:寻找递归结束条件: 所谓递归,就是会在函数内部代码中,调用这个函数本身,所以,我们必须要找出递归的结束条件,不然的话,会一直调用自己,进入无底洞。也就是说,我们需要找出当参数为啥时,递归结束,之后直接把结果返回,请注意,这个时候我们必须能根据这个参数的值,能够直接知道函数的结果是什么。 只要你觉得参数是什么时,你能够直接知道函数的结果,那么你就可以把这个参数作为结束的条件,所以下面这段代码也是可以的。 第三要素:找出函数...

weixin_42112224的博客 2702

YOLOv11多模态融合实战:基于YOLOFuse的RGB与红外线(IR)协同检测技术解析

本文深入解析了基于YOLOv11的YOLOFuse多模态融合技术,重点探讨了RGB与红外线(IR)协同检测的实现原理与实战应用。文章详细介绍了双流架构与数据级、特征级、决策级三种融合策略,并通过实战案例展示了其在低光照、复杂环境下显著提升检测精度与鲁棒性的优势,为全天候安防、自动驾驶等场景提供了有效的技术解决方案。

weixin_29041195的博客 650

形式化方法(Formal Methods)和人工智能(Artificial Intelligence)

一、形式化方法(Formal Methods) ​ 形式化方法最初应用在硬件上,验证硬件的正确性,后面逐渐应用到软件编程中,能够在软件中找到软件的错误,验证软件的安全可靠。形式化方法更加接近离散数学,所以其应用难度非常大,同时学习成本也较高。再加上形式化方法的大多数理论还停留在上个世纪,由于程序越来越复杂,导致形式化方法进行验证需要大量人工和时间,以至于现在绝大部分软件开发人员完全没有考虑过这个方法,甚至没有听说过这个名词。 ​ 形式化方法最新的应用成果是在工业上,比如一些极其重要且对安全性要求极高的领域(

qq_37030400的博客 4005

关于递归重要的一些点

关于递归的某些用法关于递归重要的一些点递归回溯剪枝法标准的递归应用 关于递归重要的一些点 (一)终止条件 终止条件是递归至少最终能出来一个结果的必要条件。基本上在决定使用递归的时候就要清楚你应该什么时候终止。 (二)本层操作 这是递归最重要的一层,你不仅需要认真考虑怎么通过条件进行下一层递归,还需要考虑下一层递归的返回结果,更重要的是如何处理这个返回结果,也就是说这个返回结果成功或者失败之后你需要...

Vixerunt_的博客 935

多模型对抗性审查:用AI辩论提升技术文档质量

在软件工程领域,技术文档是团队协作和项目成功的关键基础。传统的文档评审依赖人工经验,存在盲区和效率瓶颈。通过引入多模型对抗性审查机制,不同大语言模型从各自视角对文档进行批判性分析,模拟现实中的专家评审过程。这种技术方法的核心价值在于利用模型间的思维差异,自动发现单个视角容易忽略的边界情况、逻辑漏洞和隐含假设。在应用场景上,特别适合产品需求文档和技术规格书这类需要多角度审视的复杂文档。adversarial-spec工具通过Claude协调多模型辩论,实现从概念到实现的完整文档质量保障,显著提升文档的完整性和

weixin_42531579的博客 379

简答题

简答题

清影的博客 980

基于STM32设计的智能水产养殖系统(华为云IOT)(152)

当前设计的智能水产养殖系统主控芯片采用STM32F103RCT6,可以实现对水位、水温、水混浊度和PH值等参数的监测和控制,并且支持定时投喂功能。通过连接华为云物联网平台,将传感器数据上传到服务器,并通过Qt设计的Android手机APP来获取设备上传的数据,从而实现对养殖环境的远程监测和控制。

8828

【R语言】基于Biomod2集成平台探究物种分布区的构建流程(SDMs)

我为什么想要写这个内容呢?其实我已经想了很久了,但是一直没有把所有的代码给理清楚,此外这将是我之后研究的主要方向。本博客讲述了如何基于Biomod2集成平台构建物种分布模型的全流程,以及我在使用该模型时的一些心得,同时还有我提供的一些小福利(一键处理代码),可以十分快捷的帮助你完成SDMs的构建,写出你的中英文论文。

amyniez的博客,欢迎交流讨论 3889

2、递归算法的设计

1. 能够使用递归的条件: 一般来说,能够使用递归解决问题应该满足以下3个条件: 需要解决的问题可以转化为一个或多个子问题来解决,而这些子问题的求解方法与原问题完全相同,只是在数量规模上不同。 递归调用的次数必须是有限的。 必须有结束递归的条件来终止递归。 2. 递归算法的设计步骤: 对原问题 f(sn) 进行分析,假设出合理的小问题 f(sn-1)。 给出 f(sn) 与 f(sn-1)...

Lesour的博客 2554

YOLOv8人工智能与深度学习——强化学习

本文介绍了将YOLOv8目标检测模型与强化学习结合的方法。主要应用包括自适应目标检测(动态调整检测参数)、主动学习(智能选择标注样本)和多目标跟踪优化。实现方案采用深度Q网络策略,通过定义状态表示、动作空间和奖励函数,使检测系统能根据环境反馈优化性能。该方法具有自适应优化、资源高效、持续改进等优势,能构建更智能的计算机视觉系统。文章详细说明了强化学习环境的构建、策略网络的实现以及训练过程,并提供了代码示例。

u010117029的博客 259

递归算法设计规则

设计递归算法应牢记四大基本规则: 基准情形(必须要有某些基准情况,它不需要递归就能求解出答案) 例如: 这个函数需要求解必须要有一个已知条件比如 如果没有一个已知条件这个函数是无意义的! 它的递归实现如下: private int f(int x){ if (x==0) return 0; else return 2*f(x-1)+x*x...

qq_38622223的博客 1122

scratch绘制四个三角形 2024年6月中国电子学会 图形化编程 scratch编程等级考试二级真题和答案解析

​ scratch绘制四个三角形 一、题目要求 2024年6月电子学会图形化编程Scratch等级考试二级真题 1、准备工作 1.保留默认角色小猫; 2.添加背景Stars。 2、功能实现 1 .隐藏角色小猫,设置画笔裙始位置为(0,0),画笔颜色为黄色,画笔的粗细为5; 2. 点击绿旗,绘制如下图所示图形,三角形的边长为50。 二、案例分析 1、角色分析 角色:小猫 2、背景分析 背景:Stars背景 3、前期准备 1. 保留默认的小猫不变 ​

青少年编程学习指导 1717

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

递归程序设计

目录实验内容题目分析算法构造算法实现运行结果 实验内容 用递归方法设计下列各题,并给出每道题目的递归出口(递归结束的条件)和递归表达式。同时考虑题目可否设计为非递归方法,如果可以,设计出非递归的算法。 1.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子? 2.角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自

qq_45732510的博客 290

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

递归算法设计技术

递归算法设计技术递归的定义需要满足的条件何时使用递归递归模型递归算法的执行过程递归算法设计递归数据结构及其递归算法设计单链表的递归算法设计二叉树的递归算法设计基于归纳思想的递归算法设计 递归的定义 在定义一个过程或函数时出现调用本过程或本函数的成分。称之为递归。 若调用自身,称之为直接递归。若过程或函数p调用过程或函数q,而q又调用p,称之为间接递归。 任何间接递归都可以等价地转换为直接递归。 如...

LixDemon的博客 1759

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

设计递归函数竟然这么简单!

本文来自“天狼啸幽月”的投稿,已获独家授权关于设计递归函数,个人有一点总结和心得,和大家分享一下。从一个简单的例子开始#include"stdio.h" intfun(intn)//求1+2+3+…+n的结果 { if(n==1) return1; returnn+fun(n-1); } intmain(void) ...

码农翻身 8815

递归算法设计心得

目录一、递归算法设计流程1.分析要解决的问题,即函数f代表的含义是入参n,出参返回n的阶乘,完成整体框架搭建:2. 分析问题中循环利用的环节,所谓求解n的阶乘,就是就是求解n * (n-1)! ,依次求解下去, 直到求解到n=2的时候,即循环结束的条件是n=1;3. 找规律,以n为未知数,找到通用的式子,如:f(n) = n * f(n-1) 一、递归算法设计流程 例如: 计算n的阶乘(以简单题为例) 1.分析要解决的问题,即函数f代表的含义是入参n,出参返回n的阶乘,完成整体框架搭建: int f(i

Foreverthinker的博客 692

递归程序设计方法

递归程序设计方法 (一)递归程序设计方法的要点 1) 对于含有递归特征的问题,最好设计递归形式的算法。但也不要单纯追求形式。应在算法设计的分析过程中“就事论事”。例如,在利用分割求解设计算法时,子问题和原问题的性质相同;或者,问题的当前一步解决之后,余下的问题和原问题性质相同,则自然导致递归求解。2) 实现递归函数,目前必须利用“栈”。一个递归函数...

LHL62411570的专栏 497

[算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进

[算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进 从学习写代码伊始, 总有个坎不好迈过去, 那就是遇上一些有关递归的东西时, 看着简短的代码, 怎么稀里糊涂就出来了. 今天我们就来好好好探讨递归这个东西. 本文结合他的相关概念,引出有关递归程序设计的一些例子,并加以说明, 其旨在更好地理解递归,使用递归. 0 什么是递归? 很多文章对于递归有很深刻的字面上的解释, ...

lawfree的博客 1万+

递归算法设计

递归是一种十分重要的程序设计方法,对 于一些问题,用递归方法设计算法可使算 法简洁明了,逻辑清晰,易于设计递归算法:直接或间接地调用自身的算法 。递归函数:用函数自身给出定义的函数称 为递归函数。递归关系:对原问题的求解可转化为对其 性质相同 的子问题的求解。递归方法:用于解决一类满足递归关系的 问题设计要素:边界条件,递归方程 当算法中某步骤要通过解质相同的子问题实现时,该步骤用递归调用实现。当子问题的规模充分小时可直接求解时,递归结束参数表示了原问题及其不同的子问题。参数表示了子问题的大小和状态,以区

xiaoyao_zhy的博客 1968

《算法设计与分析》第二章:递归

在定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。若调用自身,称之为直接递归。若过程或函数p调用过程或函数q,而q又调用p,称之为间接递归。任何间接递归都可以等价地转换为直接递归。如果一个递归过程或递归函数中递归调用语句是最后一条执行语句,则称这种递归调用为尾递归。else在该函数fun(n)求解过程中,直接调用fun(n-1)(语句4)自身,所以它是一个直接递归函数。又由于递归调用是最后一条语句,所以它又属于尾递归。

qq_75027857的博客 1509

递归程序设计实例及解析

一:实验目的 1.掌握递归程序设计的方法。明确递归的概念,通过对问题的分析,找出递归关系以及递归出口以对问题进行递归结构设计; 2.掌握递归程序转换为非递归程序的方法。 二:实验内容 用递归方法设计下列各题,并给出每道题目的递归出口(递归结束的条件)和递归表达式。同时考虑题目可否设计为非递归方法,如果可以,设计出非递归的算法。 1.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只...

weixin_44365158的博客 542
上一篇: 设计模式-行为型模式
下一篇: ThreadPoolExecutor关于Execute方法
AlainGogogo
博客等级 码龄18年 5粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值