JAVA小案例-递归:计算n!

JAVA小案例-递归:计算n!

首先抛出概念,什么是递归?
说白了就是自己调用自己。
递归的结构:
(1)递归头:就是什么时候不调用自身的方法,也就是递归结束的条件
(2)递归体:就是什么时候需要自身调用自身方法,调用的时候是怎么调用的

概念有点抽象,直接看例子:

public class Digui {
    /**
     * 递归:计算n!
     * @param args
     */
    public static void main(String[] args) {
        long d1 = System.currentTimeMillis();
        System.out.printf("%d阶乘的结果:%s%n",10,factorial(10));
        //printf的用法,这么整就省的打好几次引号了
        //%d代表放前边的东西,就是10
        //%s代表放后边的东西,就是factorial(10)
        //%n是换行,也可以用\n
        long d2 = System.currentTimeMillis();
        System.out.printf("递归费时:%s%n",d2-d1);
    }
    static long factorial(int n){
        if (n==1){  //递归头
            return 1;
        }else {     //递归体
            return n*factorial(n-1);  //n*(n-1)
//从递归头开始,判定n如果等于1,就结束,否则走else分支,走分支的时候,走到return,在这里发生了递归,就是自己调自己
//在开头的main方法里,设定的入参是10,说明要算的是10的阶乘,n最开始是10,第一次走到return发生递归后,n就变成9了
//这个东其实可以理解成函数f(x),第一次是f(10),递归一次后变成10*f(9),说白了就是n*(n-1),一直循环运行
//一直循环到n=1时,走if分支,结束,这个时候递归整体过程就变成10*9*8*7*6*5*4*3*2*1了            
        }
    }
}

结果如下:
在这里插入图片描述

  • 阶乘应该不用再过多解释了吧我敲!比如3!,就是3的阶乘,就3×2×1。
  • 首先说一下例子里边的static,这个叫静态,如果没有它,我们在一个方法中调用另一个没有定义static的方法的话,是需要先创建一个对象的,就是new,然后才能调用这个没有定义static的方法。有了static之后,不用创建对象也能直接调用。
  • System.currentTimeMillis();这个勾八东西是啥呢?这个实际上就是获取当前时间,递归前递归后各运行一次,一做差,递归的耗时就出来了

那么为什么要整个计时的东西呢?其实这个递归这个东西不太好,瞅着代码挺简单,但是挺耗费资源,也费时,但是有些时候避免不了得用它。

但是对于这个例子完全可以用循环语句来做,其实耗时很少,也不复杂,就是代码多点,如下:

public class Xunhuanjiecheng {
    /**
     * 用循环来做阶乘
     * @param args
     */
    public static void main(String[] args) {
        long d3 = System.currentTimeMillis();
        int a = 10;
        int result = 1;
        while(a>1){  //a只要大于1就一直循环
            result = result*a*(a-1);
            a=a-2;
        }
        long d4 = System.currentTimeMillis();
        System.out.println(result);
        System.out.printf("普通循环用时:%s%n",d4-d3);
    }
}

在这里插入图片描述
可以发现算的很快,基本不费时间

总结一句话,这个递归能不用就不用,实在没招了再用,用循环还快还省内存。

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

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

相关文章

轴承接触角和受力分析

提示:轴承接触角和受力分析 文章目录 1,接触角2,轴承受力分析 1,接触角 所谓公称接触角就是指轴承在正常状态下, 滚动体和内圈及外圈沟道接触点的法线与轴心线的垂直平面之间的夹角。 按滚动轴承工作时所能承受载荷的…

AI大模型学习(非常详细)零基础入门到精通,收藏这一篇就够了

前言 随着人工智能技术的快速发展,AI大模型学习正成为一项备受关注的研究领域。为了提高模型的准确性和效率,研究者们需要具备深厚的数学基础和编程能力,并对特定领域的业务场景有深入的了解。通过不断优化模型结构和算法,AI大模…

Nginx部署多web进程

1、nginx介绍 Nginx是一个高性能的、开源的、跨平台的Web服务器和反向代理服务器。它是由俄罗斯的程序员Igor Sysoev开发的,并于2004年首次公开发布。 Nginx的特点包括: 高性能:Nginx使用事件驱动的架构,能够处理大量的并发连接…

GAT1399协议分析(9)--图像上传

一、官方定义 二、wirechark实例 有前面查询的基础,这个接口相对简单很多。 请求: 文本化: POST /VIID/Images HTTP/1.1 Host: 10.0.201.56:31400 User-Agent: python-requests/2.32.3 Accept-Encoding: gzip, deflate Accept: */* Connection: keep-alive content-type:…

基于睡眠声音评估睡眠质量

随着健康意识的增强,人们越来越关注睡眠质量。确保获得充足的高质量睡眠对于维持身体健康和心理平衡至关重要。专业的睡眠状态测量主要通过多导睡眠图(PSG)进行。然而,PSG会给受试者带来显著的身体负担,并且在没有专业…

Edge浏览器视频画中画可拉动进度条插件Separate Window

平时看一些视频的时候,一般需要编辑一些其他的东西,于是开启画中画,但是画中画没有进度条,需要大幅度的倒退前进得回到原视频,很麻烦。这里推荐插件Separate Window,可实现画中画进度条拉动和播放sudu的调节…

DS:堆的结构与实现

欢迎来到Harper.Lee的学习世界!博主主页传送门:Harper.Lee的博客主页想要一起进步的uu可以来后台找我哦! 一、堆的概念与结构 1.1 堆的概念 堆(Heap)是完全二叉树中的一种,分为大根堆和小根堆。 特点&#…

回归模型的算法性能评价

一、概述 在一般形式的回归问题中,会得到系列的预测值,它们与真实值(ground truth)的比较表征了模型的预测能力,为有效量化这种能力,常见的性能评价指标有平均绝对误差(MAE)、均方误…

【RAG入门教程02】Langchian的Embedding介绍与使用

Embedding介绍 词向量是 NLP 中的一种表示形式,其中词汇表中的单词或短语被映射到实数向量。它们用于捕获高维空间中单词之间的语义和句法相似性。 在词嵌入的背景下,我们可以将单词表示为高维空间中的向量,其中每个维度对应一个特定的特征…

Vatee万腾平台:数字经济时代的智能金融解决方案

在数字经济蓬勃发展的今天,金融行业的智能化、数字化已成为必然趋势。Vatee万腾平台凭借其前瞻性的战略眼光和强大的技术实力,正逐步成为数字经济时代的智能金融解决方案引领者。 Vatee万腾平台以其先进的科技实力为核心,集成了大数据、云计算…

联合体和枚举<C语言>

导言 在C语言中除了结构体外,联合体和枚举也是自定义类型,联合体主要用于节省空间,在同一块内存存储多种类型的数据,而枚举可以提高代码的可读性、可维护性。 联合体(union) 它还有个更容易理解的名字&…

【Java面试】十二、Kafka相关

文章目录 1、Kafka如何保证消息不丢失1.1 生产者发消息到Brocker丢失:设置异步发送1.2 消息在Broker存储时丢失:发送确认机制1.3 消费者从Brocker接收消息丢失1.4 同步 异步组合提交偏移量 2、Kafka如何保证消费的顺序性3、Kafka高可用机制3.1 集群模式…

HTML标签 label for 还是 htmlFor

文章目录 问题结论更多 问题 HTML标签: label 的属性 for 还是 htmlFor? MDN文档:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label 结论 for 和 htmlFor 都可以使用,都是对的。在部分情况中,只能…

atcoder abc357

A Sanitize Hands 问题&#xff1a; 思路&#xff1a;前缀和&#xff0c;暴力&#xff0c;你想咋做就咋做 代码&#xff1a; #include <iostream>using namespace std;const int N 2e5 10;int n, m; int a[N];int main() {cin >> n >> m;for(int i 1…

SpringBoot之Mybatis-plus实战

文章目录 MybatisPlus 介绍一、MyBatisPlus 集成步骤第一步、引入依赖第二步、定义mapper 二、注解TableNameTableldTableField 加解密实现步骤 在SpringBoot项目中使用Mybatis-plus&#xff0c;记录下来&#xff0c;方便备查。 MybatisPlus 介绍 为简化开发而生&#xff0c;官…

[数据集][图像分类]人种黄种人白人黑人等分类数据集56000张7类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;56000 分类类别数&#xff1a;7 类别名称:[“Black”,“East_Asian”,“Ind…

关于Redis中哨兵(Sentinel)

Redis Sentinel 相关名词解释 名词 逻辑结构 物理结构 主节点 Redis 主服务 一个独立的 redis-server 进程 从节点 Redis 从服务 一个独立的 redis-server 进程 Redis 数据节点 主从节点 主节点和从节点的进程 哨兵节点 监控 Redis 数据节点的节点 一个独立的 re…

Mysql学习(七)——约束

文章目录 四、约束4.1 概述4.2 约束演示4.3 外键约束 总结 四、约束 4.1 概述 概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。目的&#xff1a;保证数据库中数据的正确、有效性和完整性。分类&#xff1a; 4.2 约束演示 根据需求&…

发光二极管十大品牌

日常电路设计中&#xff0c;LED是必用的元器件之一&#xff0c;辅助判定电路异常。 十大发光二极管品牌-LED灯珠生产厂家哪家好-LED发光二极管厂家前十-Maigoo品牌榜

【python】OpenCV GUI——Trackbar(14.2)

学习来自 OpenCV基础&#xff08;12&#xff09;OpenCV GUI中的鼠标和滑动条 文章目录 GUI 滑条介绍cv2.createTrackbar 介绍牛刀小试 GUI 滑条介绍 GUI滑动条是一种直观且快速的调节控件&#xff0c;主要用于改变一个数值或相对值。以下是关于GUI滑动条的详细介绍&#xff1a…