递归详解~

简介: 递归详解~

一、什么是递归?

递归:一个方法中又包含了本身。

通俗来说,递归就是自身中又包含了自己,是将一个原问题题分成若干子小问题,子问题与原问题的解法是一致的。

构成递归的两个必要条件 :

  1. 要有递归出口,否则就会进入死循环。
  2. 将原问题划分为若干子问题,原问题要与子问题的解法一致。

解决递归问题的关键是要求出递推公式。

二、递归练习

1、按位输出一个整数

问题描述:将一个整数按位输出,例如:123 输出结果为:1 2 3

思路分析: 对于按位输出,首先要输出的是最高位,就是对该整数不断整除10,直到小于10,这就是递归出口,对于其他位我们可以输出对10取模,那么我们就可以使用递归来解决。

代码实现 :

public static  void printNum(int n){
        if(n<10){
            System.out.print(n+" ");
            return;
        }
        printNum(n/10);
        System.out.print(n%10+" ");
    }
 public static void main(String[] args) {
        printNum(123);
    }

运行结果:

2、递归求 N 的阶乘

思路分析:对于阶乘有一个特点,N的阶乘为为N*(N-1)!,例如:5!=5*4! ,递归的出口便是1的阶乘为1。

代码实现:

public static int factorial(int n){
        if(n==1){
            return 1;
        }else{
            return n*factorial(n-1);
        }
    }
 
    public static void main(String[] args) {
        System.out.println(factorial(5));
    }

运行结果:

3、返回的数字之和

题目描述: 输入一个非负整数,返回组成它的数字之和。

思路分析:对于本题,需要求出各个位的数字,然后进行相加,由于与顺序无关,就可以对数字整除10,直至小于10,得到递归出口,然后是对数字取模相加。

代码实现:

public static int countNum(int num){
        if(num<10){
            return num;
        }else{
            return num%10+countNum(num/10);
        }
    }
 
    public static void main(String[] args) {
        System.out.println(countNum(125));
    }

运行结果:

三、汉诺塔问题

汉诺塔问题:该问题是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置n个盘子。目标:把A杆上的金盘全部移到C杆上,

并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。


针对该问题可以先归纳:

假设只有一个圆盘:直接A->C完成

假设有两个圆盘:

需要A->B,A->C,B->C  

假设有三个圆盘:

需要A->C ,A->B ,C->B, A->C ,B->A ,B->C, A->C  

可以总结出规律:如果只有n==1,则直接 A->C,这就是递归出口,否则先将n-1个圆盘利用C,从A->B,然后再将最底层的圆盘从 A->C,然后再将剩余的n-1,利用A,从B->C。

代码实现:

public static void hunNuoTa(int n,char pos1,char pos2,char pos3){
        if(n==1){
            move(pos1,pos3);
            return;
        }
        hunNuoTa(n-1,pos1,pos3,pos2);
        move(pos1,pos3);
        hunNuoTa(n-1,pos2,pos1,pos3);
    }
    public static void move(char pos1,char pos2){
        System.out.print(pos1+"->"+pos2+" ");
    }
 
    public static void main(String[] args) {
        hunNuoTa(3,'A','B','C');
    }

运行结果:

目录
相关文章
|
SQL 运维 监控
第七章:OCP工具简介
第七章:OCP工具简介
776 0
|
5月前
|
Linux 网络安全 iOS开发
Cisco Packet Tracer 9.0 (macOS, Linux, Windows) - 思科网络模拟工具
Cisco Packet Tracer 9.0 (macOS, Linux, Windows) - 思科网络模拟工具
1037 0
Cisco Packet Tracer 9.0 (macOS, Linux, Windows) - 思科网络模拟工具
|
JavaScript 前端开发 算法
🚀【程序员必备】Qwerty Learner:打造英语输入与单词记忆的神器
Qwerty Learner 是一款专为键盘工作者设计的开源软件,结合单词记忆与英语输入练习,提升英语水平和打字速度。内置丰富词库(如 CET-4/6、GRE、编程API等),提供音标发音、默写模式、速度正确率统计等功能,适合学生、职场人士及程序员使用。
6493 17
|
机器学习/深度学习 C语言
函数递归(Recursion)一篇便懂
本文详细介绍了递归的概念、C语言中的递归函数实现、递归的两个重要条件,通过实例演示了阶乘和汉诺塔问题的递归解决方案,并对比了递归与迭代的区别。作者强调了递归在特定场景下的优势和潜在问题,提示读者在实际编程中灵活选择方法。
1395 0
|
弹性计算 人工智能 安全
阿里云弹性计算:助力企业实现灵活扩展与高效计算
【10月更文挑战第6天】在现代企业的数字化转型中,云计算已经成为不可或缺的技术基础。阿里云弹性计算(Elastic Compute Service, ECS)凭借其强大的弹性伸缩能力、高可用性和灵活性,帮助企业在云端实现高效的业务运营和资源管理。本文将探讨阿里云弹性计算的主要功能、技术优势以及在各行业中的应用场景。
760 7
|
人工智能 自然语言处理 人机交互
MagicQuill:4天斩获千颗 Star,登上Huggingface趋势榜榜首的AI P图神器
MagicQuill通过结合编辑处理器、绘画助手和创意收集器三大功能,解决了图片精准、高效编辑的难题,用户可以通过三种简单的魔法画笔(添加、删除和上色)来编辑图片。
MagicQuill:4天斩获千颗 Star,登上Huggingface趋势榜榜首的AI P图神器
|
搜索推荐 算法 Shell
排序(冒泡排序、选择排序、插入排序、希尔排序)-->深度剖析(一)
排序(冒泡排序、选择排序、插入排序、希尔排序)-->深度剖析(一)
763 5
|
前端开发 容器
css布局-弹性布局学习笔记
这篇文章是关于CSS弹性布局的学习笔记,详细介绍了flex容器和元素的相关属性,包括flex-direction、flex-wrap、flex-flow、justify-content、align-items、align-content以及order、flex-grow、flex-shrink、flex-basis、flex和align-self等,解释了这些属性在弹性盒子布局中的作用和用法。
|
存储 安全 Cloud Native
如何在银行核心系统中安全地搭建微服务架构?
微服务作为现代互联网应用的主流架构风格,已在很多行业应用中获得广泛的成功,而银行核心系统由于其复杂性和风险敏感性,主流架构依然在从单体式 SOA 到真正的微服务分布式架构的转型期。
694 1
|
机器学习/深度学习 存储 算法
算法学习:递归
算法学习:递归
1187 0