递归的详细讲解

概述

简介

程序调用自身的编程技巧称为递归,递归解决问题通常名为暴力搜索

三要素

明确递归终止条件

给出递归终止时的处理办法

可以提取重复逻辑,缩小问题规模

优点

递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量

缺点

递归解决问题运行效率较低,因此应该尽量避免使用递归

在递归调用的过程中系统为每一层的返回点 ,局部量等开辟了栈来储存,递归次数过多可能会造成栈溢出。

解决递归问题的思路 

没思路时

1.画树

2.找出口

递归的两套模板


/**
 * 打印1-100
 */
public class Main {
    public static void main(String[] args) {
        f1(1);
        System.out.println();
        f2(100);
    }

    /**
     * 递的时候打印
     *
     * @param n
     */
    public static void f1(int n) {
        if (n <= 100) {
            System.out.print(n + " ");
            f1(n + 1);
        }
    }

    /**
     * 归的时候打印
     *
     * @param n
     */
    public static void f2(int n) {
        if (n >= 1) {
            f2(n - 1);
            System.out.print(n + " ");
        }
    }
}

简单算法

求斐波那契数列的第n项

问题

求斐波那契数列的第n项

波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55【每个数字是前两个数字的和】

实现

/**
 * 求斐波那契数列的第n项
 *
 * 波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55【每个数字是前两个数字的和】
 */
public class Main {
    public static void main(String[] args) {
        System.out.println(fibonacci(5));
    }

    public static int fibonacci(int n) {
        if (n > 1) {
            return fibonacci(n - 1) + fibonacci(n - 2);
        } else {
            return n;
        }
    }
}
          

爬楼梯问题 

问题

一个楼梯总共有n级台阶,你每次可以走1个台阶或者两个台阶,问从第0级台阶走到第n级台阶一共有多少种方案

思路

1.此算法类型为深度优先搜索 

2.可以画树

实现

/**
 * 爬楼梯问题
 *
 * 问题: 一个楼梯总共有n级台阶,问从第0级台阶走到第n级台阶一共有多少种方案。
 * 你每次可以走1个台阶或者两个台阶。
 */
public class Main {
    private static int res = 0;

    public static void main(String[] args) {
        f1(0, 4);
        System.out.println(res);
    }

    /**
     *
     * @param startFloor 开始台阶
     * @param endFloor 结束台阶
     */
    private static void f1(int startFloor, int endFloor) {
        //如果爬上了最后一层台阶,说明找到了一种方案
        if (startFloor == endFloor) {
            res++;
        }
        //如果没有爬完,则可能爬1或者2阶台阶
        if (startFloor < endFloor) {
            f1(startFloor + 1, endFloor);
            f1(startFloor + 2, endFloor);
        }
    }
}
          

中等算法

全排列

来源

. - 力扣(LeetCode)

题目

给定一个不含重复数字的整数数组 nums ,返回其所有可能的全排列 ,可以按任意顺序返回答案

思路

实现

import java.util.ArrayList;
import java.util.List;

class Solution {
    //全排列集合
    List> itemList = new ArrayList();
    //存放每一个方案的数组
    List item = new ArrayList();
    //用于判断当前数字有没有被用过的数组
    boolean[] haveUse;

    public List> permute(int[] nums) {
        haveUse = new boolean[nums.length];
        f(0, nums);
        return itemList;
    }

    void f(int start, int[] nums) {
        //如果所有数都被用过了,说明找到了一组方案
        if (start == nums.length) {
            itemList.add(new ArrayList(item));
        }
        //否则就循环遍历数组
        for (int i = 0; i < nums.length; i++) {
            if (!haveUse[i]) {
                item.add(nums[i]);
                haveUse[i] = true;//加入方案数组后,标记该数字被使用
                f(start + 1, nums);
                // 回溯
                haveUse[i] = false;
                item.remove(item.size() - 1);
            }
        }
    }
}

           

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows SDK编程 --- 消息(3)

前置知识 一、消息的分类 1. 鼠标消息 处理与鼠标交互相关的事件&#xff0c;比如移动、点击和滚动等。例如&#xff1a; WM_MOUSEMOVE: 当鼠标在窗口客户区内移动时发送。WM_LBUTTONDOWN: 当用户按下鼠标左键时发送。WM_LBUTTONUP: 当用户释放鼠标左键时发送。WM_RBUTTOND…

[2024更新]如何从Android恢复已删除的相机照片?

相信大家都经历过Android手机误删相机图片的经历。您是否正在寻找一种可行的方法来挽救这些丢失的照片&#xff1f;如果这是你迫切想解决的问题&#xff0c;那么这篇文章绝对可以帮助你。然而&#xff0c;与其考虑如何从Android恢复已删除的相机照片&#xff0c;我们更愿意建议…

激光雷达(LiDAR)面临的主要问题与挑战

本文讨论目前激光雷达在汽车、机器人以及无人机等场景应用时面临的一些问题和挑战,包括成本、尺寸、系统复杂性、杂散反射、续航,以及安全性等方面。 成本 一直以来,激光雷达的成本都是影响其广泛应用的关键因素。从最早的上万美元一颗,经过近十年的发展,激光雷达的价格…

20240331-1-基于深度学习的模型

基于深度学习的模型 知识体系 主要包括深度学习相关的特征抽取模型&#xff0c;包括卷积网络、循环网络、注意力机制、预训练模型等。 CNN TextCNN 是 CNN 的 NLP 版本&#xff0c;来自 Kim 的 [1408.5882] Convolutional Neural Networks for Sentence Classification 结…

网络安全数字孪生:一种新颖的汽车软件解决方案

摘要 随着汽车行业转变为数据驱动的业务&#xff0c;软件在车辆的开发和维护中发挥了核心作用。随着软件数量的增加&#xff0c;相应的网络安全风险、责任和监管也随之增加&#xff0c;传统方法变得不再适用于这类任务。相应的结果是整车厂和供应商都在努力应对汽车软件日益增加…

C++及QT的线程学习

目录 一. 线程学习 二. 学习线程当中&#xff0c;得到的未知。 1. 了解以下MainWindow和main的关系 2. []()匿名函数 有函数体&#xff0c;没有函数名. 3. join和detach都是用来管理线程的生命周期的&#xff0c;它们的区别在于线程结束和资源的回收。 4. operator()() 仿…

论文略读:OpenGraph: Towards Open Graph Foundation Models

arxiv 2023 1 intro Graph大模型希望OpenGraph能够捕捉通用的拓扑结构模式&#xff0c;对测试数据进行Zero-shot预测 仅通过前向传播过程&#xff0c;就可以对测试图数据进行高效的特征提取和准确预测模型的训练过程在完全不同的图数据上进行&#xff0c;在训练阶段不接触测试…

CSS3新增特性(一)

目录 一、CSS3 新增选择器 1. 子级选择器 2. 兄弟选择器 相邻兄弟选择器 其他兄弟选择器 3. 结构伪类选择器 ① E:first-child ② E:last-child ③ nth-child&#xff08;n&#xff09; n为数字&#xff1a; n为关键字&#xff1a; n为公式&#xff1a; ④ E: firs…

visionTransformer window平台下报错

错误&#xff1a; KeyError: Transformer/encoderblock_0/MlpBlock_3/Dense_0kernel is not a file in the archive解决方法&#xff1a; 修改这个函数即可&#xff0c;主要原因是Linux系统与window系统路径分隔符不一样导致 def load_from(self, weights, n_block):ROOT f&…

【RT-Thread应用笔记】FRDM-MCXN947上的RW007实践——WiFi延迟和带宽测试

【RT-Thread应用笔记】FRDM-MCXN947上的RW007实践——WiFi延迟和带宽测试 一、背景介绍1.1 RW007模组简介1.2 Arduino接口简介1.3 RW007软件包简介1.4 RT-Thread env工具简介 二、创建工程2.1 新建工程2.2 添加rw007软件包2.3 打开RW007配置项2.4 启用pin驱动2.5 禁用rw007的ST…

Cloud微服务:Ribbon负载均衡

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Ribbon负载均衡 一、Ribbon - 负载均衡原理、流…

探索 虚拟化技术+Docker部署与操作

目录 一、你知道哪些云 1.1国内云 1.2国外云 二、Iaas、 Paas、SaaS三种云服务区别 2.1第一层叫做IaaS 2.2第二层就是所谓的PaaS 2.3第三层也就是所谓SaaS 三、虚拟化架构 3.1寄居架构 3.2源生架构 3.3操作系统虚拟化架构 3.4混合虚拟化架构 四、虚拟化特点及优势…

jmeter5.4.1源码编译(IDEA)问题解决

问题现象&#xff1a;最近想更深入的研究下jmeter5.4.1的原理及功能具体实现&#xff0c;从官网down了个源码&#xff0c;在本地使用IDEA工具导入项目、编译时&#xff0c;报以下错误&#xff1a; class jdk.internal.loader.ClassLoaders$PlatformClassLoader cannot be cast…

vue整合Echarts

首先打开网址https://echarts.apache.org/examples/zh/index.html 进入Echars官网找到自己想要的图形我这里选择的是柱形图 点开完整代码直接cv大法 下载Echars的npm npm install echarts 在vue里面挂在个div 导入相关包 写个方法 就是cv过来的 然后改成后端传过来的值…

【STM32+HAL+Proteus】系列学习教程---RS485总线(收发仿真实现)

实现目标 1、掌握UART/USART/RS485等几个常见概念的区别 2、掌握RS485的逻辑电平、硬件接线等基础知识 3、具体实现目标&#xff1a;1、利用两个单片机组成RS485通信网络&#xff1b;2、两个单片机之间能实现正常收发数据。 一、串口、RS485等之间的关系 串口&#xff1a;是…

微机原理实验三、将AX寄存器中的16位数分成4组,每组4位,让后把这四组数分别放在AL,BL,CL,DL

微机原理实验三、将AX寄存器中的16位数分成4组&#xff0c;每组4位&#xff0c;让后把这四组数分别放在AL,BL,CL,DL 功能&#xff1a; 将AX寄存器中的16位数分成4组&#xff0c;每组4位&#xff0c;让后把这四组数分别放在AL,BL,CL,DL ; 调试结果&#xff1a; input&#xff1a…

ASP.NET集成客户关系管理的企业网站的设计与开发

摘 要 企业要在激烈的市场竞争中立于不败之地&#xff0c;就必须找一种全新的管理理念和管理手段&#xff0c;对其内部和外部资源进行有效的整合。新一代ERP产品正在向客户端和供应端延伸&#xff0c;客户端的延伸即是客户关系管理。对于每个企业来说客户管理的完善程度将直接…

计算机网络 --- WebSocket协议 和 Signalr

计算机网络 --- WebSocket协议 和 Signalr 什么是WebSocket什么是SignalrSignalr Example -- SimpleChat 什么是WebSocket HTTP是基于TCP协议的&#xff0c;同一时间里&#xff0c;客户端和服务器只能有一方主动发数据&#xff0c;是半双工通信。 通常&#xff0c;打开某个网页…

Qt笔记-解决子控制大小获取不正确(width和height)需要重制窗体后,才能获得正确的值

在Qt中&#xff0c;子控件的宽度和高度在构造后并不准确&#xff0c;而只有在调整窗口大小后才正确&#xff0c;这可能是因为子控件的布局或者约束尚未完全计算和应用。 为了解决这个问题&#xff0c;可以使用QTimer来延迟获取子控件的宽度和高度&#xff0c;以确保在布局和约…

ffmpeg初体验

一&#xff1a;安装 sudo yum install epel-release -y sudo yum update -ysudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpmyum -y install …