数据结构(递归,链表实现递归)

news2024/11/14 14:58:06

a.宏观描述:本质上说,递归将原问题转化为更小的同一问题。

b.递归本身也是一个函数,来完成某一功能。

1.递归终止的条件

2.递归操作

1.猴子吃桃问题

猴子第一天偷吃了该堆桃子的一半,觉得好吃多吃了一个;第二天吃了该堆桃子的一半,觉得好吃多吃了又一个,...  ,到了第四天,只剩下了一个桃子,问猴子一个偷吃了多少桃子?

一般做法:

package com.ffyc.lesson.deliver;

//猴子吃桃问题
public class MonkeyEatPeach {

    public int eatPeach1(){
        return (eatPeach2()+1)*2;
    }

    public int eatPeach2(){
        return (eatPeach3()+1)*2;
    }
    public int eatPeach3(){
        return (eatPeach4()+1)*2;
    }
    public int eatPeach4(){
        return 1;
    }


    public static void main(String[] args) {
        MonkeyEatPeach monkeyEatPeach=new MonkeyEatPeach();
        //int result =monkeyEatPeach.eatPeach1();
        int result =monkeyEatPeach.eatPeach();
        System.out.println(result);
    }

}

递归做法:

package com.ffyc.lesson.deliver;

//猴子吃桃问题
public class MonkeyEatPeach {
    //递归方法
    public int eatPeach(int days){
        //递归终止条件
        if(days==1){
            return 1;
        }
        //递归操作
        return (eatPeach(days-1)+1)*2;
    }

    public static void main(String[] args) {
        MonkeyEatPeach monkeyEatPeach=new MonkeyEatPeach();
        //int result =monkeyEatPeach.eatPeach1();
        int result =monkeyEatPeach.eatPeach(4);
        System.out.println(result);
    }

}

2.数组求和问题

一般做法:


public class SumArr {

    public int sum(int[] arr){
        int sum=0;
        //对入参进行判断
        if(arr==null){
            return sum;
        }
        int length=arr.length;
        for(int i=0;i<length;i++){
            sum+=arr[i];
        }
        return sum;
    }

    public static void main(String[] args) {
        int[] arr={1,3,5,7,9};
        SumArr sumArr=new SumArr();
        System.out.println(sumArr.sum(arr));
    }
}

递归做法:

public class SumArr {

    public int sum(int[] arr){
        //对入参进行判断
        if(arr==null){
            return 0;
        }
        return sumDG(arr,0);//求整个数组的和,其左边界是0
    }

    /**
     *
     * @param arr
     * @param l 表示所求数组的左边界
     * @return
     */
    public int sumDG(int[] arr,int l){
        //1.递归中终止条件
        if(l==arr.length){
            return 0;
        }
        //2.递归操作
        return arr[l]+sumDG(arr,l+1);
    }

    public static void main(String[] args) {
        int[] arr={1,3,5,7,9};
        SumArr sumArr=new SumArr();
        System.out.println(sumArr.sum(arr));
    }
}

3.链表实现递归

链表具有天然的递归结构。

将下面列表从0之后断开,则:

链表中删除元素问题

 public void deleteNode(T val){

/*
    此处代码在递归方法中可实现
        //入参判断
        if(this.header==null){
            return;
        }
*/
        //递归操作
        this.header=deleteNode(this.header,val);
    }
    //递归方法(从以node为头结点的链表中删除元素val)
    public Node deleteNode(Node node ,T val){
        //递归终止的条件
        if(node==null){
            return null;
        }
        //递归操作
        Node e=node;
        Node nextHeader=node.next;
        if(e.val==val){
            return nextHeader;
        }else{
            e.next=deleteNode(nextHeader,val);
            return e;
        }

    }

4.链表的旋转

一般做法:

public class Solution206 {

    public class ListNode {
        int val;
        ListNode next;

        ListNode() {
        }

        ListNode(int val) {
            this.val = val;
        }

        ListNode(int val,ListNode next) {
            this.val = val;
            this.next = next;
        }
    }

    public ListNode reverseList(ListNode head){
        //一般做法:
        ListNode pre=null;
        ListNode cur=head;

        while(cur!=null){
            //先保存cur的下一个结点
            ListNode next=cur.next;
            cur.next=pre;
            pre=cur;
            cur=next;

        }
        //此时pre指向的是新链表的头结点
        return pre;
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络】计算机网络中的一些基本概念

IP地址&#xff08;互联网协议地址&#xff09;&#xff1a; IP地址是分配给连接到互联网的设备的唯一标识符。它是由四个数字&#xff08;IPv4&#xff09;或者由八个数字&#xff08;IPv6&#xff09;组成。这些数字是网络层协议的一部分&#xff0c;它定义了数据包的路由。…

源码解析SpringMVC处理请求的完整流程

1.WebMvcAutoConfiguration EnableWebMvcConfiguration自动装配类负责加载SpringMVC涉及的HandlerAdapter、HandlerMapping、ExceptionHandlerExceptionResolver等。 SpringMVC利用 DispatchServlet 处理上游Tomcat的请求时,会被HandlerMapping、HandlerAdapter的相关子类分别…

Java JDK环境变量配置

JDK 安装和配置完成后&#xff0c;可以测试其是否能够正常运行。选择“开始”|“运行”命令&#xff0c;在打开的“运行”对话框中输入 cmd 命令&#xff0c;按 Enter 键进入到 DOS 环境下。 在命令提示符后输入并执行java -version命令&#xff0c;系统如果输出类似图 1 所示的…

Java类的继承

继承&#xff1a; 类的继承基本思想是基于某个父类进行扩展&#xff0c;得到一个新的子类&#xff0c;子类可以继承父类的原有属性和方法&#xff0c;也可以增加原来父类所不具备的属性和方法&#xff0c;或者重写父类中的方法; 重写&#xff1a; 【重写】也可以称为【覆盖】&…

阿里云服务结构--长期更新

CNCF 全称Cloud Native Computing Foundation&#xff08;云原生计算基金会&#xff09;&#xff0c;成立于 2015 年7月21日&#xff08;于美国波特兰OSCON 2015上宣布&#xff09;&#xff0c;其最初的口号是坚持和整合开源技术来让编排容器作为微服务架构的一部分&#xff0…

基于​Segment-and-Track Anything与ProPainter实现视频一键目标移除与一键祛除水印

一、 ProPainter 1.算法简介 ProPainter是由新加坡南洋理工大学&#xff08;Nanyang Technological University&#xff09;的S-Lab团队开发的一款视频修复工具。它融合了图像和特征修复的优势&#xff0c;以及高效的Transformer技术&#xff0c;旨在提供高质量的视频修复效果…

SolidWorks模型导入到Gazebo中

首先建立好solidworks模型&#xff0c;然后另存为stl格式&#xff0c; 导出为STL文件时&#xff0c;文件名最好不要是中文&#xff0c;并且要将后缀STL改为stl&#xff0c;否则Gazebo无法识别 这是我创建好的机器人充电桩模型&#xff1a; 尺寸是单位是mm&#xff1a; 135mm …

C语言程序的翻译环境和执行环境

目录 一、概述&#xff1a;翻译环境、执行环境 1.翻译环境 2.执行环境&#xff08;运行环境&#xff09; 二、详述翻译环境——编译环境、链接环境 1.编译环境 2.链接环境 三、详述编译过程——预编译、编译、汇编 1.预编译&#xff08;预处理&#xff09; 2.编译&…

JVM 堆外内存查看方法

JVM 堆外内存查看方法 概述 是否曾经想过为什么Java应用程序通过众所周知的*-Xms和-Xmx调整标志消耗的内存比指定的数量大得多 &#xff1f;由于各种原因和可能的优化&#xff0c;JVM可能会分配额外的本机内存。这些额外的分配最终可能使消耗的内存超出-Xmx* 限制。在本教程中…

第6周 .NET

好嘛&#xff01;本来以为上周SQL Server环境配置等已经够恶心了&#xff0c;没想到这周又得去搞所谓的Microsoft Visual Studio 2005了。 首先非常离谱的是&#xff0c;这个Microsoft Visual Studio 2005如果就是指Visual Studio 2005&#xff0c;那么已经是8年前的老的不行的…

【技能树笔记】网络篇——练习题解析(八)

目录 前言 一、LAN技术 1.1 堆叠与集群 1.2 MSTP的特点 二、WAN技术 2.1 PPP链路建立 2.2 PPPoE 2.3 组播 2.3.1 组播的IP 2.3.2 组播分发树 2.3.3 组播协议 三、IPv6基础 3.1 IPv6地址 3.2 IPv6协议 3.3 IPv6过渡技术 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1…

快速拿下 AI Prompt 工程师证书攻略!

Datawhale干货 贡献者&#xff1a;许文豪、司玉鑫、甘元琦 Prompt 是 AI 2.0 时代打开大模型能力的金钥匙&#xff0c;它能够大大的提高工作效率。 如果把大语言模型 (LLM&#xff0c;Large Language Model) 具象成一个的员工&#xff0c;那 Prompt 提示词则好比是你给员工下的…

留意差距:弥合网络安全基础设施的挑战

您最近一直在关注日益增加的网络威胁吗&#xff1f;如果您发现自己沉浸在 IT 或技术中&#xff0c;那么您可能会永远追求与时俱进。每天都会出现新的漏洞&#xff0c;这对保持消息灵通提出了巨大的挑战。 构建和维护能够应对复杂攻击者的网络安全基础设施所面临的挑战是真实存…

idea的debug调试

目录 断点条件设置(condition) 断点表达式(evaluate expression) 断点回退(reset frame) 断点条件设置(condition) 条件断点&#xff0c;一般是满足我们设置的某个条件时&#xff0c;debug断点才会生效。这种条件断点设置&#xff0c;我们一般用在多重循环中。 这儿我们以li…

codeforces (C++ In Love )

题目&#xff1a; 翻译&#xff1a; 思路&#xff1a; 1、在一个集合中有多组线段&#xff0c;如果有不相交的两组线段&#xff0c;则输出YES&#xff0c;否则输出NO。 2、每次操纵可以选择增加一组线段或者删除一组线段后&#xff0c;输出YES或者NO。 3、用flag标记该线段是否…

数据结构: map与set的简单实现

目录 map与set的模拟实现 1.基本框架 2.模拟实现map与set所需要做的事 1.使用模板 , 达到泛性编程 2.比较问题 3.迭代器 RBTree中: operator operator-- 4.map [ ] 的实现 5.使用普通迭代器构造const迭代器 效果 map与set的模拟实现 1.基本框架 map set 2.模拟实…

nodejs+vue旅行社网站系统-计算机毕业设计

激发了管理人员的创造性与主动性&#xff0c;对旅行社网站系统而言非常有利。 模块包括主界面&#xff0c;首页、个人中心、用户管理、景点分类管理、旅游景点管理、景点购票管理、酒店信息管理、酒店预定管理、旅游路线管理、系统管理等进行相应的操作。 目 录 摘 要 I ABST…

力扣刷题 day52:10-22

1.数组拆分 给定长度为 2n 的整数数组 nums &#xff0c;你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) &#xff0c;使得从 1 到 n 的 min(ai, bi) 总和最大。 返回该 最大总和 。 方法一&#xff1a;排序 #方法一&#xff1a;排序 def arrayPai…

【计算机网络】UDP的报文结构和注意事项

UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种无连接的协议&#xff0c;它在传输层中提供了简单、不可靠的数据传输服务。与TCP&#xff08;Transmission Control Protocol,传输控制协议&#xff09;不同&#xff0c;UDP不需要建立连接&…

驱动开发3 ioctl函数的使用+3个实例(不传递第三个参数、第三个参数为整型、第三个参数为地址)

开发板&#xff1a;stm32mp157aaa&#xff08;Cortex-A7*2 Cortex-M4*1&#xff09;开发环境&#xff1a;vscode、串口工具 1 引入ioctl函数的意义 linux操作系统中有意将数据的读写和读写功能的选择分别交给不同的函数去完成。就让read/write函数只进行数据的读写即可&#x…