java循环while之等差数列均值_等差数列,for循环,递归和尾递归的对比

生活中,如果1+2+3+4.....+100,大家基本上都会用等差数列计算,如果有人从1开始加,不是傻就是白X,那么程序中呢,是不是也是这样。今天无意中看到了尾递归,以前也写过,但是不知道这个专业名词,今天写一下对比下性能问题。

今天主要是看到了尾递归,所以联想到了这些,写下这篇文章,其中也把Benchmark (Nuget上的BenchmarkDotNet)的基准测试用了下,感觉比较好用,赞。Benchmark 需要在release下运行。

原则上所有的递归操作,都可以写成循环操作。尾递归是指,在函数返回的时候,调用自身本身,并且return语句不能包含表达式。这样编译器或者解释器就可以把尾递归做优化,试运行速度更快。

测试类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public classTestClass

{///

///for循环///

///

///

///

public int TestFor(intn)

{int s = 1;for (int i = 2; i < n + 1; i++)

{

s= s +i;

}returns;

}///

///等差数列///

///

///

///

public int TestForG(intn)

{int s = (1 + n) * n / 2;returns;

}///

///递归///

///

///

///

public int TestRec(intn)

{if (n == 1) return 1;return n + TestRec(n - 1);

}///

///尾递归///

///

///

///

public int TestTail(intn)

{return TestTail(1, n);

}public int TestTail(int sum, intn)

{if (n == 1) returnsum;

sum= sum +n;return TestTail(sum, n - 1);

}

}

View Code

基准测试

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

[SimpleJob(RuntimeMoniker.NetCoreApp30)]

[RPlotExporter]public classTestClassForBenchmark

{private readonly TestClass testClass = newTestClass();

[Params(100,500,1000,5000)]public intN;

[Benchmark]public voidTestFor()

{

testClass.TestFor(N);

}

[Benchmark]public voidTestForG()

{

testClass.TestForG(N);

}

[Benchmark]public voidTestRec()

{

testClass.TestRec(N);

}

[Benchmark]public voidTestTail()

{

testClass.TestTail(N);

}

}

View Code

Main程序调用

BenchmarkRunner.Run();

结果

02dabefa84ce444a5a72ce718f9d234c.png

用Benchmark的基准测试发现,运行时间:等差 < for < 尾递归(接近for) < 递归,for的运行速度比递归快,但是递归结构比较清晰,容易理解。

发现TestForG有点问题,接下来自己简单测试

实际用Stopwatch测试

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

TestClass testClass = newTestClass();

Stopwatch stopSwitch= newStopwatch();int n = 5000;

stopSwitch.Start();int sum =testClass.TestFor(n);

stopSwitch.Stop();

Console.WriteLine($"结果:{sum},TestFor时间:{stopSwitch.ElapsedTicks}");

stopSwitch.Start();

sum=testClass.TestForG(n);

stopSwitch.Stop();

Console.WriteLine($"结果:{sum},TestForG时间:{stopSwitch.ElapsedTicks}");

stopSwitch.Restart();

sum=testClass.TestRec(n);

stopSwitch.Stop();

Console.WriteLine($"结果:{sum},TestRec时间:{stopSwitch.ElapsedTicks}");

stopSwitch.Restart();

sum=testClass.TestTail(n);

stopSwitch.Stop();

Console.WriteLine($"结果:{sum},TestTail时间:{stopSwitch.ElapsedTicks}");

View Code

Stopwatch测试结果

1. 10次

结果:55,TestFor时间:2024结果:55,TestForG时间:3799结果:55,TestRec时间:1603结果:55,TestTail时间:2371

2. 100结果:5050,TestFor时间:1704结果:5050,TestForG时间:2708结果:5050,TestRec时间:1069结果:5050,TestTail时间:1401

3. 500结果:125250,TestFor时间:1794结果:125250,TestForG时间:3096结果:125250,TestRec时间:9398结果:125250,TestTail时间:2332

4. 1000结果:500500,TestFor时间:2080结果:500500,TestForG时间:4147结果:500500,TestRec时间:2003结果:500500,TestTail时间:2540

5. 5000结果:12502500,TestFor时间:1428结果:12502500,TestForG时间:3982结果:12502500,TestRec时间:6815结果:12502500,TestTail时间:2799

结论

1. for的运行速度比递归快,但是递归结构比较清晰,容易理解。

2. 等差计算不一定比for循环快

斐波那契数列对比

///

///循环实现 counter:运行次数///

public long Fib(int n, ref intcounter)

{if (n < 1) return 0;long a = 1, b = 1;longtemp;for (int i = 3; i <= n; i++)

{

counter++;

temp=a;

a=b;

b= temp +b;

}returnb;

}///

///递归实现///

public long FibRec(int n, ref intcounter)

{

counter++;if (n < 1) return 0;if (n < 3) return 1;return FibRec(n - 1, ref counter) + FibRec(n - 2, refcounter);

}///

///尾递归实现///

public long FibTailRec(int n, ref intcounter)

{if (n < 1) return 0;if (n < 3) return 1;return FibRec(1, 1, n, refcounter);

}public long FibRec(long last, long prev, int n, ref intcounter)

{

counter++;long temp = last +prev;if (n == 3) returntemp;

last=prev;

prev=temp;return FibRec(last, prev, n - 1, refcounter);

}

效果

fdb75013eda07d694ae67e43fe0c08c8.png

counter是运行的次数,斐波那契数列直接用递归,n=100都直接堆栈溢出。递归用的好了,思路清晰,用的不好的话,数据稍微大点就是深深的坑。用递归尽量优化为尾递归,也就是返回的时候调用自身,不要有表达式。

JAVA循环 练习题 立即下载

相关推荐

triton-inference-server-ge-backend

新版本特性 v2.3.0 支持对全局、session、graph 的options进行添加,从而进一步调优模型,相关案例请参考 性能调优方法论。 支持采用分档模式将符合条件模型转化为静态图,提高吞吐性能。 补充如何采用分档模式+锁核+调整精度,进一步提高性能。 在AscendHub下载镜像时需确认好版本,若使用旧版本镜像,需要手工下载源码编译生成新的backend后才能支持新特性。 版本特性 v2.2.0 支持从onnx文件读取模型输入输出信息, config中若无指定input,output,将会自动从文件中读取; 调整动态图在多实例下使用多Session方式,提高并发吞吐(显存占用会增高); 支持动态batch场景小batch动态合并特性,配合多Session,提高吞吐; 补充调优方法论以及cnclip模型的最佳实践; 支持多模型特性,可支持同时拉起多个模型,提高显存利用率; 支持非0轴动态shape场景; 支持TensorFlow的pb文件。

练习-Java循环while之等差数列均值

本关任务:使用 Scanner 对象获取一组等差整数(键盘输入的数之间用空格分隔,最后一个为 %,不计入计算),统计出等差数列的均值(保留两位小数)。平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。// 第一步:使用while循环接收Scanner对象接收的值,当下一个值等于%时,终止循环。任务:接收输入值(整数数列),统计出等差数列的均值,每组输入以%结束,比如1 3 5 %。// 第五步:数列中值的总和,除以数列个数求出均值(保留两位小数)// 第三步:对输入的数列值求和。

千浔的博客 980

后端开发 Docker4.99.0 AppleSilicon 苹果芯片 Mac 安装包

本资源为 Docker Desktop 4.99.0 苹果芯片(Apple Silicon)专用安装包,原生适配 M 系列 Mac,可快速搭建本地容器开发环境,支持镜像拉取、容器编排、项目打包部署。适合后端开发、运维、全栈开发者,用于本地微服务、测试环境、项目容器化开发。

Java循环while之等差数列均值

本关任务:使用 Scanner 对象获取一组等差整数(键盘输入的数之间用空格分隔,最后一个为 %,不计入计算),统计出等差数列的均值(保留两位小数)。 /* 任务:接收输入值(整数数列),统计出等差数列的均值,每组输入以%结束,比如1 3 5 %。 其中百分号的作用是:在while循环中判断输入为%时,终止循环。 */ import java.util.Scanner; public class WhileTest { public static void main(String[] ar

guozaizz的博客 2901

Comsol超声空化气泡仿真:从基础理论到工业应用实践

本文详细介绍了Comsol超声空化气泡仿真的基础理论及工业应用实践。通过解析超声空化现象、Comsol模型搭建流程及求解器优化技巧,帮助工程师掌握气泡仿真技术,提升超声波清洗和乳液制备等工业应用的效率与质量。

weixin_27966471的博客 252

JESD204B系统设计实战:如何用SYSREF信号搞定多设备时钟同步(附时序图详解)

本文深入探讨了JESD204B系统中SYSREF信号在多设备时钟同步中的关键作用与实现技巧。通过详细分析SYSREF信号的生成、PCB布局和时序调整,提供了一套完整的解决方案,帮助工程师解决高速数据转换器与FPGA协同工作中的时钟同步问题。文章还包含时序图详解和实测调试技巧,助力提升系统性能。

weixin_29313239的博客 454

java循环while之等差数列均值_分别使用for--while--do-while语句解决等差数列

import java.util.Scanner;public class study04 {public static void main(String[] args) {test t1=new test();//实例化测试类t1.doWhileTest();//调用使用for的方法t1.whileTest();//调用使用while的方法t1.forTest();//调用使用do-while的...

weixin_42398050的博客 941

JSAPI微信支付(小程序)V3版本JAVA代码实战源码

1.1、商户通过JSAPI/小程序下单接口获取到发起支付的必要参数prepay_id后,再通过微信小程序调起微信支付收银台JSAPI/小程序下单_JSAPI支付|微信支付商户文档中心1.3、微信H5发起类似,结合文档,细微调整,前端返回类似,参考文档修改为微信内置浏览器调起支付即可。

java web 705

Java学习笔记_No.1

Java循环while之等差数列均值 /* 任务:接收输入值(整数数列),统计出等差数列的均值,每组输入以%结束,比如1 3 5 %。 其中百分号的作用是:在while循环中判断输入为%时,终止循环。 */ import java.util.Scanner; public class WhileTest { public static void main(String[] args) { int sum = 0;// 求等差数列的和 int z = 0; //

柳小白的博客 1896

ABAP 平台下配置 OAuth 2.0 Authorization Code 授权类型的完整指引

本文是面向ABAP管理员和SAP开发者的OAuth 2.0授权码配置实战指南。文章详细介绍了在ABAP平台启用Authorization Code的完整流程,包括前置条件检查(如TLS配置和系统用户准备)、SOAUTH2事务码中各字段配置要点(授权类型启用、Redirect URI设置、授权码有效期等)、Scope分配规则以及验证方法。通过一个销售订单OData接口的实际案例,说明了如何将抽象规范转化为具体配置。最后提供了多种验证方式(事务码测试、端点测试和Postman测试)以及关键配置参数(如授权码有效

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 296

7.DJI-PSDK:psdk负载应用固件升级(基于RTOS)

在单片机应用程序开发阶段,我们可以借助keil5和J-LINK来直接下载应用程序进行开发和调试, 但在产品交付之后,我们对应用程序做了改动和升级,是断然不可能采用这种方式的,我们应该将新版本的程序固件打包发给客户, 能够方便用户通过DJI Assistant2选择更新负载设备的固件,导入本地固件程序包,更新负载设备。使用STM32F4 开发的负载设备从Flash 中直接读取固件文件并运行负载设备程序,因此开发者需先烧录Bootloader 再烧录应用固件,烧录Bootloader 的步骤不再赘述。

哒宰的博客 673

java循环while之等差数列均值_java基础_while 循环语句的定义及用法

一、while 循环语句的定义在 C 语言中,while 循环是除了 for 循环外最常用的循环语句。相对于 for 循环而言,while 循环更多地应用于循环次数未定的循环控制中。while 循环的一般表达形式为:while(表达式)循环体while 循环中并没有明显的循环变量,且表达式也可以是任何能够计算为数值的表达式,其迭代部分一般位于循环体内,所以相对于 for 循环语句来说,控制要更加灵...

weixin_39923806的博客 1278

Open3D (C++) 计算点云坐标最值及其索引

使用C++版本的Open3D计算点云最值点及其对应的下标索引

点云侠的博客 729

Java基础之while循环练习

用while分别计算100以内奇数和偶数相加结果 public class Test05402 { public static void main(String[] args) { int sum1=0; int sum2=0; int i=1; while(i<=100){ if (i%20) { sum1 += i; }else{ sum2+=i;} i++; } System.out.println(sum1); System.out.println(sum2); } } // 用while循环

lzp2921082779的博客 637

用Excel或WPS做两独立样本的T检验

一般情况下收集数据时常用的是Excel或者WPS,但统计时却用SPSS等软件进行统计学分析,经常很多人找不到SPSS的安装包,或者苦于正版激活或忘记教程,其实Excel或WPS自带函数就足够了,均数、标准差以及统计检验都是一个函数而已。解释:先做F检验,如果F>0.05就做T检验,Ttset里的数据为两组的数据的比较,结果如下。A组的均数计算 =AVERAGE(B2:B6)A组的标准差计算 =STDEV(B2:B6)B组的标准差计算=STDEV(B7:B19)分组 数值 A组均数 A组标准差 p值。

Mrrunsen的博客 6752

SSH 远程登录报错:kex_exchange_identification: Connection closed.....

不知道为啥会出现这样的情形,最近这段时间登录都是正常的,不知道哪里抽风了,就提示这个。错误信息 kex_exchange_identification: Connection closed by remote host 出现在尝试使用 SSH 连接到远程服务器过程中,表明在密钥交换阶段的一开始,远程主机就关闭了连接。服务器的sshd_config文件中配置错误,可能是不允许的加密算法、修订文件中的语法错误,或者未正确指定用于SSH的HostKey。如果当前已有太多活动连接,新的连接尝试可能会被拒绝。

飞越蓝天的专栏 8297

在Java中使用循环求和以及平均数

在此题中 对于循环我们使用的while循环,不限于多少个数的求和的个数 点点赞噢

weixin_64764567的博客 1077

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Educoder–Java面向对象 接口(2)第1关:练习-Java继承和多态之接口

文章目录任务描述测试说明答案 任务描述 本关任务: 编写一个学校接待方面的程序,招待不同身份的人的食宿问题。 编程要求 仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 中编写一个学校接待方面的程序,具体要求如下: 身份 食 宿 学生 食堂 宿舍 教师 教师食堂 学校公寓 定义一个公开的接口类 Person,该类实现两个功能,第一个为 eat(),实现输出吃饭的功能,无返回值,第二个为 sleep(),实现睡觉的功能,无返回值。 定义一个 Student 类并实现 Person

Gilgamesh的博客 7472

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

java上机作业--等差数列

1. package test;/* @author wb @great forever i think,therefor i am */ class calculate { private int t,s; public void calculate() { s=0; } /* 参数:数列开始,最后一位,增量 ...

优快云wbdream的博客 1227

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java基础之while循环练习(2)

实现猜数游戏,如果没有猜对随机数,则程序继续,猜对后停止程序。 方法思路: 1:要产生一个随机数,所以需要创建一个随机数对象   Random random=new Random(); 2: 调用随机数对象的nextInt方法产生一个随机数   int randomNum = random.nextInt();      //randomNum是个随意取的名字   (记住要导...

baa4242的博客 309

java循环结构01_for循环结构

1.for循环语法 【语法格式】 for(初始化表达式; 循环条件表达式; 循环后的操作表达式) { 执行语句; } 重点:掌握for循环的执行顺序。初始化表达式最先执行,并且在循环过程中只执行一次。 2.for循环注意点 “循环初始化表达式”最先执行,并且永远只执行一次! 在“循环初始化表达式”中声明的变量,我们称之为“循环变量”。 “循环变量”属于局部变量,只能在循环中使用,不能...

安德的博客 1123

java 试题 I: 等差数列(个人练习)

个人练习 欢迎大佬指点 `package lanqiaoxunlian; import java.util.Scanner; public class dengchashulie { // 试题 I: 等差数列 // 时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分 // 【问题描述】 // 数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 // 部分的数列,只...

Bule_char的博客 728
上一篇: java 13种技术_JAVA EE 13种技术
下一篇: java报表开发组件 dynamicreports_DynamicReports
辜进喜
博客等级 码龄9年 31粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值