课时30:方法递归调用

简介: 课时30介绍了方法递归调用的概念及其应用。递归是指一个方法自己调用自己的过程,可用于解决复杂算法和逻辑问题。使用递归时需注意两点:一是设置结束条件以避免死循环(如“猫捉老鼠”例子),二是每次调用时修改传递的参数。范例展示了如何通过递归实现1到100的累加,以及计算阶乘(如90!)。递归虽简洁但易导致内存溢出,因此在实际开发中应谨慎使用。大部分情况下,递归可以由循环替代,但在某些场景下递归代码更清晰易读。掌握递归的基本形式即可,深入理解有助于分析原理,但不必过度纠结。

课时30:方法递归调用

方法的递归调用指的是一个方法自己调用自己的情况,利用递归调用可以解决一些重复且麻烦的问题。比如在处理数据结构时,最初常常会涉及一些复杂的算法和各种游戏逻辑。在进行方法递归调用的时候一般需要


考虑如下几点问题:

1. 一定要设置方法递归调用的结束条件(比如说“猫捉老鼠”,假设我们在猫的尾巴后面绑一只小老鼠,这只猫就会不停地转圈。在这个过程中,你只需要告诉大家一声“抓老鼠”,它就会开始转圈。);

2. 每一次调用的过程中一定要修改传递的参数条件。


范例:实现一个1~100的累加

public class JavaDemo {
public static void main(string args[]) {
int sum=0; 
int x =1;
while(x<=100){//循环的结束条件
 sum+=x;
 x++;//修改每一次循环的变量
}
System.out.println(sum);
 }
}

计算结果:5050

image.png

也可通过递归的形式实现:

public class JavaDemo {
public static void main(string args[]) {
   System.out.println(sum(100));
  }
  public static int sum(int num){//执行累加
   return num+sum(num-1);//递归调用
}
}

image.png

陷入死循环,应设置限制条件,修改后:

public class JavaDemo {
public static void main(string args[]) {
System.out.println(sum(100));
}
public static int sum(int num){//执行累加
 if(num==1){//不累加了
  return1;
}
 return num+sum()num-1;//递归调用
}
}

计算结果:5050

image.png

下面对此代码进行一些简单的分析处理:

【第1次执行sum()、主方法执行】return100+sum(99)

【第2次执行sum()、sum()递归调用return99+sum(98)

………………

【第99次执行sum()、sum()递归调用】return2+sum(1)

【第100次执行sum()、sum()递归调用】return1


整体形式: return 100+99+98+……+2+1;递归操作虽然可以简化的调用。但是在实际的开发之中,你们所编写的代码可能很少会出现有递归情况。大部分情况下考虑的都只是一些简单的处理逻辑。递归少去使用还有另外一个原因:如果处理不当,则会造成内存溢出。


范例:计算“1!+2!+3!+4!+5!+……+90!


有一个有趣的小故事,虽然与阶乘关系不大,但它涉及一个倍增的概念。曾经有一个国家陷入困境,而国王却非常吝啬。有一个人生病了,他找到国王说:“我能治好你的病,但你必须满足我的要求:在围棋棋盘的每个小格上,第一个小格放一粒米,第二个小格放两粒米,依次类推。”国王站在那里,表示非常满意。于是,国王要求他去治病。最后,当棋盘上的米粒全部放完时,国王才发现自己已经给了他半个国家的粮食,而他用这些粮食去治病了。

  image.png

阶乘的过程实际上也是一个倍增的过程。那么,什么是阶乘呢?很简单:1的阶乘是1,2的阶乘是1乘以2(等于2),3的阶乘是6。

image.png

上图是90的阶乘,已经非常庞大了。如果出现这样的结果,我们应该知道,只有double类型才能存储这样的数据。如果我们真的考虑阶乘计算,那么就必须确定合适的数据类型。


在进行阶乘计算的时候必须要考虑选择的数据类型,肯定不能够使用int或long,只能够使用double。而且如果阶乘的数值更大,double类型也装不下,我们就需要采用其他方式来处理。

public class JavaDemo {
public static void main(string args[]) {
System.out.println(fan(90));
}
public static double fan(int num){//执行累加
 if(num==1){//不累加了
  return1;
}
 return num*fan()num-1;//递归调用
}
}

计算结果:1.4857159644817607E138


若要累加结果

public class JavaDemo {
public static void main(string args[]) {
System.out.println(sum(90));
}
public static double sum(int num){
  if(num==1){
   return1;
}
return fan(num)+sum(num-1)
}
public static double fan(int num){//执行累加
 if(num==1){//不累加了
  return1;
}
 return num*fan()num-1;//递归调用
}
}

计算结果:1.502411524554385E138

image.png

实际上有一部分的递归都是可以通过循环来完成,但是如果使用递归要比使用循环结构看起来更加清晰一些。除非必要,否则我不建议大家把所有精力都放在递归调用上。了解递归的基本形式就足够了。因为如果你上过大学并接受过专业训练,就能很容易理解这个过程。但如果这个过程不清楚,也不要纠结,意义不大。我们只有在分析原理时才会用到它,只要原理清楚即可。

相关文章
|
8月前
|
存储 供应链 安全
区块链在物流管理中的应用:让货物管理变得更智能
区块链在物流管理中的应用:让货物管理变得更智能
839 15
|
机器学习/深度学习 人工智能 算法
利用机器学习预测股市趋势:一个实战案例
【9月更文挑战第5天】在这篇文章中,我们将探索如何使用机器学习技术来预测股市趋势。我们将通过一个简单的Python代码示例来演示如何实现这一目标。请注意,这只是一个入门级的示例,实际应用中可能需要更复杂的模型和更多的数据。
|
11月前
|
消息中间件 监控 Cloud Native
云原生架构下的数据一致性挑战与解决方案####
在数字化转型加速的今天,云原生架构以其轻量级、弹性伸缩和高可用性成为企业IT架构的首选。然而,在享受其带来的灵活性的同时,数据一致性问题成为了不可忽视的挑战。本文探讨了云原生环境中数据一致性的复杂性,分析了导致数据不一致的根本原因,并提出了几种有效的解决策略,旨在为开发者和企业提供实践指南,确保在动态变化的云环境中保持数据的完整性和准确性。 ####
|
12月前
|
消息中间件 存储 负载均衡
微服务与分布式系统设计看这篇就够了!
【10月更文挑战第12天】 在现代软件架构中,微服务和分布式系统设计已经成为构建可扩展、灵活和可靠应用程序的主流方法。本文将深入探讨微服务架构的核心概念、设计原则和挑战,并提供一些关于如何在分布式系统中实现微服务的实用指导。
434 2
|
12月前
|
搜索推荐 前端开发 数据安全/隐私保护
改善用户体验方法
【10月更文挑战第9天】改善用户体验方法
908 3
|
SQL 关系型数据库 MySQL
MySQL----配置双主双从
本文档详细介绍了如何在四台服务器上配置MySQL的双主双从架构。首先,通过关闭防火墙和SELinux确保网络通信畅通无阻。接着,设置各服务器的主机名和本地Host,确保名称解析正确。然后,通过YUM安装MySQL并修改初始密码。接下来,逐步配置四个节点(master01、master02、slave01、slave02),包括修改配置文件、创建用户和授权等步骤,实现主从复制。最后,通过SQL命令验证主从同步是否成功。
ly~
|
人工智能 搜索推荐 自动驾驶
人工智能的应用
人工智能在多个领域广泛应用,包括:医疗领域的疾病诊断、药物研发和医疗机器人;交通领域的自动驾驶和智能交通管理;金融领域的风险评估、金融诈骗检测和投资决策;教育领域的个性化学习和智能辅导;工业领域的质量检测和生产流程优化;家居领域的智能家居系统,如智能音箱和智能灯具等,极大提升了各行业的效率与服务质量。
ly~
789 1
|
安全 C#
【Azure 应用服务】在安全漏洞扫描中发现有泄露服务器IIS版本的情况,如何实现屏蔽服务版本号信息呢?
【Azure 应用服务】在安全漏洞扫描中发现有泄露服务器IIS版本的情况,如何实现屏蔽服务版本号信息呢?
423 1
|
Kubernetes 监控 Perl
在k8S中,自动扩容机制是什么?
在k8S中,自动扩容机制是什么?
|
存储 NoSQL 定位技术
13)使用 Redis 查询附近的人或商家
13)使用 Redis 查询附近的人或商家
182 0