Java益智小代码—递归和循环分析

2024-08-29 14:08

本文主要是介绍Java益智小代码—递归和循环分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一:递归和循环

        递归:程序调用自身的编程技巧称为递归。

        循环:for语句或者for each语句实现。

        递归是我们初学程序常常接触的小问题。麻雀虽小,可是深入理解它还是大有学问。

        比如,请用程序计算 n!。首先我们应该先要知道 n!是什么;如 5!=5 * 4 * 3 * 2 * 1,3!= 3 * 2 * 1等等。按照上面的思路,n!= n * (n-1) * (n-2) * (n-3) * (n-4) *.....* 3 * 2 * 1;我们最直白的思想是非递归运用for循环进行阶乘进行求解。

import java.util.Scanner;public class Resursion01 {public static void main(String[] args) {System.out.println("请输入您想阶乘的数:");Scanner sc1 = new Scanner(System.in);int n = sc1.nextInt();if(n < 0){System.out.println("对不起您输入的数不合法!");return;}int sum = 1;for(int i = n; i > 0; i--){sum *= i;}System.out.println(n+"! = "+sum);}
}
        上面的程序时间复杂度为O(n);空间复杂度比较小。(注:因为sum定义为int型,故进行阶乘的数不要太大,容易溢出)

        本节程序讲的是递归,我们当然要用递归去解决一下这个问题。递归就是自己调用自己,但是有判断条件,并且当判断量大于终止条件就一直向下递归,当不满足终止条件时,它就向上递归返回值。最终给出我们想要的结果。故运用递归进行阶乘的代码为:

import java.util.Scanner;public class Resursion02 {public static void main(String[] args) {System.out.println("请输入向进行阶乘的数N:");Scanner sc = new Scanner(System.in);int n = sc.nextInt();if(n < 0){System.out.println("输入的N不合法.");return ;}int sum = f(n);System.out.println(sum);}public static int f(int n){if(n == 1){return 1;}else{return n * f(n-1); }}
}

        这个程序的空间复杂度和时间复杂度都很大,所以我们在运用递归时一定要注意。(注:因为sum定义为int型,故进行阶乘的数不要太大,容易溢出)

        n!的阶乘程序递归图为:


二:递归和循环分析

        递归的优劣

        递归的优势:递归的程序代码简单易读,在实现某些算法时还是有特定的优势:比如用递归实现数据结构中的Tree遍历前序遍历(先遍历根节点,再遍历左子树,最后遍历右子树)、中序遍历(先遍历左子树,再遍历根节点,最后遍历右子树)、后续遍历(先遍历左子树,再遍历右子树,最后遍历根节点);

        递归的劣势:递归是程序本身调用自身,函数调用自身是有时间和空间消耗的(栈空间的消耗),在递归每一次调用自身这个函数时,都需要在内存中分配一定的空间以保存参数、临时变量以及返回地址等信息,而在栈中数据的出栈和入栈都是有时间需求的,故运用递归时会大大降低程序的运行效率,尤其是当递归基数比较大时,效率尤为明显,故在一般的开发中不会运用递归。

        循环的优劣:优势,重复执行一些步骤,执行完的就释放空间,一直到一个终止条件,故循环的空间复杂度比较低一些。

这篇关于Java益智小代码—递归和循环分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1118079

相关文章

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推