递归剖析及应用

Python 递归 深入理解递归 Python递归剖析,绝对让你看懂! 递归再特定的场景下,非常实用,巧妙的递归设计能解决很多问题,文章主要列出了递归的各种思想和丰富的使用案例! 阅读详情

1.1.1           概念

一些操作可以分解为很多相同的更小的操作,这个时候我们可以使用递归,一般来说,这样的操作也可以使用迭代完成,但是递归可能更简洁。

递归的难点在于,递归要一直在微观和宏观之间切换,这会造成一些初学者很难找到里面的规律。为了说明白刚才这句话,我们做以下几个定义:

整体 – 要处理的对象,如二叉树

单元 – 分解为的最小操作对象,如节点

余部 – 由单元组成的部分对象集合,它是和整体一个层面的概念

 

整体 = 单元 + 余部*N

 

如遍历二叉树,即为根节点+ 遍历左右子树,根节点在这就是单元,而左右子树就是2个余部,子树和二叉树都是树。所以,余部和整体是一个层面的概念,是宏观的;而单元和整体与余部不是一个层面的概念,是微观的。

1.1.2           递归结构

我们来看下中序遍历二叉树的代码

voidBinTree::walk_in(BinTreeNode* node) const{

         if(node == NULL)

                   return;

        

         walk_in(node->get_left());

         printf("%d\n", node->get_data());

         walk_in(node->get_right());

}

单元是节点,printf("%d\n",node->get_data())是对单元的操作,对单元的操作我们很容易理解,对每个单元都进行这样的操作,那么整体就被处理完了。

比较难理解的是对余部的处理,我们首先怎么理解余部呢。我是这样来理解的,余部对我们来说像是个黑盒子的,它总能按照我们预先设定好的要求完成它该完成的功能,我们就像调用库函数一样调用它们。如上,walk_in(node->get_left())和walk_in(node->get_right()),我们认为它肯定能够按照中序遍历左子树和右子树。所以,只要遍历的根节点和根节点的两个子树,整个树就遍历完了。递归的特点就是调用自己,而初学者往往在这个问题上纠结,造成逻辑混乱,要将调用自己和调用其他函数一样看待即可。

说到这,我们其实应该可以感觉到迭代和递归的区别了,迭代是将整体分解为节点,然后循环处理每个节点;而递归是将整体分解为一个节点和N个余部,然后处理这个节点,并且获得N个余部的结果(注意我们没有参与余部的处理,只是获得它的结果),最后将结果进行合并处理。

到目前为止,我们应该可以总结出完成一个递归需要的几个步骤。另外需要补充的是,如果更容易理解递归的逻辑,有时可以将处理的单元想象成第一个要处理的单元,如二叉树的根节点,处理其他节点和处理根节点一样。

1.1.3           步骤

1.      根据处理思路将整体分解为单元和对应的余部(不同处理思路,分解方法可能不一样)

2.      设定余部处理函数(也就是递归函数本身)的输入和输出

3.      合并单元处理结果和余部结果

另外,我们在开始的地方要设置一个阀值,指定在什么情况下,节点就已经处理完了,或者就没必要再处理余下的节点了。注意,我们

         我们以求阶乘n!为例,按照以上的步骤进行处理。

分解

         我们的处理思路是要求N的阶乘,只要求出n-1的阶乘然后乘上n就可以得到n的阶乘。所以我们的单元为每个整数,而余部就一个就是单元后面所有整数的乘积。

函数输入输出

         要求余部的阶乘,只要将余部开头的整数传递过来即可,所以输入为余部的开头整数,输出为余部的阶乘结果。而这个余部处理函数也就是递归函数的输入输出。定义函数如下:

         intfunc(int n){

}

由第一步的分解分析,得到下面的程序

int func(int n){

         //n:单元,在这单元不需要处理

         //余部处理函数为func(n-1)

         Int tmp = func(n-1);//处理余部

}

合并

         将当前单元的值和单元后面的阶乘相乘即可。更容易理解的是,只要将最大值N和N-1的阶乘相乘就是N的阶乘。合并结果如下

int func(int n){

         //n:单元,在这单元不需要处理

         //余部处理函数为func(n-1)

         Int tmp = func(n-1);//处理余部

         return n* tmp;//合并处理结果和单元

}

阀值

         当传递进来的值等于0时,说明单元已经处理完了。得到如下程序

int func(int n){

         //设定阀值

         if(n==0)

                   return1;

 

         //n:单元,在这单元不需要处理

         //余部处理函数为func(n-1)

         Int tmp = func(n-1);//处理余部

         return n* tmp;//合并处理结果和单元

}

现在这个程序基本框架就已经写完了,当然函数也有很多需要优化和精简的地方,最后如下

int func(int n){

         if(n==1)

                   return 1;

                  return n* func(n-1);

}

1.1.4           总结

哎,总觉得自己想得特别明白,但是自己写出来的却没那么明白,当一个作家确实不容易啊。如果有谁将我的思路总结得更好或者有更好的其他思路,希望能够进行进一步的剖析,当然别忘了告诉我更好的剖析思路的地址。

递归操作树 实现了用递归方式,将树的节点进行累加,实现多层次的树 立即下载

相关推荐

KEGG两类报错--①No gene can be mapped--②URL ‘https://rest.kegg.jp/link/hsa/pathway‘…

版本问题,重新安装一下clusterProfiler包。网络问题,可以等待之后再试一下(试过不是)(以上可以排除基因不存在的错误因素)

weixin_57699783的博客 2万+

递归的原理以及执行流程

微信交流社区 添加微信:372787553 备注进群 什么是递归 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。 这里不禁的让我想起了两部电影 盗梦空间 蝴蝶效应 在项目中我常用的有可能是循环,偶尔也会用到递归,在其他的算法中也经常有递归算法的出现,比如我关于树的遍历,如果对递归的本质不是很理解就无法真正的掌握其算法的真意。 递归算法的推导 需求:给定一个数值 num,首先将这个数值 -2 ,在 + 1,当num小于0时结束 如果不考

杨海吉 3480

GPU算力租用平台推荐

阿里云作为中国领先的云计算服务提供商,提供了丰富的GPU云服务器实例,包括NVIDIA Tesla V100、A100等多种高性能GPU型号。阿里云GPU云服务器适用于深度学习、科学计算、图形渲染等多种场景,能够满足不同用户的计算需求。

hong161688的博客 8173

递归的使用

递归的使用

m0_64239036的博客 410

阿里系acw_sc__v3滑块验证码逆向分析与实战破解

本文深入解析阿里系acw_sc__v3滑块验证码的核心机制与逆向破解方法。通过分析加密参数生成、轨迹验证模块和动态加密策略,提供完整的自动化破解方案,包括设备指纹生成、缺口识别和轨迹加密等关键技术。文章还分享了常见问题的调试技巧,帮助开发者应对阿里系验证码的复杂防护体系。

wdx012345的博客 1830

从图像处理到AI:手把手教你用Halcon DL Tool完成第一个缺陷检测项目

本文详细介绍了如何使用Halcon深度学习工具(DL Tool)完成金属表面缺陷检测项目。从环境准备、数据采集标注到模型训练与部署,手把手指导工程师快速构建AI质检系统,显著提升工业缺陷检测效率。特别针对金属反光等难点问题提供实用解决方案。

weixin_42531886的博客 289

递归操作简介

因为在树的内容中,要大量遇到递归的操作,所以着这里复习一下递归操作。 递归,就是自己调用自己。 首先,需要搞清楚函数是如何调用的。在执行被调函数之前,系统需要做3件事: 1.将实参,函数的返回地址等信息传递给被调函数保存。 2.为被掉函数的形参,局部变量分配空间 3.将控制转移到被调函数入口。 当从被调函数返回前,也需要做3件事: 1.保存函数的返回结果 2.释放被调函数存储空间 ...

java开发指南博客 【转载】 181

013:无人机航线规划的概念

航线规划是无人机任务规划的核心环节,它决定了无人机在整个任务执行过程中的飞行路径。航线规划需要考虑多种因素,包括飞行时间、飞行距离、能源消耗、飞行安全等。

qq_31762031的博客 2443

【数据结构与算法】递归为什么这么难?一篇文章带你了解递归

美国计算机科学家——彼得·多伊奇(L Peter Deutsch)在《程序员修炼之道》(The Pragmatic Programmer)一书中提到“To Iterate is Human, to Recurse, Divine”——我理解的这句话为:人理解迭代,神理解递归。文章列举了一些递归的经典操作包括:斐波纳契数列、汉诺塔、冒泡排序的递归写法。以及力扣的一些链表的练习题使用递归去完成

摸鱼小小虫的博客 1672

VS2019 C# 连接IBM DB2数据库并查询数据表

操作系统:win10 64位 C#:VS2019 数据库:IBM DB2v11.1_win64_expc 其他工具:IBM Data Studio ibm_ds4130_win 步骤一:使用命令行或是IBM DB2工具:Data Studio,创建一个数据库。这里名称为:Student CREATE DATABASE "Student" AUTOMATIC STORAGE YES ...

坚韧与专注 3796

安卓15_ROM修改定制化_____修改rom的前提条件 去除各种验证 安卓设备通用

通过博文了解💝💝💝 1-------💝💝💝了解安卓设备的启动流程与核心验证机制 2-------💝💝💝了解安卓设备修改rom中的各种验证机制以及对应的去除方法 3-------💝💝💝了解avb验证与dm验证的本质区别与对应的操作方式 4-------💝💝💝修改rom前的循序步骤 避免验证机制导致的不开机

小马哥的专栏 506

函数递归(详细易懂)

函数递归

qq_74319491的博客 1万+

基于Simulink的无线充电系统LCC补偿网络建模与控制

本文详细介绍了基于Simulink的无线充电系统LCC补偿网络建模与控制方法。首先分析了无线充电系统面临的核心挑战,提出LCC补偿网络解决方案,阐述了其恒流输出和输入阻抗解耦原理。通过Simulink分步演示了系统建模过程,包括松耦合变压器、LCC+LC补偿网络、功率变换级搭建以及频率跟踪控制实现。仿真结果表明,LCC补偿系统在气隙变化和负载跳变下能保持输出电压稳定(波动±3%),效率达89%。文章还总结了工程实现要点,并探讨了动态充电、多负载系统等扩展应用。该教程为开发高效智能的无线充电系统提供了实用指导

amy_mhd的博客 62

递归:深入剖析与实战应用

递归是一种功能强大且灵活的编程技巧,适用于分治、树形结构遍历、组合与排列问题以及动态规划等场景。掌握递归的基本思路与实现套路,能够帮助你高效地解决许多复杂问题。通过本文的案例与代码优化,希望你能更深入地理解递归并在实际开发中应用它。如果有任何疑问或进一步的需求,欢迎与我讨论!

shuai_258的博客 1373

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

汉诺塔问题:递归算法的经典应用剖析

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。2.小的当头指针,那么此时l1->next就是剩下的两个链表合并后的结果,l1->next=dfs(l1->next,l2)dfs(x,z,y,n-1)//将x上n-1个盘子借助z这个盘子放到y上。dfs(y,x,z,n-1)//将y上面n-1个盘子借助x转移到z上。将A上的盘子移动到c上面,并且盘子的话摆放从下到上的话是大到小的。新链表是通过拼接给定的两个链表的所有节点组成的。当n=1的时候,我们只需要将x上的盘子丢到z上面。

2301_80863610的博客 7691

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C语言递归:深入剖析与实战应用

递归是指在函数中调用自身的过程。一个函数直接或间接调用自身,称为递归函数。递归的基本思想是将大问题分解为小问题,通过解决小问题来间接解决大问题。它是一种分而治之的策略。递归是一种强大的编程思想,通过将大问题分解为小问题,能够使代码更加简洁高效。然而,使用递归时需要注意性能和调试问题,并选择合适的应用场景。理解递归的基本概念和实现方式,掌握递归的优缺点和应用场景,是成为优秀程序员的关键之一。在实践中不断尝试和运用递归,能够提升我们分析和解决问题的能力。

极客代码 969

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

深入剖析递归算法:原理、特点、应用与优化策略

本文深入剖析递归算法。阐述其定义与原理,通过函数自调用及终止条件解决问题,举例阶乘、斐波那契数列。分析特点包括简洁、可读、通用,但存在空间和时间复杂度问题。介绍在数学计算及数据结构算法中的应用,如树形结构遍历、图算法等。给出设计要点,如明确关系、确定条件、注意参数传递与避免重复计算。最后总结其优劣,文末设投票与读者互动,以了解读者对递归算法的理解和需求,助力提供更优质内容。

A Charmer 的博客 3511

VB递归计算例题剖析:阶乘与斐波那契数列,掌握原理与应用技巧

递归是VB程序设计中的一个重要概念,它允许函数或过程调用自身来解决问题。掌握递归的关键在于理解其工作原理,并通过具体的例题进行练习。本文将结合实际代码,剖析几个典型的递归计算例题

tom821023cn的博客 293

递归的应用:以二叉树的镜像为例(图解说明,深入剖析每一步)

问题阐述:操作给定的二叉树,将其变换为源二叉树的镜像 解题思路:对于这个问题,可以递归就可以解决,借助一个第三方变量完成左右节点的数字交换就行,这里需要注意的你要掌握二叉树的遍历方式,以及递归的调用。详细的分析看下面的图解说明,希望能通过这个列子讲清楚递归在二叉树问题中的运用。 实现代码 package com.cc.cc_nowcoder_java; /** * @Classname Solution18 * @Description TODO * @Date 2020/5/21 10:.

会呼吸的梦 436

Java中的递归求阶层和斐波拉切数列以及递归思想剖析

Java中的递归求阶层以及递归思想剖析 在Java中,A方法调用B方法,我们很容易理解!递归就是A方法调用A方法!就是自己调用自己;利用递归可以用简单的程序来解决一些复杂的问题,它通常把一个大型的复杂的问题层层转化为一个与原问题相似的规模大小的问题求解,递归策略只需少量的程序就可以描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量,递归的能力在于用有限的语句来定义对象的无限集合; 递归结构包括两个部分: 递归头:什么时候不调用自身方法,如果没有头,将陷入死循环; 递归体:什么时候需要调用自身方法;

Despondent的博客 1071

递归算法讲解

原作者:书呆子Rico 《递归的内涵与经典应用》 http://my.youkuaiyun.com/justloveyou_摘要:  大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归。毋庸置疑地,递归确实是一个奇妙的思维方式。对一些简单的递归问题,我们总是惊叹于递归描述问题的能力和编写代

LightOn 24万+

算法设计方法:递归的内涵与经典应用

大师说:To Iterate is Human, to Recurse, Divine.毋庸置疑地,递归确实是一个奇妙的思维方式。对一些简单的递归问题,我们总是惊叹于递归描述问题和编写代码的简洁,但要想真正领悟递归的精髓、灵活地运用递归思想来解决问题却并不是一件容易的事情。本文剖析了递归的思想内涵并分析了阶乘、斐波那契数列、汉诺塔、杨辉三角的存取、字符串回文判断、字符串全排列、二分查找、树的深度求解等八个问题。

Rico's Blogs 3万+

leetcode刷题总结之递归

前言: 最近刷完leetcode递归的专题了,无奈本人很菜,关于递归每次都是看大佬的题解,自己也设计不出来递归,今日打算仔细分析递归题,总结以下。 递归: 在数学与计算机科学中,递归(Recursion)是指在函数的定义中使用函数自身的方法。实际上,递归,顾名思义,其包含了两个意思:递和归,这正是递归思想的精华所在。 ...

algsup 4946

可能存在无限递归_必备算法:递归!

递归是一种非常重要的算法思想,无论你是前端开发,还是后端开发,都需要掌握它。在日常生活中,统计文件夹大小、解析 xml 文件等等,都需要用到递归算法。它太基础太重要了,这也是为什么面试的时候,面试官经常让我们手写递归算法。本文将跟大家一起深入挖掘一下递归算法!什么是递归?递归的特点递归与栈的关系递归应用场景递归解题思路LeetCode 案例分析递归可能存在的问题以及解决方案什么是递归?递...

weixin_36004568的博客 1601

C++递归算法理解及典型问题举例

C++递归算法理解递归与循环的关系递归的内涵递归与循环经典递归问题实战寻找左侧边界的二分搜索:寻找右侧边界的二分查找:差值查找: 本文剖析了递归的思想内涵,分析了递归与循环的联系与区别,给出了递归的应用场景和一些典型应用,并利用递归和非递归的方式解决了包括阶乘、斐波那契数列、汉诺塔、杨辉三角的存取、字符串回文判断、字符串全排列、二分查找、树的深度求解在内的八个经典问题。 递归与循环的关系 比喻 递归:你打开面前这扇门,看到屋里面还有一扇门。你走过去,发现手中的钥匙还可以打开它,你推开门,发现里面还有一扇门,

weixin_42749137的博客 3821

浅谈递归算法

原作者:书呆子Rico 《递归的内涵与经典应用》 http://my.youkuaiyun.com/justloveyou_ 摘要:   大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归。毋庸置疑地,递归确实是一个奇妙的思维方式。对一些简单的递归问题,我们总是惊叹于递归描述问题的能力和编写代码的简...

HY845638534的博客 569
上一篇: C++ - const
下一篇: 北大ACM2965 - The Pilots Brothers' refrigerator(枚举)
G机器猫
博客等级 码龄16年 106粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值