【Java】/*方法的递归*/

目录

一、递归的概念

二、递归执行过程分析

三、递归练习

3.1 按顺序打印一个数字的每一位,例如123打印出1 2 3

3.2 递归求 1 + 2 + 3 + ... + n 的和

3.3 输入一个非负整数,返回组成它的数字之和,例如123,得1+2+3

3.4 求斐波那契数列的第 N 项


一、递归的概念

1. 生活中例子:

从前有坐山,山上有座庙,庙里有个老和尚给小和尚将故事,讲的就是:

"从前有座山,山上有座庙,庙里有个老和尚给小和尚讲故事,讲的就是:

"从前有座山,山上有座庙..."

"从前有座山……" "

像这种自身中又包含了自己的现象,在数学和编程中非常有用,因为有些时候,我们遇到的问题直接并不好解决,但是会发现将原问题拆分成其子问题之后,子问题与原问题有相同的解法,这样的话子问题解决之后,原问题也就会迎刃而解了。

2. 递归的概念:一个方法在执行过程中调用自身,就称为 "递归",与上面生活中的例子不同的是,递归不是无限递归,它必须有一个递归结束的条件。

3. 在程序层面要完整的写出一个递归需要两个必备的条件:

    ① 起始条件:可以理解为递归结束的条件

    ② 递归公式:每个问题的递推公式是不一样的,例如求N!,可以转换成求 N+(N-1)!

4. 递归的缺点:空间复杂度高,能用迭代的就不要用递归

二、递归执行过程分析

1. 要想弄清楚递归执行的过程,通常会通过画图的方式进行理解,下面以求N!为例进行分析

2. 思路:假如要求3!,通过分析我们可以将其拆分为求3*2!,而2!又可以拆分为求2*1!,很明显可以看出我们在做一件重复的事,即求一个数的阶乘里面又可以看成求一个数的阶乘,而我们知道1!=1,因此这道题是满足使用递归所需的两个必备条件的,所以可以采用递归的方式进行求解。

3. 求解的代码思路为,定义一个求阶乘的方法,如果n==1,就返回1,否则返回n*fac(n-1),递归执行的过程,见下图图片所示。

    public static int fac(int n) {
        if (n == 1) {
            return 1;
        }
        return n * fac(n - 1);
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        System.out.println(fac(n));
    }

三、递归练习

3.1 按顺序打印一个数字的每一位,例如123打印出1 2 3

思路:打印123的每位,可以看成先打印12(123/10)的每位,再打印3(123%10),打印12的每位可以看成先打印1(12/10)的每位,再打印2(12%10),而我们知道当要打印的数为小于10的数时,直接打印即可,这道题是满足使用递归所需的两个必备条件的,所以可以采用递归的方式进行求解。

求解的代码思路:定义一个求打印一个数字每位的方法,如果n < 10,直接打印并返回,否则返回n*printNum(n-1),递归执行的过程,见下图图片所示。

    public static void printNum(int n) {
        if (n < 10) {
            System.out.printf("%d ", n);
            return;
        }
        printNum(n / 10);
        System.out.printf("%d ", n % 10);
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        printNum(n);
    }

3.2 递归求 1 + 2 + 3 + ... + n 的和

思路:当n=3时,表示我们要求3~1之间整数的和,这个式子又可以看成3加2~1之间整数的和,2~1之间整数的和又可以看成求2加1~1之间整数的和,而1~1之间整数的和就是1,这道题是满足使用递归所需的两个必备条件的,所以可以采用递归的方式进行求解。

求解的代码思路:定义一个求n~1之间整数和的方法,如果n == 1,直接返回1,否则返回n+addNum(n-1),递归执行的过程,见下图图片所示。

    public static int addNum(int n) {
        if (n == 1) {
            return 1;
        }
        return n + addNum(n - 1);
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        System.out.println(addNum(n));
    }

3.3 输入一个非负整数,返回组成它的数字之和,例如123,得1+2+3

思路:假设我们要求组成123每一位数字的和,可以看成求3(123%10)加组成12(123/10)每一位数字的和,求组成12每位数字的和,又可以看成求2(12%10)加组成1(12/10)每一位数字的和,当我们要求的和的数小于10时直接返回即可,这道题是满足使用递归所需的两个必备条件的,所以可以采用递归的方式进行求解。

求解的代码思路:定义一个求组成某数字的每位和的方法,如果n < 1,直接返回n,否则返回 n%10 + numAdd(n/10),递归执行的过程,见下图图片所示。

    public static int numAdd(int n) {
        if (n < 10) {
            return n;
        }
        return n % 10 + numAdd(n /10);
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        System.out.println(numAdd(n));
    }

3.4 求斐波那契数列的第 N 项

什么是斐波那契数列:斐波那契数列 - 搜狗百科 (sogou.com),指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……,即从第3项开始,每一项都等于前两项之和。

思路:如果我们要求斐波那契数的第n项,那么求得斐波那契数的第n-1项和n-2项之和即可,而求斐波那契数的第n-1项,又可以看作求斐波那契数的第n-2项和n-3项之和...,如果n为1则直接返回0即可,如果n为2则直接返回1即可,这道题是满足使用递归所需的两个必备条件的,所以可以采用递归的方式进行求解。

求解的代码思路:定义一个求斐波那契数第n项的方法,如果n == 1,直接返回0,否则如果n == 2返回1,否则返回 fib(n-1) + fib(n -2),递归执行的过程,见下图图片所示。

    public static int fib(int n) {
        if (n == 1) {
            return 0;
        } else if (n == 2) {
            return 1;
        }
        return fib(n - 1) + fib(n - 2);
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        System.out.println(fib(n));
    }

但当我们求 fib(40) 的时候发现, 程序执行速度极慢,原因是进行了大量的重复运算,如在上面基础上加上一个成员变量,当n=40时,记录fib(1)一共计算了多少次,结果为39088169次。因此本道题不适合用递归的方式求,而更适合用迭代的方式求。

    public static int count = 0;//成员变量,实现累加
    public static int fib(int n) {
        if (n == 1) {
            count++;
            return 0;
        } else if (n <= 2) {
            return 1;
        }
        return fib(n - 1) + fib(n - 2);
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        System.out.println(fib(n));
        System.out.println(count);
    }

(以后求斐波那契数列的第 N 项都用迭代的方法)

思路:我们可以定义fib3、fib2、fib1分别表示要求的第n项,和第n-1项、第n-2项,如果是要求第1项或第2项的斐波那契数,特殊处理返回即可;当n>=3时,n-2等于几就执行几次求 fib3 和更新fib1、fib2的操作,循环结束后fib3就是斐波那契数列的第n项项的值。

    public static int fib2(int n) {
        int f1 = 0;
        int f2 = 1;
        int f3 = 1;
        /*前两项特殊处理*/
        if (n == 1) {
            return 0;
        } else if (n == 2){
            return 1;
        }
        /* n>=3时 */
        for (int i = 3; i <= n; i++) {
            f3 = f1 + f2;
            f1 = f2;
            f2 = f3;
        }
        return f3;
    }

   本篇文章已完结,谢谢支持哟 ^^ !!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/625509.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工业无风扇计算机的优点

无风扇计算机往往采用紧凑且密封的外形&#xff0c;使其坚固耐用&#xff0c;使其能够在需要现场工程师进行维护之前承受恶劣的环境数年。机载移动部件较少或没有移动部件会降低组件无法按预期运行的可能性&#xff0c;或者更糟糕的是发生故障和损坏。采用工业组件和较低的散热…

mysql,sqlserver数据库查询表,获得表结构,结构类型说明,获得这些数据,可以拿去创建表

mysql&#xff0c;sqlserver数据库查询表&#xff0c;获得表结构&#xff0c;结构类型说明&#xff0c;获得这些数据&#xff0c;可以拿去创建表 //表名p_order select * from information_schema.COLUMNS where TABLE_NAMEp_order;1、TABLE_CATALOG &#xff0c;nvarchar(128…

手撸XXL-JOB(二)——定时任务管理

在上一节中&#xff0c;我们介绍了SpringBoot中关于定时任务的执行方式&#xff0c;以及ScheduledExecutorService接口提供的定时任务执行方法。假设我们现在要写类似XXL-JOB这样的任务调度平台&#xff0c;那么&#xff0c;对于任务的管理&#xff0c;是尤为重要的。接下来我们…

Kerberos修改协议为TCP

部署前 修改模板/home/cloud-setup/deploy-forklift/mids/forklift-basic/kde/v1.0/impl/plays/roles/krb5-client/templates/krb5.conf.j2 添加如下参数 udp_preference_limit 1 部署后 界面修改 添加如下参数&#xff0c;并勾选下发配置按钮&#xff0c;重启刷新服务

中电金信:专题报告·商业银行对公数字化转型体系架构及实践拆解

当今&#xff0c;数字化转型已然成为商业银行发展的关键动力&#xff0c;在这个数字时代&#xff0c;对公业务数字化转型更是势在必行。 基于此&#xff0c;中电金信发布《商业银行对公数字化转型专题报告》&#xff08;简称《报告》&#xff09;&#xff0c;针对对公数字化转型…

MATLAB科技绘图与数据分析

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

探索执法部门如何在不依赖面部识别的情况下追踪感兴趣的人

概述 视频证据在犯罪调查中的重要性正日益凸显&#xff0c;其数量之多已经达到了前所未有的水平。据美国司法援助局&#xff08;Bureau of Justice Assistance, BJS&#xff09;的数据显示&#xff0c;大约80%的犯罪案件都涉及到某种形式的视频证据&#xff0c;并且这一比例还…

Golang | Leetcode Golang题解之第80题删除有序数组中的重复项II

题目&#xff1a; 题解&#xff1a; func removeDuplicates(nums []int) int {n : len(nums)if n < 2 {return n}slow, fast : 2, 2for fast < n {if nums[slow-2] ! nums[fast] {nums[slow] nums[fast]slow}fast}return slow }

基于springboot+vue+Mysql的在线答疑系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

智慧安防系统:构建更安全的社区环境

随着科技的不断进步&#xff0c;人们的生活质量得到了显著提高。然而&#xff0c;与此同时&#xff0c;社会治安问题也日益凸显。为了维护社会的和谐稳定&#xff0c;提高人们的生活安全感&#xff0c;智慧安防系统应运而生。本文将为您详细介绍智慧安防系统的项目背景、需求分…

探秘WebSQL:轻松构建前端数据库

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探秘WebSQL&#xff1a;轻松构建前端数据库 前言WebSQL简介WebSQL的基本操作WebSQL的实际应用WebSQL的局限性和替代方案 前言 在Web的世界里&#xff0c;我们总是追求更好的用户体验和更快的响应速度…

IT行业找工作十面十败,不妨试试鸿蒙开发岗~

近期某脉上看到这样一则帖子&#xff0c;讨论的非常激烈&#xff01; 相信也有不少人有和他这情况类似&#xff0c;像他这种失业的状态&#xff0c;近两年大家或多或少都深有体验。由于互联网行业进过了十几年的快速发展&#xff0c;从2G→3G→4G→5G&#xff0c;在这个期间人们…

嵌入式单片机笔试题

DC-DC 和 LDO两者有何区别&#xff1f; DC-DC转换器&#xff08;直流-直流转换器&#xff09;和LDO&#xff08;低压差线性稳压器&#xff09;都是用于电源管理的设备&#xff0c;但它们在原理和特性上有一些显著的区别&#xff1a; 原理&#xff1a; DC-DC转换器通过改变输…

Spring AI开发前期开发指导(maven依赖下载问题解决)

文章目录 说明开发条件网络环境准备本地环境准备开发工具准备 特殊说明maven配置项目jar一致下载错误解决可行的版本搭配 说明 动力节点视频教程地址&#xff0c;本文章学习该教程&#xff0c;同时说明的maven配置问题导致的项目依赖下载失败的问题和其他问题的记录。 开发条…

android自定义view仿微信联系人列表

说明&#xff1a;最近碰到一个需求&#xff0c;弄一个类似国家或省份列表&#xff0c;样式参照微信联系人 文件列表&#xff1a; step1:主界面 加载列表数据~\app\src\main\java\com\example\iosdialogdemo\MainActivity.java step2:右侧列表数据排序~\app\src\com\example\io…

2024年网络安全岗位缺口已达100万,你该不会还不知道如何入门吧?

我发现最近安全是真的火&#xff0c;火到不管男女老少都想入门学一下。但是&#xff0c;要是真的问起他们&#xff0c;“你觉得网络安全是什么&#xff1f;为什么想学&#xff1f;”&#xff0c;十个人里不见得有一个人能逻辑清晰、态度坚定地回答出来。 作为一个时刻关注行业…

识别公式的网站都有哪些?分享3个专业的工具!

在数字化时代&#xff0c;公式识别已成为一项重要技能。无论是学生、教师还是科研人员&#xff0c;都可能需要借助公式识别网站来快速准确地获取公式信息。那么&#xff0c;市面上到底有哪些值得一试的识别公式网站呢&#xff1f;本文将为您一一揭晓。 FUNAI FUNAI的公式识别功…

Git 基础使用(1) 入门指令

文章目录 Git 作用Git 安装Git 使用Git 仓库配置Git 工作原理Git 修改添加Git 查看日志Git 修改查询Git 版本回退 概念补充 Git 作用 Git 是一种分布式版本控制系统&#xff0c;它旨在追踪文件和文件夹的更改&#xff0c;并协助多人协作开发项目。 Git 安装 &#xff08;Lin…

7nm项目之模块实现——02 Placeopt分析

一、Log需要看什么 1.log最后的error 注意&#xff1a;warnning暂时可以不用过于关注&#xff0c;如果特别的warning出现问题&#xff0c;在其他方面也会体现 2.run time 在大型项目实际开发中&#xff0c;周期一般较长&#xff0c;可能几天过这几周&#xff0c;所以这就需要…

基于springboot+vue+Mysql的在线BLOG网

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…