Java必刷入门递归题×5(内附详细递归解析图)

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Java必刷入门递归题×5(内附详细递归解析图)



1.求N的阶乘

(1)解析题目意思

  • 比如求5的阶乘,符号表示就是5!;所以5!=5*4*3*2*1
  • 我们下面使用简单的递归完成本题,看递归代码
public static int sub(int n) {
        if(n==1) {
            return 1;
        }
        return n * sub(n-1);
    }
  • 下面解析该代码的意思

(2)递归思路

  • 拆解算法:6!=6*5!;5!=5*4!;4!=4*3!;3!=3*2!;2!=2*1!;其实也就是6!=6*5*4*3*2*1。
  • 用代码表示:整体可能有点乱,需要读者静下心来理解

(3)完整代码

public static void main3(String[] args) {
        //递归求N的阶乘  
        int N = 6;
        int sum = sub(N);
        System.out.println(sum);
    }
    public static int sub(int n) {
        if(n==1) {
            return 1;
        }
        return n * sub(n-1);
    }

2.求1+2+...+N的和

(1)解析题目意思

  • 假设N=3,意思是求从1加到N的和(1+2+3)
  • 假设N=4,则需要求(1+2+3+4)的和

(2)递归思路

  • 我们这里以N=3举例
  • 思路:求(1+2+3)可以拆解成:3+(求N=2的和),求N=2的和可以拆解成:2+(求N=1的和)
  • 得出递归代码
public static int sum(int n) {
        if(n==1) {
            return 1;
        }
        return n+sum(n-1);
    }
  • 下面剖解递归思路:

(3)完整代码

public static void main(String[] args) {
        //递归求和
        int N = 3;
        int sum = sum(N);
        System.out.println(sum);
    }
    public static int sum(int n) {
        if(n==1) {
            return 1;
        }
        return n+sum(n-1);
    }

3.顺序打印数字的每一位

(1)解析题目意思

  • 比如打印1234,要题目意思打印的结果就是1 2 3 4(中间隔开)

(2)解析递归思路

  • 假设输入的数据是1234,打印出1 2 3 4
  • 思路:要打印1 2 3 4,就要先打印1 ,再打印2 3 4 ;打印2 3 4 ,就要先打印2 ,再打印3 4 ;打印3 4,就要先打印3 ,再打印4
  • 利用/10去掉最低位,%10得到最低位的思路进行
  • 得出递归代码
public static void print(int n) {
        if(n<10) {
            System.out.print(n+" ");
            return;
        }
        print(n/10);
        System.out.print(n%10+" ");
    }
  • 解析递归思路

(3)完整代码

public static void main(String[] args) {
        //顺序打印数组的每一位
        int num = 1234;
        print(num);
    }
    public static void print(int n) {
        if(n<10) {
            System.out.print(n+" ");
            return;
        }
        print(n/10);
        System.out.print(n%10+" ");
    }

4.求数字的每一位之和

(1)解析题目

  • 比如给出数字:1345,就需要求1+3+4+5的和

(2)解析递归思路

  • 我们这里以求1234的每一位之和
  • 同样利用/10去掉最低位,%10得到最低位的思路
  • 思路:求1234的每一位之和,可以求4+123的每一位之和;求123的每一位之和,可以求3+12的每一位之和;求12的每一位之和,可以求1+2的每一位之和
  • 递归代码
public static int sumEvery(int n) {
        if(n==1) {
            return n;
        }
        return n%10+sumEvery(n/10);
    }
  • 递归过程解析

(3)完整代码

public static void main(String[] args) {
        //求数字的每一位之和
        int N = 1234;
        int sum = sumEvery(N);
        System.out.println(sum);
    }
    public static int sumEvery(int n) {
        if(n==1) {
            return n;
        }
        return n%10+sumEvery(n/10);
    }

5.求斐波拉契数列

(1)了解斐波拉契数列

  • 斐波那契数列,其数值为:1、1、2、3、5、8、13、21、34……这个数列从第3项开始,每一项都等于前两项之和。

(2)递归思路求解

  • 比如求第五个斐波那契数(5):5=3(第四个数)+2(第三个数);3=2(第三个数)+1(第二个数);以此类推,直到n<=2。
  • 递归部分代码
public static int fib(int n) {
        if(n<=2) {
            return 1;
        }
        return fib(n-2)+fib(n-1);
    }
  • 递归思路解析

  • 递归完整代码
public static void main(String[] args) {
        //斐波拉契
        int N = 8;
        int sum = fib(N);
        System.out.println(sum);
    }
    public static int fib(int n) {
        if(n<=2) {
            return 1;
        }
        return fib(n-2)+fib(n-1);
    }

(3)迭代思路

  • 该思路也就是利用循环去做,可以计算更大的斐波那契数
  • 利用:某个数=前面两个数相加,从前面开始往后计算,不断循环即可
  • 代码展示:
public static void main(String[] args) {
        //迭代思路
        int N = 5;
        int a = 1;
        int b = 1;
        int c = 1;
        while(N>2) {
           c = a+b;
           a = b;
           b = c;
           N--;
        }
        System.out.println(c);
    }
  • 迭代思路解析:

本次的五道递归题就结束了


相关文章
|
15天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
32 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
15天前
|
Java 编译器
Java 泛型详细解析
本文将带你详细解析 Java 泛型,了解泛型的原理、常见的使用方法以及泛型的局限性,让你对泛型有更深入的了解。
28 2
Java 泛型详细解析
|
11天前
|
监控 架构师 Java
Java虚拟机调优的艺术:从入门到精通####
本文作为一篇深入浅出的技术指南,旨在为Java开发者揭示JVM调优的神秘面纱,通过剖析其背后的原理、分享实战经验与最佳实践,引领读者踏上从调优新手到高手的进阶之路。不同于传统的摘要概述,本文将以一场虚拟的对话形式,模拟一位经验丰富的架构师向初学者传授JVM调优的心法,激发学习兴趣,同时概括性地介绍文章将探讨的核心议题——性能监控、垃圾回收优化、内存管理及常见问题解决策略。 ####
|
16天前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
47 12
|
13天前
|
存储 算法 Java
Java内存管理深度解析####
本文深入探讨了Java虚拟机(JVM)中的内存分配与垃圾回收机制,揭示了其高效管理内存的奥秘。文章首先概述了JVM内存模型,随后详细阐述了堆、栈、方法区等关键区域的作用及管理策略。在垃圾回收部分,重点介绍了标记-清除、复制算法、标记-整理等多种回收算法的工作原理及其适用场景,并通过实际案例分析了不同GC策略对应用性能的影响。对于开发者而言,理解这些原理有助于编写出更加高效、稳定的Java应用程序。 ####
|
13天前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
15天前
|
Java 数据库连接 开发者
Java中的异常处理机制:深入解析与最佳实践####
本文旨在为Java开发者提供一份关于异常处理机制的全面指南,从基础概念到高级技巧,涵盖try-catch结构、自定义异常、异常链分析以及最佳实践策略。不同于传统的摘要概述,本文将以一个实际项目案例为线索,逐步揭示如何高效地管理运行时错误,提升代码的健壮性和可维护性。通过对比常见误区与优化方案,读者将获得编写更加健壮Java应用程序的实用知识。 --- ####
|
19天前
|
数据采集 存储 Web App开发
Java爬虫:深入解析商品详情的利器
在数字化时代,信息处理能力成为企业竞争的关键。本文探讨如何利用Java编写高效、准确的商品详情爬虫,涵盖爬虫技术概述、Java爬虫优势、开发步骤、法律法规遵守及数据处理分析等内容,助力电商领域市场趋势把握与决策支持。
|
19天前
|
安全 Java
Java中WAIT和NOTIFY方法调用时机的深层解析
在Java多线程编程中,`wait()`和`notify()`方法的正确使用对于线程间的协调至关重要。这两个方法必须在同步块或同步方法中调用,这一规定的深层原因是什么呢?本文将深入探讨这一机制。
32 5
|
18天前
|
存储 缓存 监控
Java中的线程池深度解析####
本文深入探讨了Java并发编程中的核心组件——线程池,从其基本概念、工作原理、核心参数解析到应用场景与最佳实践,全方位剖析了线程池在提升应用性能、资源管理和任务调度方面的重要作用。通过实例演示和性能对比,揭示合理配置线程池对于构建高效Java应用的关键意义。 ####

推荐镜像

更多