算法--递归--基础

news2024/11/24 17:10:39

定义

计算机科学中,递归是一种解决计算问题的方法,其中解决方案取决于同一类问题的更小子集
递归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法。

如求100以内的和
那么就等同于求100+99以内的和
99以内和等同于99+98以内的和

依次类推

注意点

  • 递归一定要有出口,不然会死循环
  • 警惕堆栈溢出
    当数据规模很大,调用层次很深,一直压入栈,就会有堆栈溢出的风险。
Exception in thread "main" java.lang.StackOverflowError
  • 减少重复计算
    如计算100!+99!+…+1的时候
    每次不要都从1开始进行求阶乘,记得存储结果减少重复计算。
    如求100!直接使用 a [ 99 ] ∗ 100 a[99]*100 a[99]100。(a在算99!的时候求解后存储在其中)

例题

反向打印字符串

public static void reversePrint(String str, int index) {
    if (index == str.length()) {
        return;
    }
    reversePrint(str, index + 1);
    System.out.println(str.charAt(index));
}

斐波那契数列

在这里插入图片描述

public static int f(int n) {
    if (n == 0) {
        return 0;
    }
    if (n == 1) {
        return 1;
    }
    return f(n - 1) + f(n - 2);
}

时间复杂度

T ( n ) = a T ( n b ) + f ( n ) T(n) = aT(\frac{n}{b}) + f(n) T(n)=aT(bn)+f(n)
其中

  • T ( n ) T(n) T(n) 是问题的运行时间, n n n 是数据规模
  • a a a 是子问题个数
  • T ( n b ) T(\frac{n}{b}) T(bn) 是子问题运行时间,每个子问题被拆成原问题数据规模的 n b \frac{n}{b} bn
  • f ( n ) f(n) f(n) 是除递归外执行的计算

x = log ⁡ b a x = \log_{b}{a} x=logba,即 x = log ⁡ 子问题缩小倍数 子问题个数 x = \log_{子问题缩小倍数}{子问题个数} x=log子问题缩小倍数子问题个数

那么
T ( n ) = { Θ ( n x ) f ( n ) = O ( n c ) 并且 c < x Θ ( n x log ⁡ n ) f ( n ) = Θ ( n x ) Θ ( n c ) f ( n ) = Ω ( n c ) 并且 c > x T(n) = \begin{cases} \Theta(n^x) & f(n) = O(n^c) 并且 c \lt x\\ \Theta(n^x\log{n}) & f(n) = \Theta(n^x)\\ \Theta(n^c) & f(n) = \Omega(n^c) 并且 c \gt x \end{cases} T(n)= Θ(nx)Θ(nxlogn)Θ(nc)f(n)=O(nc)并且c<xf(n)=Θ(nx)f(n)=Ω(nc)并且c>x

T ( n ) = T ( 7 n 10 ) + n T(n) = T(\frac{7n}{10}) + n T(n)=T(107n)+n

  • a = 1 , b = 10 7 , x = 0 , c = 1 a=1, b=\frac{10}{7}, x=0, c=1 a=1,b=710,x=0,c=1
  • 此时 x = 0 < 1 x = 0 < 1 x=0<1,由后者决定整个时间复杂度 Θ ( n ) \Theta(n) Θ(n)

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

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

相关文章

复杂SQL优化实例

SQL语句的执行顺序&#xff1a; 执行计划指标查看 优化实例一 LIMIT 语句 分页查询是最常用的场景之一&#xff0c;但也通常也是最容易出问题的地方。比如对于下面简单的语句&#xff0c;一般 DBA 想到的办法是在 type, name, create_time 字段上加组合索引。这样条件排序都能…

面对市面上众多的商城系统,我们该如何选择?

数字化时代&#xff0c;传统的实体店铺发展进入瓶颈。越来越多的消费者选择在网上购物&#xff0c;这也催生了各种各样的电商平台和商城系统&#xff0c;如SHOP、Magento等。但是&#xff0c;对于那些想要进入电子商务领域的企业来说&#xff0c;如何选择适合自己的商城系统&am…

[BigGAN] Large Scale GAN Training for High Fidelity Natural Image Synthesis

1、目的 在大型数据集上训练class-conditional GAN&#xff0c;并探索相关的trick 2、贡献 1&#xff09;数据集的扩大使得GAN的表现也随之提升。文章的网络参数量是之前工作的2~4倍&#xff0c;batch size是之前的8倍。文章分别从两方面对performance进行提升&#xff1a;sca…

计算机视觉:语义分割理论及实战

语义分割 语义分割&#xff08;Semantic Segmentation&#xff09;是指将一张图像分割成若干个区域&#xff0c;并对每个区域赋予语义标签的任务。它是计算机视觉中的一种重要技术&#xff0c;被广泛应用于自动驾驶、医学图像分析、地理信息系统等领域。 与传统的图像分割任务…

奇安信应急响应-Linux

Linux需要经常关注的目录 /etc/passwd用户信息文件&#xff1a;我们需要看一下里面到底是什么&#xff0c;保存的用户信息 /etc/rc.d/rc.loacl&#xff1a;开机启动项&#xff1a;类似于Windows的开机启动项&#xff0c;有可能攻击者会在里面写一个后门文件&#xff0c;需要重…

EM算法实现对iris数据集和meat数据集的分类【MATLAB版本】

摘要&#xff1a;本章实验主要是对于学习 EM 算法的原理&#xff0c;掌握并实现混合高斯模型非监督学习 的 EM 算法&#xff0c;要求在两个数据集上面实现混合高斯模型的非监督学习的&#xff25;&#xff2d;算法。混合模型是相对于单高斯模型而言的&#xff0c;对于某个样本数…

【高级篇】分布式事务

分布式事务 1.分布式事务问题 1.1.本地事务 本地事务&#xff0c;也就是传统的单机事务。在传统数据库事务中&#xff0c;必须要满足四个原则&#xff1a; 1.2.分布式事务 分布式事务&#xff0c;就是指不是在单个服务或单个数据库架构下&#xff0c;产生的事务&#xff0c…

Nginx:Tomcat部署及优化(二)

Nginx&#xff1a;Tomcat部署及优化&#xff08;二&#xff09; 一、Tomcat 优化1.1 内核参数优化1.2 Tomcat 配置文件参数优化1.3 Java 虚拟机&#xff08;JVM&#xff09;调优 二、NginxTomcat 负载均衡、动静分离 一、Tomcat 优化 Tomcat 默认安装下的缺省配置并不适合生产…

9款超级实用的网页设计工具,快来看看有没有你用过的

随着网络时代的快速发展&#xff0c;游戏、购物、音乐、影视和社交网站的兴起都表明了网页设计的重要性&#xff01; 网页设计工具作为网页设计师的生产工具&#xff0c;自然要选择好的。 让我们分享9个高质量的网页设计工具&#xff0c;让您的设计效率悄然提高&#xff01; …

【Python TDD和BDD】零基础也能轻松掌握的学习路线与参考资料

Python TDD和BDD的学习路线 TDD&#xff08;测试驱动开发&#xff09;和BDD&#xff08;行为驱动开发&#xff09;在软件开发中的作用越来越受到重视。TDD通过先写测试代码&#xff0c;再编写生产代码的方式&#xff0c;使得开发者可以在开发过程中确保代码质量和正确性&#…

黑客学习-xss漏洞总结

1、什么是xss 先来看案例 在一个输入框中&#xff0c;输入js代码&#xff0c;存放alter()其弹窗,结果可以看到&#xff0c;代码成功执行。这个就是xss漏洞 XSS攻击全称跨站脚本攻击&#xff0c;是一种在Web应用中常见的安全漏洞&#xff0c;它允许用户将恶意代码植入到Web页面…

分布式事务 2PC

tip&#xff1a;作为程序员一定学习编程之道&#xff0c;一定要对代码的编写有追求&#xff0c;不能实现就完事了。我们应该让自己写的代码更加优雅&#xff0c;即使这会费时费力。 文章目录 一、简介二、2PC 的运行流程三、2PC 一定能保证数据的一致性吗&#xff1f;四、2PC 的…

软件测试——未来软件测试的5个主要趋势

全球各地的企业每天都在发展变化着&#xff0c;以应对市场挑战&#xff0c;满足日益成熟的客户需求。即使是正在进行的技术进步也会使软件测试专家在实践的过程中更加专注和精确。 2021年给软件测试领域带来了新的技术解决方案&#xff0c;以及质量保证和软件测试的实现。与此同…

Springcloud--异步通信RabbitMq快速入门

RabbitMQ 1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&am…

YOLOv5改进系列(8)——添加SOCA注意力机制

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

动态查找表

动态查找表 1.二叉排序树1.1. 定义1.2. 查找过程1.3. 插入过程1.4. 创建二叉排序树1.5. 删除操作&#xff08;1&#xff09;被移除的结点是叶子结点&#xff08;2&#xff09;被移除的结点只有左子树或者只有右子树&#xff1b;&#xff08;3&#xff09;被移除的结点既有左子树…

两张图理解MR与XR

我们知道&#xff0c;AR是在现实世界上叠加虚拟信息和图像&#xff0c;VR是完全模拟的虚拟世界&#xff0c;那么对于MR和XR的概念会稍显复杂&#xff0c;本文试图通过2张图来理解它们&#xff0c;如有不对&#xff0c;祈请纠正。 MR 关于MR&#xff0c;先来看看下面第一张图。 …

vue 3 第三十四章:nextTick

nextTick是Vue3中的一个非常有用的函数&#xff0c;它可以在下一次DOM更新循环结束后执行回调函数。这个函数可以用来解决一些异步更新视图的问题&#xff0c;例如在修改数据后立即获取更新后的DOM节点。以下是一个简单的示例&#xff1a; <template><div><p&g…

华硕无畏灵耀破晓原装Windows10/11系统

第一步&#xff1a;下载原装系统文件 第二步&#xff1a;灵耀/无畏/破晓需要自备16g空u盘安装 第三步&#xff1a;创建u盘分区&#xff0c;第一个分区格式为FAT32(存放TLK引导文件)&#xff0c;第二个分区大小为NTFS&#xff08;存放底包&#xff1a;HDI.OFS.SWP.EDN.KIT&…

Unity Package Manager 使用

项目组开发的工具可以托管到远程仓库里&#xff0c;别的项目 也可以使用。 在Unity工程Assets 下 创建自己的插件目录 运行时 代码 和 编辑器代码 &#xff0c;创建 对应的 程序集&#xff0c;以及package.json 文件 package.json内容&#xff1a;可参考官方的&#xff0c;n…