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

相关文章

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为