学习笔记——数据结构与算法.递归

数据结构与算法之美 | 学习笔记23 —— 递归树 一、递归树基础 借助递归树分析递归算法的时间复杂度。把待解决的问题一层层分解画成图,就形成了一颗递归树。 将归并排序算法画成递归树,是一颗满二叉树: 二、递归树应用 1. 分析快速排序的时间复杂度 例如,对于快速排序,假设平均情况下,每次分区的大小比例为1:k,当k=9时,如果用递推公式,则为T(n)=T(n10)+T(9n10)+nT(n)=T(\frac {n}{10} )+T(\frac {9n}{10})+nT(n)=T(10n​)+T(109n​)+n,如果用递归树, 整个遍历的时间复杂度为O( 阅读详情

递归是一种非常广泛使用的编程技巧,递归非常的重要,很多的复杂算法的编码实现都通过递归来实现。搞懂递归非常的重要。

示例

假如你想知道到你这代是家族中第几辈了,这个时候你会去找你爸爸,你爸爸也不知道,就会找你爷爷。假如你爷爷知道,告诉了你爸爸,到你爷爷那代是第8辈了,然后你爷爷就会告诉你爸爸,到你爸爸那代是第9辈了,然后你的爸爸告诉你,到你这里已经是第10辈了。

这就是一个递归的问题,去的过程叫“递”,回来的过程叫“归”。

基本上所有递归问题都可以用递推推公式来表示:

f(n)=f(n-1)+1,f(1)=8

f(n)表示你自己想知道自己在第几辈了,f(n-1)表示你上一辈所在的辈数,f(1)表示你爷爷知道自己是第8辈了。

那将递推公式翻译成代码就是:

public int countGeneration(int n) {
 
if (n == 1) {
   
return 8;
 
}

 
return countGeneration(n - 1) + 1;
}

        

递归问题的求解(重点)

         使用递归来求解问题,需要满足3个条件:

  1. 一个问题,可以分解为几个子问题的解。

子问题,就是数据规模更小的问题的解,在求解辈数的问题中,你要知道“自己在第几辈”,可以分解为“上一辈的人在哪一辈”的问题。

 

  1. 这个问题与分解后的子问题,除了数据规模不同,求解思路完全一样。

还是求解辈数的问题。你求解“自己在哪一辈” 的问题与上一辈求解“自己在哪一辈”的思路,完全一样。

  1. 存在递归终止条件。

把问题分解为子问题,再把子问题分解为子子问题,一层一层往下分解。不能存在无限循环。必须要有终止条件。

在求解辈数的问题中,爷爷那辈知道自己在第几辈了,不需要再向上询问自己是第几辈了,知道自己在哪一辈了,即为f(1)=8,这就是递归终止条件。

 

 

实战递归

 

编写递归代码的关键是,只要遇到递归,我们就把它抽象成一个递推公式, 找到终止条件,然后翻译代码。不用想一层层的调用关系,不要试图用人脑去分解递归的每个步骤。不要试图用人脑理解整个递和归,不然就会把自己给绕进去。

 

斐波那契数列

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........

从第三项开始,每项都是前两项的和

 

我们要求的斐波那契数为n,每一个数都是由前两个之和组成。那如何表示前一个数,当然n-1, 那前两个数之和表示就是(n-1)+(n-2)。

是否满足一个问题可以分解为子问题的解呢?

我们需要求解当前第n个数,我们将这个问题分解下,它是由(n-1)加上(n-2)组成的值,n(n-1)这个数列也同样满足由前两项之和,这也同时满足:除数据规模不一样,求解思路一致的要求。

用公式表示出来就是: f(n) = f(n-1)+f(n-2)

那递归终止的条件又是什么呢?

从第三项开始,第项都是前两个数之和,那也就是说f(1)=1,f(2)=1

 

递推公式完整的表示就是:

f(n) = f(n-1)+f(n-2) 终止条件: f(1)=1,f(2)=1

 

将递推公式翻译成代码:

 

public int fibonacci(int n) {
 
if (n == 1) {
   
return 1;
 
}
 
if (n == 2) {
   
return 1;
 
}
 
return fibonacci(n - 1) + fibonacci(n - 2);
}

        

统计目录下所有文件大小

  这可是我们经常编程会遇到的一个问题,给定一个目录,统计下此目录下所有文件的大小。

我们如何来求解此问题呢。

目录由目录和文件组成,当我们遇到文件时,进行统计,遇到目录,则继续递归,当我们所有的目录遍历完成后,就统计得到了所有文件的大小。

用公式表示下

f(n)=f(n-1)+count(d) 其中f(n)表示需要求解的目录文件大小,f(n-1)表示子目录的求解,count(d)表示当前目录下所有文件大小。

那递归的终止条件是什么呢?

一个目录下只有文件,没有目录,那这个子目录的统计就结束了。

完整的表示就是:

f(n)=f(n-1)+count(d) 终止条件:f(1)=0,即不存在子目录或者子目录为0

 

将递推公式翻译成代码:

public long directoryCount(File file) {

 
long sum = 0;

  if
(file.listFiles().length > 0) {
   
for (File item : file.listFiles()) {
     
if (item.isFile()) {
        sum += item.length()
;
     
} else if (item.isDirectory()) {
        sum += directoryCount(item)
;
     
}
    }
  }

 
return sum;
}

 

 

N的阶乘

解释:

一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!

阶乘函数(符号:!)的意思是把逐一减小的自然数序列相乘。例如:

4! = 4 × 3 × 2 × 1 = 24

7! = 7 × 6 × 5 × 4 × 3 × 2 × 1 = 5040

1! = 1

 

n

n!

 

结果

1

1

1

1

2

2*1

2*1!

2

3

3*2*1

3*2!

6

4

4*3*2*1

4*3!

24

5

5*4*3*2*1

5*4!

120

……

……

……

……

 

通过此得到一个阶乘的规律:

n!=n*(n-1)!

n > 0

 

将递推公式转化为代码:

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

 

 

 

递归存在的问题

递归代码需要警惕堆栈溢出

在实际的软件开发中,编写递归代码会遇到很多的问题,比如堆栈溢出,而堆栈溢出会造成系统性的崩溃,后果会非常严重,来一起看几个会引起堆栈溢出的示例。

 

按默认的栈大小设置,在求解100000个数的斐波那契数列时,就发会生堆栈溢出。

 

为什么会发生栈溢出呢?

函数调用会使用栈来保存临时变量。每调用一次函数,都会将临时封装为栈帧压入内存栈,等函数调用返回才出栈,系统栈或者虚拟机栈的空间一般都不大,如果递归求解的规模很大,调用层次很深,一直压入内存栈,就会有堆栈溢出的风险。

 

如何避免发生栈溢出?

可以通过限制最大递归的深度来解决。如:递归调用深度超过100就不在递归了,直接返回报错。现在来改造下递归代码:


public int fibonacciSetDept(int n) {
 
return fibonacciSetMax(n, 0);
}

public int fibonacciSetMax(int n, int dept) {
  dept++
;
  if
(n == 1) {
   
return 1;
 
}
 
if (n == 2) {
   
return 1;
 
}

 
if (dept > MAX_DEPT_NUM) {
   
throw new IllegalArgumentException(" dept more " + MAX_DEPT_NUM);
 
}

 
return fibonacciSetMax(n - 1, dept) + fibonacciSetMax(n - 2, dept);
}

 

 

 

这种做法虽然解决了堆栈溢出的问题,但却并没有将问题解决,因为最大允许的递归深度与当前线程栈剩余的空间大小有关,事先无法计算。如果要求解的问题,本身递归深度较大,如10,50,100,这类,这种方法比较合适,否则此方法并不适用于此场景。

 

 

递归的重复计算的问题

还是以斐波那契数列为例吧:

递推公式:

f(n) = f(n-1)+f(n-2) 终止条件: f(1)=1,f(2)=1

 

从图中可以看出,在求解f(6)时,会计算f(5)+f(4),而f(5)需要计算f(4)+f(3)就这样f(4)被计算了多次,而f(3)也被计算了很多次。这就是数据重复计算的问题。

 

 

如何解决重复计算的问题?

可以使用一个散列表保存下已经求解过的数据。当有数据需要计算时,优先从散列表中去检查是否已经被计算过,如果已经计算过,则直接获取结果。没有,则需要进行一次计算,然后将结果放入到散列表中。

 

针对斐波那契数据的求解,来进行一下改造:

Map<Integer, Integer> cacheValue = new HashMap<>();

public int
fibonacciAddCache(int n) {

 
if (n == 1) {
   
return 1;
 
}
 
if (n == 2) {
   
return 1;
 
}

 
// 当数据已经存在,则直接返回缓存中的数据
 
if (cacheValue.containsKey(n)) {
   
return cacheValue.get(n);
 
}

 
// 进行计算然后将数据放入表到缓存的散列表中
 
int countValue = fibonacciAddCache(n - 1) + fibonacciAddCache(n - 2);
 
cacheValue.put(n, countValue);

  return
countValue;
}

 

时间空间的复杂度

递归的过程中,会有很多的函数的调用,当这些函数调用数量较大时,会积累成一个可观的时间成本。

在空间的复杂度中,每次函数的调用都会在内存栈中保存一次现场数据,在空间的复杂度分析中,需要考虑此部分额外的开销,就像斐波那契数列的代码,空间复杂度不是O(1),而是O(n)

 

 

递归的利弊

利:递归的表达能力很强。

弊:空间复杂度高、堆栈溢出的风险、重复计算、过多的函数调用耗时较多等问题。

 

 

递归代码改写为非递归的代码

求第几辈的问题

递推公式是: f(n)=f(n-1)+1,f(1)=8

 

改写为非递归的代码。

 

public int countGenerationLoop(int n) {
 
int start = 8;

  if
(n == 1) {
   
return start;
 
}

 
int countGeneration = start;

  for
(int i = 1; i < n; i++) {
    countGeneration = countGeneration +
1;
 
}

 
return countGeneration;
}

 

 

斐波那契数列

递推公式完整的表示就是:

f(n) = f(n-1)+f(n-2) 终止条件: f(1)=1,f(2)=1

 

改写为非递归的代码

public int fibonacciLoop(int n) {
 
if (n == 1) {
   
return 1;
 
}
 
if (n == 2) {
   
return 1;
 
}

 
int s = 1;
  int
t = 1;

  int
v = 0;

  for
(int i = 3; i <= n; i++) {
    v = s + t
;
   
s = t;
   
t = v;
 
}

 
return v;
}

 

 

N的阶乘

首先得到递推公式:

n!=n*(n-1)!

n > 0

改写为非递归的代码。

public int factorialLoop(int n) {
 
if (n == 1) {
    
return 1;
 
}

 
int sum = 1;

  for
(int i = 2; i <= n; i++) {
    sum = sum * i
;
 
}

 
return sum;
}

 

 

是不是所有递归代码都能改写成非递归?

笼统来讲,是可以的,递归本身是借助栈来实现的,我们一般使用的系统的栈或者虚拟机的栈,我们没有感知,如果我们在内存上实现栈,手动模拟入栈与出栈,这样所有的代码都可以使用实现看上去非递归代码的样子。

    这种思路实际上是将递归改为了手动递归,本质没有变。而且也没有解决递归的一些问题,反而增加了复杂度。

 

总结

递归是一种高效、简洁的编码技巧。只要满足3个条件就可以使用递归来解决。

递归三条件:

1.      一个问题,可以分解为几个子问题的解。

2.      这个问题与分解后的子问题,除了数据规模不同,求解思路完全一样。

3.      存在递归终止条件。

 

不过递归代码也比较难写、难理解。编写递归代码的关键是不要把自己绕进去,正确的姿势是写出递推公式、找到终止条件,再翻译成递归代码。

 

递归代码虽然简洁高效,但是也有很多的弊端,如:重复计算、函数调用过多、空间复杂度高等,在编写代码时需要控制好这些副作用。

【数据结构与算法分析】学习笔记课后答案第三章3.11递归非递归查找单链表某元素3.12反转单链表 编写查找单链表某元素的程序,分别用递归和非递归方法实现,并比较运行时间。链表达到多大才会令递归程序崩溃? 递归压栈会浪费大量额外空间与时间,因此非递归程序会比递归程序运行时间短。 链表长度约5000时递归查找即崩溃,而迭代可在1000000长度的链表下正确运行。 //非递归方法实现 Position Find_nonrecursion(Elmenttype x,List L) { Position p; p=First(L); while(p!=NULL&&p->El 阅读详情

相关推荐

10分钟上手YOLOv11:最强姿态估计模型来了,代码开源,效果炸裂!

【10分钟玩转YOLOv11实时姿态估计】🚀 YOLOv11作为YOLO家族最新成员,在速度、精度和易用性上全面升级,尤其适用于姿态估计等复杂视觉任务。本文带您快速掌握: 1️⃣ 核心概念:姿态估计即识别人体17个关键点(如关节部位)并连接成数字骨架,是智能健身、体感游戏等应用的基础。 2️⃣ 技术优势: 超轻量级(最小仅2.9M参数) 极速推理(GPU仅1.7ms) 高精度(COCO mAP@50-95达50%) 3️⃣ 三步实操: ① 安装:pip install ultralytics ② 准备人物

weixin_41246802的博客 1787

递归改循环方案,栈溢出的解决方案,用循环遍历未知深度的树形结构

递归改循环方案,用循环遍历未知深度的树形结构 在很多时候,我们在遍历的时候会选择用递归来实现,比如深拷贝两个对象,拍平数组啥的,大多数情况下,我们的栈的深度不会太深,使用递归并没用什么问题。 下面,我们来讨论下特殊场景下,如何用循环来代替递归。 递归的一些优缺点 缺点: 1.递归在不同的浏览器,栈溢出的极限值不一样,谷歌78达到3万多,ie11还不到1万 缺点: 2.递归要保存函数的很多信息,理论上来说,空间上是要占用更多的储存空间,执行效率上是会略慢一些(没有实测) 优点: 递归更加通俗易懂(相比较改循环

qq_29456953的博客 1435

ESP32-S3射频测试与全球认证全栈实践指南

功率谱密度(PSD)和发射功率等级是无线通信设备射频合规的核心基础概念,其物理层原理直接决定自适应测试、阻塞容限及多国认证的通过路径。PSD ≥10 dBm/MHz触发强制性自适应测试,需验证LBT机制与跳频鲁棒性;而16级可编程发射功率等级(-24 dBm至+20 dBm)则为功耗、覆盖与法规平衡提供工程调控维度。该能力广泛应用于低功耗蓝牙IoT终端、智能家居网关及工业无线传感器等场景,尤其在ESP32-S3平台中,需结合eFuse校准、Sigma工具链与QuickTrack认证策略实现从实验室调试到量产

weixin_34945060的博客 285

关于斐波那契数列三种解法及时间复杂度分析

斐波那契数列: f(n)=f(n-1)+f(n-2); n>=2 f(0)=0; f(1)=1; 即有名的兔子繁衍问题。 斐波那契数列共有三种解法,因而写这篇文章总结一下。 1. 递归求解 递归求解比较简单,是大家常见的一种解法。int fibonacci(int n) { cout<<"calculat

beautyofmath的博客 6万+

从零开始:使用COLMAP与OpenMVS构建高精度三维Mesh模型

本文为零基础新手提供了使用COLMAP与OpenMVS构建高精度三维Mesh模型的完整实战指南。详细介绍了从环境配置、数据采集黄金法则,到COLMAP稀疏与稠密重建、OpenMVS网格生成与纹理映射的每一步操作,并分享了关键的避坑技巧与参数调优建议,帮助读者从二维照片中成功重建出属于自己的三维模型。

metal的博客 505

基于SolidWorks宏的草图点坐标自动化提取与Excel集成

本文详细介绍了如何利用SolidWorks宏编程实现草图点坐标的自动化提取并与Excel集成,显著提升机械设计效率。通过VBA代码解析与优化,解决了人工记录坐标耗时易错的问题,并扩展了多草图批量处理、数据可视化等高级功能,适用于数控加工、质量检测等场景。

weixin_29251131的博客 460

学习笔记|数据结构——递归

学习笔记|数据结构——递归 1、递归定义 方法或函数调用自身的方式成为递归调用 去的过程叫“递”,回来的过程叫“归” 2、递归需要满足的条件 1、一个问题可以分解为数据规模更小的问题。比如阶乘,只需要计算本身的值和前一个数的乘积 2、分解后的子问题,除数据规模不一样,求解思路完全相同。 3、存在递归终止条件。一般用 if() return… 来返回最初的几个特殊值 因此,编写递归程序最关键的是写出递推公式,找到终止条件,剩下将地推公式转换为代码就简单了 典型问题 爬楼梯问题 首先找到某一层与之前一层的关

weixin_43202834的博客 517

关于机器人精度的总结(重复精度和绝对精度区分)

机械臂是工业生产中的重要设备,在焊接码垛 以及 非 接触测量等 领域中有 着重要应 用。然而由于机械臂本体制造中存在机械制造公差装配误差导致的运动学参数误差以及电机转角与关节转角间减速比误差等,导致机械臂存在。因此需要对机械臂进行标定,提高机械臂的绝对定位精度。ABB系列某款机器人精度参数表。

大胡子大叔的专栏 1万+

数据结构与算法学习笔记5--------递归算法

1.迷宫问题 2.八皇后 3.感想 1.迷宫问题 迷宫问题的情景是这样的,有一个迷宫,其中有墙壁,也就是无法到达的地方,设置一个起点,一个终点,让目标寻找路线,如果找到返回true 否则返回false /** * * @param map地图 * @param i 确定坐标 * @param j 确定坐标 * @return 找到了返回true 否则返回fal...

atomatom98的博客 270

qiankun 主子应用部署教程(Nginx 小白版)

本地开发:不用 Nginx,直接localhost:端口即可。本地模拟线上:用hosts + Nginx + 自定义域名,效果和生产接近。线上部署主应用只要配置 history 模式子应用必须支持 CORS + history + 缓存能跑是因为默认 server 兜底,但推荐写真实域名。主应用 vs 子应用的 Nginx 配置区别为什么本地和线上表现不一样history 模式 + 跨域的最佳实践。

专注于前端开发与实战技巧,记录从零到一的学习与项目经验。分享 Vue3 / JavaScript / TypeScript / Flutter /Uniapp等前端技术,以及 性能优化、工程化、最佳实践。 997

【OpenClaw企业级智能体实战】第09篇:OpenClaw金融投研实战:17个场景+完整代码,打造专属数字研究员

金融投研面临信息过载、流程重复、数据安全合规三大核心痛点,OpenClaw作为本地部署的新一代AI智能体,凭借“长期记忆+主动执行+数据不出域”的优势,成为券商分析师集体追捧的效率工具。本文基于8家头部券商公开研报,拆解OpenClaw在金融投研的17个核心应用场景(信息处理、研报撰写、量化策略、流程自动化),详解原理、技术选型、实操流程,并提供可直接运行的完整代码与执行结果。文章兼顾新手入门与进阶提升,强调安全隔离部署与幻觉防范,读者可按步骤搭建专属投研智能体,将信息处理、数据整理等重复工作效率提升80%

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 673

递归思想 | 俄罗斯套娃

递归的思想,利用了堆栈先进后出的特殊性质。进入最底层,一层一层地往外剥。【俄罗斯套娃】 对于递归,最好的方法是下Breakpoint逐步跟踪变量进行研究。 源代码: #include <stdio.h> #include <stdlib.h> #include <math.h> #include <iostream> using namespace...

JacobTsang的博客 2295

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java版数据结构和算法学习笔记之线性结构递归篇

Java版数据结构和算法学习笔记之线性结构递归篇1. 递归和斐波那契1.1 斐波那契数列 1. 递归和斐波那契 1.1 斐波那契数列 斐波那契数列—百度百科

TingtingYang 216

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

数据结构与算法之美——递归——学习笔记

一、前言 先说一下递归的几个常见应用:一是裴波那契数列,二是注册返佣金,找最终推荐人,三是青蛙跳台阶。 二、如何理解“递归” 作者从它学习数据结构与算法的经历来看,作者认为有两个最难理解的知识点,一个是动态规划另一个就是递归。 递归是一种应用非常广泛的算法(或者编程技巧)。之后我们要将的很多数据结构和算法的编程实现都要用到递归。比如DFS深度...

柠檬树 608

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

数据结构与算法学习笔记——递归迷宫问题

递归的概念 简单的说:递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。 递归需要遵守的准则 执行一个方法时,就创建一个新的受保护的独立空间(栈空间) 方法的局部变量是独立的,不会相互影响,比如n变量 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据. 递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError,死龟了:) 当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回

qq_29384339的博客 222

数据结构与算法学习笔记四--递归

递归 1.概念 递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。 2. 举个例子 public static void main(String[] args) { //通过打印问题,回顾递归调用机制 test(4); } public static void test(int n) { if(n > 2) { test(n - 1); } System.out.println("n=" + n); } 先递归调用方法,在

weixin_44501366的博客 706

《算法与数据结构》学习笔记8---递归

前言     本内容为本人学习笔记,课程来自极客时间数据结构与算法。 正文     递归是一种应用广泛的算法,在许多的数据结构和算法的实现中都用到了它,比如深度优先搜索、前序中序后序二叉树的遍历等。举一个感觉有点傻的例子,假如要去电影院看电影,因为各种原因不知道自己现在在第几排,于是你就问前面一排的人他是第几排,你只要在他的数字上加一就知道自己在哪一排了。但是,前面的人也看不清啊,所以他也问他前面...

依然关注 429

数据结构与算法之美 | 学习笔记07 ——递归

一、递归 1.实现递归 去的过程为递,回的过程为归。递归要满足的三个条件: 一个问题可以分解为几个子问题的解; 问题与子问题,除了数据规模不同,求解思路完全一样 存在递归终止条件 关键:写出递推公式,找到终止条件。 示例:n个台阶,每次可以跨1或2个台阶,请问走这n个台阶有多少种走法? 求解: 递推公式:根据第一步的走法把所有走法分两类:第一类是第一步走了1个台阶,之后的走法就是n-1个台阶的...

跟一大桃一起学习 366

【数据结构与算法】学习笔记-《算法笔记》-10【递归】

递归有两个重要概念:

weixin_42176221的博客 211

C#数据结构与算法学习笔记 递归

1.递归与栈 class Program { public static int Func(int n) { if (n == 1) return 1; else return n * Func(n - 1); } static void Main(string[] args) {

Mr_Tfos的博客 245

04 递归问题【数据结构与算法学习笔记(Java)】

数据结构与算法(Java实现) 我的学习资料: 视频:尚硅谷Java数据结构与java算法(Java数据结构与算法) 书籍:《大话数据结构》 笔记中包括学习的内容,代码,同时自己总结了知识点速记(部分会带页内跳转,可点击跳转)供快速回顾和记忆学到的知识点。 五、递归(Recursion) 5.1 递归的应用场景 迷宫问题(回溯),递归 在后台可以看到小球从起点找到去终点的路(1代表墙壁,2代表走过的路) 5.2 递归的概念 简单来说:递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程

小智爱学习的博客 257

数据结构与算法——递归(学习笔记)

一.递归 1.概念:递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。 2.调用机制: (1)打印问题 (2)阶乘问题 (3)图解方式说明递归的调用机制 代码演示递归: public class RecursionTest { public static void main(String[] args) { // test(4); int res = factorial(3);

weixin_44076873的博客 363

数据结构与算法学习笔记(python)——第三节 递归

前言 本人是一个长期的数据分析爱好者,最近半年的时间的在网上学习了很多关于python、数据分析、数据挖掘以及项目管理相关的课程和知识,但是在学习的过程中,过于追求课程数量的增长,长时间关注于学习了多少多少门课程。事实上,学完一门课之后真正掌握的知识并不多,主要的原因是自己没有认真学习和理解温故而知新的这句话的真正含义。因此,从现在开始,我在学习《数据结构与算法——基于python》的课程内容之后...

qq_34740277的博客 684

数据结构与算法学习笔记(三)——递归算法

卒A只能向下走一格或者向右走一格,想要到达B点,但是路线中间有一匹马,马的攻击的点是不能经过的(图中有八个,P1-P8,马的那一个点可以通过),求解卒A的过河路线。本题采用递归算法,识别卒A的下一步是否可行,可行返回True,得到最终的路径。求解的结果。

2301_79699401的博客 757

【数据结构学习笔记】归并的递归算法

源代码 /* 归并排序 */ /* 有序子列归并 L = 左边起始位置, R = 右边起始位置, RightEnd = 右边终点位置 */ void Merge(ElementType A[], ElementType TmpA[], int L, int R, int RightEnd) { LeftEnd = R - 1; // 左边终点位置,假设左右两列挨着...

weixin_30810583的博客 117
上一篇: 数据结构与算法-队列之leetcode练习(641,239,622)
下一篇: 学习笔记-数据传输之零拷贝
null_null_bug
博客等级 码龄7年 72粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值