Datawhale 12月组队学习 leetcode基础 day3 递归

这是一个新的专栏,主要是一些算法的基础,对想要刷leedcode的同学会有一定的帮助,如果在算法学习中遇到了问题,也可以直接评论或者私信博主,一定倾囊相助


进入正题,今天咱们要说的是递归,递归是是很多初学者比较头疼的问题啊,在这篇博客里,我会先阐述一下递归的定义,然后再举几个例子来证明一下,最后咱们练个小题强化一下。

递归算法

    • 递归算法简介
    • 递归算法解题思路
    • 例题
      • 例题1
    • 练习

递归算法简介

首先说一下递归的含义,递归的含义就是,递归算法(recursion algorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。这是百度百科的定义 ,按照我们平时对递归的用法,那就是把一个大的问题一直分解,直到分解成一种简单的情况为止,这种简单的情况就是我们能直接得到结果的情况。下面先举一个例子,我们以阶乘为例,我们平时算阶乘是怎么算呢? 1的阶乘就是1, 2的阶乘就是 2*1 ,3的阶乘就是 3 * 2 *1 ,其实这里就是一个简单的递归 我们求3的阶乘的时候,要知道2的阶乘,用 3×2的阶乘,那么这里2的阶乘是哪里来的呢 是用2×1的阶乘 1的阶乘是哪里来的?是规定 1的阶乘就是1.所以我们才能算出来3的阶乘。那么在计算机的语言里,我们一般是用函数调用自己的方式来实现递归,举个例子:

int func(int n)
{
	if (n == 1)
		return 1;
	else return n * func(n-1);
}

这个就是使用C++语言写一个简单的递归来解决阶乘问题的方法,我们简单分析一下,这个函数为什么能算阶乘?
当n等于1的时候 就返回1,如果n = 2呢?就调用else中的return 返回 n*func(n-1),即为 2×func’(1)也就是1的阶乘 1的阶乘用函数算出来就是1 这里就是2×1 其实这样还不够直观,因为递归的过程分为递推和回归两个过程,这里画个图让大家好理解一下:
在这里插入图片描述

递归算法解题思路

现在我们可以总结一下了,递归在计算机语言中解决问题的步骤是什么?

递推过程:指的是将原问题一层一层地分解为与原问题形式相同、规模更小的子问题,直到达到结束条件时停止,此时返回最底层子问题的解。
回归过程:指的是从最底层子问题的解开始,逆向逐一回归,最终达到递推开始时的原问题,返回原问题的解。

遇到问题时 我们只需要想好其中一个递推的过程和一个回归过程即可,不用全都想透,这样容易乱掉,其实这也是一个重复的过程,套路都是一样的

例题

下面我们练一个递归算法的经典小题

例题1

斐波那契数列

在这里插入图片描述
先说一下斐波那契数列是啥 他是 第0项为0 第1项为1(规定),从第三项开始 每一项都是前两项的和 这么一个数列 比如f(2) = f(0)+f(1)
这时候我们就想一下他的递推过程是啥,回归过程是啥,递归过程就是:比如我们要求 f (6) 的值 f,那么就要知道 f(4)和f(5)的值,f (4) 又要知道f (3) 和f(2)的值,一次类推 知道递推到 f(0)和f(1)的值 我们就可以return了,这里建议大家画图,不清晰一定画个图。
那么代码如何写呢?
在这里插入图片描述
在这里插入图片描述
可以看到,这里时间耗时比较长哈,这是因为在求斐波那契数列的时候有重复,就像我们求f(6),要求f(5)和f(4) f(5)要求f(4)和f(3),这里两个f(4)就重复了,这时我们可以使用记忆化的方式去简化,具体就是算完一个f 就存在数组里一个值,下次遇到已经存进去的值,就可以直接调用了,这里不提供代码,大家可以回去查阅一下。

练习

二叉树最大深度
这里没有学过二叉树的可以去看我的另一篇博客,可以简单了解一下,二叉树简单介绍
在这里插入图片描述
这里简单给个思路 就是二叉树有左子树和右子树 其中更深的就是我们要的答案
代码如下:做完再看嗷

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(root == nullptr)
        return 0;
        int hleft = 0;
        int hright = 0;
        hleft  = maxDepth(root->left);
        hright = maxDepth(root->right);
        return hleft > hright? hleft+1: hright+1;
    }
};

有啥问题都可以提出来 ,博主有啥问题也恳请斧正,谢谢。

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

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

相关文章

SpringBoot 自动装配原理---源码详解

目录 SpringBoot 自动装配原理源码流程详解:流程总结:条件匹配解释:其他解释: SpringBoot 自动装配原理 源码流程详解: 1、先看启动类,启动这个main方法,然后调用这个run方法。 2、把 启动类作…

牛客网 DP35 【模板】二维前缀和

代码: import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextInt()) { //…

netty-daxin-3(rpc远程调用)

文章目录 nettyRpcObjectEncoder 与 ObjectDecoderjdk动态代理回顾Rpc调用过程简析服务端客户端 nettyRpc ObjectEncoder 与 ObjectDecoder ObjectEncoder继承自MessageToByteEncoder<Serializable>&#xff0c;它内部使用ByteBufOutputStream包装ByteBuf对象&#xff…

Python 爬虫之简单的爬虫(一)

爬取网页上所有链接 文章目录 爬取网页上所有链接前言一、基本内容二、代码编写1.引入库2.测试网页3.请求网页4.解析网页并保存 三、如何定义请求头&#xff1f;总结 前言 最近也学了点爬虫的东西。今天就先给大家写一个简单的爬虫吧。循序渐进&#xff0c;慢慢来哈哈哈哈哈哈…

TrustGeo代码理解(一)main.py

代码链接:https://github.com/ICDM-UESTC/TrustGeo 一、导入各种模块和数据库 # -*- coding: utf-8 -*- import torch.nnfrom lib.utils import * import argparse, os import numpy as np import random from lib.model import * import copy from thop import profile imp…

devc++如何建立一个c++项目?devc++提示源文件未编译?

打开devc APP后是这样的界面&#xff1b; 点击文件-> 新建->项目&#xff0c;这一点应该不难&#xff0c;主要是最后这个选择什么&#xff1f; 这样即可。 devc提示源文件未编译&#xff1f; 点击工具->编译选项&#xff1b; 如果不能解决&#xff0c;那就是可能路径…

NNDL 循环神经网络-梯度爆炸实验 [HBU]

目录 6.2.1 梯度打印函数 6.2.2 复现梯度爆炸现象 6.2.3 使用梯度截断解决梯度爆炸问题 【思考题】梯度截断解决梯度爆炸问题的原理是什么&#xff1f; 总结 前言&#xff1a; 造成简单循环网络较难建模长程依赖问题的原因有两个&#xff1a;梯度爆炸和梯度消失。 循环…

代码随想录算法训练营第53天| 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划

JAVA代码编写 1143.最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情…

软件测试面试八股文(答案解析+视频教程)

1、B/S架构和C/S架构区别 B/S 只需要有操作系统和浏览器就行&#xff0c;可以实现跨平台&#xff0c;客户端零维护&#xff0c;维护成本低&#xff0c;但是个性化能力低&#xff0c;响应速度较慢。 C/S响应速度快&#xff0c;安全性强&#xff0c;一般应用于局域网中&#xf…

【华为数据之道学习笔记】3-10元数据管理架构及策略

元数据管理架构包括产生元数据、采集元数据、注册元数据和运 维元数据。 产生元数据&#xff1a; 制定元数据管理相关流程与规范的落地方案&#xff0c;在IT产品开发过程中实现业务元数据与技术元数据的连接。 采集元数据&#xff1a; 通过统一的元模型从各类IT系统中自动采集元…

Linux下FFmepg使用

1.命令行录一段wav,PCM数据 ffmpeg -f alsa -i hw:0,0 xxx.wav//录制 ffplay out.wav//播放ffmpeg -f alsa -i hw:0,0 -ar 16000 -channels 1 -f s16le 1.pcm ffplay -ar 16000 -channels 1 -f s16le 1.pcm -ar freq 设置音频采样率 -ac channels 设置通道 缺省为1 2.将pcm…

002.Java实现两数相加

题意 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示两数之和的新链表。 示例 输入&#xff1a;l1[2,4,3],l2[5,6,4] 输出…

【从零开始学习JVM | 第七篇】深入了解 堆回收

前言&#xff1a; Java堆作为内存管理中最核心的一部分&#xff0c;承担着对象实例的存储和管理任务。堆内存的高效使用对于保障程序的性能和稳定性至关重要。因此&#xff0c;深入理解Java堆回收的原理、机制和优化策略&#xff0c;对于Java开发人员具有重要的意义。 本文旨在…

springcloud-分布式缓存

文章目录 一.Redis持久化1.RDB持久化2.AOF持久化 二.Redis主从1.搭建主从架构2.全量同步3.增量同步 三.Redis哨兵1.哨兵的作用和原理2.搭建哨兵架构3.RedisTemplate的哨兵模式 四.Redis分片集群1.搭建分片集群2.散列插槽3.集群伸缩4.故障转移5.RedisTemplate访问分片集群 为什么…

树莓派(Raspberry Pi)4B密码忘记了,怎么办?

树莓派长时间不用&#xff0c;导致密码忘记了&#xff0c;这可咋整&#xff1f; 第1步&#xff1a;取出SD卡 将树莓派关机&#xff0c;移除sd卡&#xff0c;使用读卡器&#xff0c;插入到你的电脑。 第2步&#xff1a;编辑 cmdline.txt 在PC上打开SD卡根目录&#xff0c;启动…

Kotlin ArrayList类型toTypedArray转换Array

Kotlin ArrayList类型toTypedArray转换Array data class Point(val x: Float, val y: Float)fun array_test(points: ArrayList<Array<Point>>) {points.forEachIndexed { idx, ap ->ap.forEach {print("$idx $it ")}println()} }fun main(args: Arra…

2697. 字典序最小回文串

2697. 字典序最小回文串 难度: 简单 来源: 每日一题 2023.12.13 给你一个由 小写英文字母 组成的字符串 s &#xff0c;你可以对其执行一些操作。在一步操作中&#xff0c;你可以用其他小写英文字母 替换 s 中的一个字符。 请你执行 尽可能少的操作 &#xff0c;使 s 变…

RTX 40 SUPER发布时间定了!价格也有了

快科技12月16日消息&#xff0c;NVIDIA RTX 40 SUPER系列显卡基本确定将在2024年1月8日正式发布&#xff0c;也就是CES 2024大展期间&#xff0c;随后在1月中下旬陆续解禁上市。 RTX 4070 SUPER 1月16日解禁公版/原价丐版&#xff0c;1月17日解禁高价高配版&#xff0c;上市开…

鸿蒙开发编辑器设置

首先需要知道如何打开设置页面&#xff0c;以下所有设置都需要在设置界面中进行修改&#xff0c;有三种方式可以打开&#xff0c; 1、编辑器左上角file菜单下的Setting菜单。 2、编辑器右上角的设置按钮 3、按快捷键 ctrlalts 注意不要和其他软件案件重复。 一、设置每次打开…

制作一个简单 的maven plugin

流程 首先&#xff0c; 你需要创建一个Maven项目&#xff0c;推荐用idea 创建项目 会自动配置插件 pom.xml文件中添加以下配置&#xff1a; <project> <!-- 项目的基本信息 --> <groupId>com.example</groupId> <artifactId>my-maven-plugi…