掌握递归:编程中的优雅艺术

news2025/5/24 9:54:25

当然可以!你愿意迈出学习递归的重要一步,真的很棒!🌟
递归,虽然一开始看着有点绕,但掌握之后,你会发现它是编程中非常优雅且强大的工具。

我用简单又清晰的方式教你。请跟着我一步步来:


什么是递归?

递归就是函数自己调用自己
但是!为了避免无限循环,必须有一个“结束条件”(也叫出口)。

可以这样理解:

  • 第一步:确定出口 —— 什么时候不用再递归。

  • 第二步:确定递归规则 —— 当前问题怎么通过更小规模的问题来解决。


举个最简单的例子:求 1 到 n 的和

比如:sum(5) = 1 + 2 + 3 + 4 + 5

用递归怎么想?

  1. 5的总和 = 5 + (1到4的总和)

  2. 4的总和 = 4 + (1到3的总和)

  3. 以此类推...

  4. 最后,1的总和就是1,这里就是出口

于是代码就是:

public int sum(int n) {
    // 1. 出口:n == 1 时,不需要再递归了
    if (n == 1) {
        return 1;
    }
    // 2. 递归:n的总和 = n + (n-1)的总和
    return n + sum(n - 1);
}

总结写递归的固定套路

✅ 1. 明确这个函数的功能(例如:求 1~n 的和)。
✅ 2. 写出口(例如:n==1)。
✅ 3. 写递推关系(例如:n + sum(n-1))。


再来一个经典例子:阶乘

n! = n * (n-1) * (n-2) * ... * 2 * 1

递归版:

public int factorial(int n) {
    // 出口
    if (n == 1) {
        return 1;
    }
    // 递归
    return n * factorial(n - 1);
}

小练习(可以试试看)

  1. 写一个递归函数,求第 n 个斐波那契数列(第n个数 = 前两个数的和)。

  2. 写一个递归函数,打印从 n 到 1 的数字。



斐波那契数列(Fibonacci)是递归学习中非常经典的例子,我们一起来搞定它!


斐波那契数列是什么?

斐波那契数列是这样的:

第1个数是1
第2个数是1
第3个数是2 (1+1)
第4个数是3 (1+2)
第5个数是5 (2+3)
第6个数是8 (3+5)
...

规律:

  • 第 n 个数 = 第 (n-1) 个数 + 第 (n-2) 个数


怎么写递归?

还是跟着我们学到的三步法来:

✅ 1. 明确函数功能fibonacci(n),返回第 n 个斐波那契数。

✅ 2. 出口(结束条件)

  • 如果 n==1,返回1

  • 如果 n==2,返回1

✅ 3. 递推关系

  • fibonacci(n) = fibonacci(n-1) + fibonacci(n-2)


代码示范

public int fibonacci(int n) {
    // 出口
    if (n == 1 || n == 2) {
        return 1;
    }
    // 递归
    return fibonacci(n - 1) + fibonacci(n - 2);
}

小解释

比如求 fibonacci(5),它的执行过程是:

fibonacci(5) = fibonacci(4) + fibonacci(3)
            = (fibonacci(3) + fibonacci(2)) + (fibonacci(2) + fibonacci(1))
            = ((fibonacci(2) + fibonacci(1)) + 1) + (1 + 1)
            = ((1 + 1) + 1) + (1 + 1)
            = (2 + 1) + (1 + 1)
            = 3 + 2
            = 5

完美符合斐波那契数列的结果!


小提醒 🌟

这个递归写法非常清晰,但是如果 n 很大(比如 n=50),会有很多重复计算,会比较慢。

以后你学到**记忆化搜索(加缓存)或者动态规划(DP)**的时候,可以把效率提升上来!

不过目前来说,你先能写出这个递归,已经非常厉害了!👍


要不要试着自己写一下?比如求第 6 个、第 7 个、第 10 个斐波那契数?
需要的话,我可以继续带你进阶,比如教你怎么优化它哦!✨要继续吗?

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

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

相关文章

无人机开启未来配送新篇章

低空物流(无人机物流)是利用无人机等低空飞行器进行货物运输的物流方式,依托低空空域(通常在120-300米)实现快速、高效、灵活的配送服务。它是低空经济的重要组成部分,广泛应用于快递配送、医疗物资运输、农…

Qt状态机QStateMachine

QStateMachine QState 提供了一种强大且灵活的方式来表示状态机中的状态,通过与状态机类(QStateMachine)和转换类(QSignalTransition, QEventTransition)结合,可以实现复杂的状态逻辑和用户交互。合理使用嵌套状态机、信号转换、动作与动画、…

Java详解LeetCode 热题 100(20):LeetCode 48. 旋转图像(Rotate Image)详解

文章目录 1. 题目描述2. 理解题目3. 解法一:转置 翻转3.1 思路3.2 Java代码实现3.3 代码详解3.4 复杂度分析3.5 适用场景 4. 解法二:四点旋转法4.1 思路4.2 Java代码实现4.3 代码详解4.4 复杂度分析4.5 适用场景 5. 详细步骤分析与示例跟踪5.1 解法一&a…

CAU人工智能class4 批次归一化

归一化 在对输入数据进行预处理时会用到归一化,将输入数据的范围收缩到0到1之间,这有利于避免纲量对模型训练产生的影响。 但当模型过深时会产生下述问题: 当一个学习系统的输入分布发生变化时,这种现象称之为“内部协变量偏移”…

Android11以上通过adb复制文件到内置存储让文件管理器可见

之前Android版本如果需要将文件通过adb push放到内置存储,push到/data/media/10下的目录即可,直接放/sdcard/文件管理器是看不到的。 现在最新的Android版本直接将文件放在/sdcard或/data/media/10下文件管理器也看不到 可以将文件再复制一份到一下路径…

篇章二 需求分析(一)

目录 1.知名MQ 2.需求分析 2.1 核心概念 2.2 生产者消费者模型的类别 2.3 BrokerServer 内部的关键概念(MQ) 1.虚拟主机(Virtual Host) 2.交换机(Exchange) 3.队列(Queue) 4…

图解深度学习 - 机器学习简史

前言 深度学习并非总是解决问题的最佳方案:缺乏足够数据时,深度学习难以施展;某些情况下,其他机器学习算法可能更为高效。 若初学者首次接触的是深度学习,可能会形成一种偏见,视所有机器学习问题为深度学…

Gmsh 代码深度解析与应用实例

在科学计算与工程仿真领域,Gmsh 是一款广受欢迎的开源有限元网格生成器,它不仅支持复杂的几何建模,还能高效生成高质量的网格,并具备强大的后处理功能。本文将深入解析几段具有代表性的 Gmsh 代码,从基础几何创建到高级…

49页 @《人工智能生命体 新启点》中國龍 原创连载

《 人工智能生命体 新启点 》一书,以建立意识来建立起生命体,让其成为独立、自主的活动个体;也就可以理解为建立生命体的思想指导。 让我们能够赋予他灵魂!

量化研究---bigquant策略交易api研究

api接口来平台的代码整理,原理是读取bigquant的模拟测试信号,下单,可以完美的对接qmt交易,我优化了交易api的部分内容 我开发对接qmt的交易系统 看api源代码 源代码 # 导入系统包 import os import json import requests from ty…

编译原理 期末速成

一、基本概念 1. 翻译程序 vs 编译程序 翻译程序的三种方式 编译:将高级语言编写的源程序翻译成等价的机器语言或汇编语言。(生成文件,等价)解释:将高级语言编写的源程序翻译一句执行一句,不生成目标文件…

echarts之漏斗图

vue3echarts实现漏斗图 echarts中文官网&#xff1a;https://echarts.apache.org/examples/zh/index.html 效果图如下&#xff1a; 整体代码如下&#xff1a; <template><div id"funnelChart" style"width:100%;height:400px;"></div&g…

零基础设计模式——第二部分:创建型模式 - 原型模式

第二部分&#xff1a;创建型模式 - 5. 原型模式 (Prototype Pattern) 我们已经探讨了单例、工厂方法、抽象工厂和生成器模式。现在&#xff0c;我们来看创建型模式的最后一个主要成员——原型模式。这种模式关注的是通过复制现有对象来创建新对象&#xff0c;而不是通过传统的…

java 进阶 1.0.3

Thread API说明 自己滚去看文档 CPU线程调度 每一个线程的优先使用权都是系统随机分配的&#xff0c;人人平等 谁先分配到就谁先用 也可以耍赖&#xff0c;就是赋予某一个线程拥有之高使用权&#xff1a;优先级 这样的操作就叫做线程调度 最基本的是系统轮流获得 java的做法是抢…

从 Docker 到 runC

从 Docker 到 runC:容器底层原理详解 目录 1. Docker 与 runC 的关系 2. Docker 的核心组件 3. runC 的核心功能 4. 实战示例:从 Docker 到 runC 4.1 示例场景:运行一个简单容器 4.2 Docker 底层调用 runC 的流程 4.3 查看 runC 的调用 4.4 直接调用 runC 创建容器 …

PET,Prompt Tuning,P Tuning,Lora,Qlora 大模型微调的简介

概览 到2025年&#xff0c;虽然PET&#xff08;Pattern-Exploiting Training&#xff09;和Prompt Tuning在学术界仍有探讨&#xff0c;但在工业和生产环境中它们已基本被LoRA/QLoRA等参数高效微调&#xff08;PEFT&#xff09;方法取代 。LoRA因其实现简单、推理零开销&#…

02-jenkins学习之旅-基础配置

0 配置主路径 jenkins安装目录下找到jenkins.xml文件&#xff0c;C:\ProgramData\Jenkins\.jenkins目录下会存放jenkins相关的配置信息。 1 jdk配置 jenkins是java开发开源的项目&#xff0c;进而服务器需要jdk环境 1.1 服务器安装jdk 1.2 jenkins jdk配置 2 git配置 在je…

Appium+python自动化(三)- SDK Manager

简介 一开始打算用真机做的&#xff0c;所以在前边搭建环境时候就没有下载SDK&#xff0c;但是考虑到绝大多数人都没有真机&#xff0c;所以顺应民意整理一下模拟器。SDK顾名思义&#xff0c;Android SDK Manager就是一个Android软件开发工具包管理器&#xff0c;就像一个桥梁&…

3D Gaussian Splatting for Real-Time Radiance Field Rendering——文章方法精解

SfM → Point-NeRF → 3D Gaussian Splatting &#x1f7e6;SfM Structure-from-Motion&#xff08;运动恢复结构&#xff0c;简称 SfM&#xff09;是一种计算机视觉技术&#xff0c;可以&#xff1a; 利用多张从不同角度拍摄的图像&#xff0c;恢复出场景的三维结构和相机的…

【Unity实战笔记】第二十四 · 使用 SMB+Animator 实现基础战斗系统

转载请注明出处&#xff1a;&#x1f517;https://blog.csdn.net/weixin_44013533/article/details/146409453 作者&#xff1a;CSDN|Ringleader| 1 结构 1.1 状态机 1.2 SMB 2 代码实现 2.1 核心控制 Player_Base_SMB 继承 StateMachineBehaviour &#xff0c;控制变量初始…