算法中的递归分析和分治法的原理dashuai的博客

显然,分解容易(一分为二),组合难。

快速排序

刚刚分析过了,快速排序是枢轴记录划分,也就是分解难,但是组合易。A[1…k-1]≤A[k]≤A[k+1…n]

因为这些细节一般只影响常数因子的大小,不改变量级。求解时,先忽略细节,然后再决定其是否重要!

分析的方法

替换法

Themastermethod(通用法,万能法)

可迅速求解

递归通俗的说就是一个函数调用函数自己(本身),这个调用过程叫递归,递归是一把双刃剑(有时方便,有时不好),如果需要处理重复的需要多次计算的问题,通常可以选择用递归或者循环两种方式,但是递归的执行效率不如循环语句。

注意:必须设置终止递归的条件检测,否则慎用。

首先,main函数用参数1调用递归函数,递归函数形参n=1,打印语句level1……然后,n<4,故函数本身使用参数n+1=2,第二次调用自己,这样就打印了level2……

以此类推,当执行到第四级调用,n=4,if失效,不再调用函数,而是执行了第二句打印,先输出LEVEL4……此时第四级调用结束,控制权返回给了主调函数,也就是第三级主调函数,此函数中上一句是if语句,已经执行完毕,然后继续执行第二句打印语句,输出LEVEL3……第三级调用结束,返回控制权给调用函数(也就是第二级主调函数),然后第二级函数开始继续执行,以此类推,打印LEVEL2,1……

递归的基本原理

每一级递归都使用自己这一级的私有变量n,同级调用时的地址和返回的地址是一样的。好好揣摩!

这是函数自己在一层层的往深度调用自己,然后一层层的往回返,每到一层,就继续执行接下来的语句(故调用开始的地址和返回的地址一样),而每一级递归都是用自己的局部变量。也就是第一级的n不同于第二级的n,这样子,函数逐步调用然后逐步返回直到main函数里。

递归函数里,递归语句之前的语句和各级被调的递归函数执行顺序一致,而递归语句之后的语句和被调的递归函数执行顺序相反(这一特点针对涉及反向顺序的编程问题很有用)

递归函数必须包含可以终止的条件,因为递归可以替代循环,故必须有终止

尾递归

最简单的递归:递归语句放到函数末尾,恰在return语句前,叫做tailrecursion(尾递归),因为出现在函数尾部,作用相当于一条循环语句。

//计算阶乘(递归和循环)#include#include//计算阶乘intfactorial(int);intloopFactorial(int);intmain(){intnum;printf("输入1-12的整数,q退出\n");while(scanf_s("%d",&num)){if(num<0){printf("error!输入1-12的整数!");}elseif(num>12){printf("输入1-12的整数!");}else{printf("\n%d的阶乘=%d",num,factorial(num));printf("\n%d的阶乘=%d",num,loopFactorial(num));}printf("\n输入1-12的整数");}system("pause");return0;}//循环计算阶乘intfactorial(intn){inttemp;for(temp=1;n>1;n--){temp*=n;}returntemp;}//使用递归计算阶乘intloopFactorial(intn){inttemp;if(n>0){temp=n*loopFactorial(n-1);//属于尾递归,如n>0那么这就是最后一句}else{temp=1;//必须要有递归结束判断条件!}returntemp;}注意:整型范围,32位机器,int类型最大到21多亿,再大的话,就要用longlong或者double类型,一般来说,选择循环比较好些,递归每次调用都要有自己的变量集合,占据内存大,每次都要存储新的变量集合到堆栈,这样速度慢,但是递归(最简单的是尾递归)比较简单。一些情况还是要用。

THE END
1.理解递归算法的原理腾讯云开发者社区当然这只是一个段子,不过也从侧面反映出递归算法不容易理解的事实。这个我自己也深有体会,就拿排序算法里面的快排和归并排序来说吧,这两种算法采用的都是分治思想来处理排序问题,所以递归在这里就出现了,如果你不理解递归算法,就去学习这两种排序算法,可能理解起来就非常费事,尽管你知道这两种排序的算法原理和它的https://cloud.tencent.com/developer/article/1356049
2.算法之美:解读递归算法原理和效率常见递归算法 下面总结一下常见的递归问题和实现算法。 斐波那契数列 斐波那契数列的排列是:0,1,1,2,3,5,8,13,21,34,55,89,144……依次类推下去,你会发现,它后一个数等于前面两个数的和。在这个数列中的数字,就被称为斐波那契数。 递归思想:一个数等于前两个数的和。 http://www.360doc.com/content/19/1227/22/27863154_882621949.shtml
3.递归算法与递归套路编程编程递归算法原理 递归算法的核心思想是将一个问题划分为一个或多个规模较小但类似于原问题的子问题,并通过递归调用解决这些子问题,最终将子问题的解合并得到原问题的解。递归算法通常包含两个要素: 递归基(Base Case):定义递归的终止条件,即最简单的情况下直接给出解答。 https://download.csdn.net/blog/column/12409590/132877647
4.C++递归与分治算法原理示例详解C语言这篇文章主要为大家介绍了C++递归与分治算法的策略原理示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪+ 目录 GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!【 如果你想靠AI翻身,你先需要一个靠谱的工具!】 1. 汉诺塔问题 递归算法,分为 3 步:将 n 个 a 上的盘子https://www.jb51.net/article/226989.htm
5.怎么绘制递归算法流程图?教你简单的制作方法递归流程图是一种描述递归算法执行过程的图形化工具,它可以帮助理解递归算法的实现原理,展示递归函数调用的过程和递归函数在不同层次上的执行情况。那么要怎么绘制递归算法流程图呢?接下来就让我们一起来看看。https://www.liuchengtu.com/tutorial/diguiliuchengtu.html
6.python3open指定编码mob64ca1402a190的技术博客递归体。解答:什么时候需要调用自身方法。 ##使用递归计算n的阶乘 def factorial(n): if n==1: return n else: return (n*factorial(n-1)) print(factorial(5)) 1. 2. 3. 4. 5. 6. 7. 8. 15.递归算法原理——目录树结构展示 ##递归打印所有的目录和文件 https://blog.51cto.com/u_16213626/11467185
7.编译原理第四章:语法分析消除左递归算法 提取左公因子 对于一个文法,通过改写产生式来推迟决定,等获得足够多的输入信息再做正确的决定。 例:文法: 可以改写为: 三、LL1文法 预测分析法的工作过程 从文法的开始符号S开始,每一步推导根据当前句型的最左非终结符A和当前输入符号α,选择正确的A-产生式。为保证分析的确定性,选出的候选式https://www.jianshu.com/p/47dd1b4791f7
8.腾讯算法岗武功秘籍(上)2.2.4 手写算法代码 ● 定义函数实现一下softmax(不要用numpy) ,数值太大溢出怎么办? 2.2.5 激活函数类 ● DNN中如果把中间层的激活函数去掉会怎样?去掉激活函数的DNN与逻辑回归有什么区别? 2.3 深度学习:RNN递归神经网络方面 2.3.1 讲解相关原理 ● RNN的梯度爆炸怎么解决? ● LSTM对于RNN的改进地方在哪?https://www.flyai.com/article/930
9.90%的算法都基于这六个算法思想计算机科学中存在多种常见的算法思想,它们在解决问题时具有独特的特点和适用场景。本文将深入探究递归算法、贪心算法、回溯算法、分治算法、动态规划和枚举算法,并提供每个算法思想的示例问题,以帮助读者更好地理解其原理、应用和优缺点。 递归算法 递归算法是一种自我调用的算法思想,通过将问题分解为基本情况和更小规模https://m.w3cschool.cn/article/96194468.html
10.北航软件学院招收2024年硕士研究生自命题考试大纲(991包括但不限于内排序的基本概念、各类算法实现原理和应用,主要内容有:排序的基本概念,各种内排序方法的基本原理和特点;插入排序法(含折半插入排序法);选择排序法;泡排序法;谢尔排序法;快速排序法;堆排序法;二路归并排序法。 七、递归分析技术 包括但不限于递归分析技术的基本概念和操作,主要内容有:掌握递归算法的分https://soft.buaa.edu.cn/news_nry.jsp?urltype=news.NewsContentUrl&wbtreeid=1325&wbnewsid=10683
11.递归算法(图文详解)递归算法是一种直接或者间接调用自身函数或者方法的算法。说简单了就是程序自身的调用。 二、算法实质 递归算法就是将原问题不断分解为规模缩小的子问题,然后递归调用方法来表示 问题的解。(用同一个方法去解决规模不同的问题) 三、算法思想 递归算法,顾名思义就是有两个大的阶段:递和归,即就是有去(递去)有https://www.coonote.com/algorithm-note/explanation-of-recursive-algorithms.html
12.浅谈递归算法优缺点这与递归算法的原理是一致的,递归算法的核心思想是简化复杂性。对于一个复杂的问题,将原始问题分解为几个相对简单的子问题,直到子问题简单到可以直接解决,即递归的出口,使原始问题有递归解决方案。 2.用有限的句子定义对象的无限集合; 这似乎不容易理解,但结合实际例子,我们的理解可以大大加深。举一个最经典的例子,https://www.tulingxueyuan.cn/tlzx/jsp/1251.html
13.科学网—经典的算法回顾1.最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。 2.子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重https://blog.sciencenet.cn/blog-315535-665392.html
14.递归算法实验报告.docx递归算法实验报告篇一:递归算法的设计和实现的实验报告 班级学号 姓名 实验组别 试验日期 室温 报告日期成绩 报告内容:(目的和要求、原理、步骤、数据、计算、小结等) 实验名称:递归算法的设计和应用 实验目的: 1. 掌握递归算法的实现。 2. 实现递归算法的应用。 实验环境(硬/软件要求): Windows XX, Visual C++https://max.book118.com/html/2018/1018/8105025065001127.shtm
15.2021年度市级以上公安机关面向社会招录警务信息侦控网络安全4.数据结构和算法 (3)链表、队列、树等常见数据结构 (4)递归、排序、查找等常见算法 (十八)大数据基础知识 1.大数据的特点、分布式存储、分布式计算的概念 2.Zookeeper原理和架构,应用场景 3.HDFS的特点,常用操作 4.MapReduce 原理和架构 5.YARN原理和架构 http://www.gxjcxy.com/zsjy/zpxx/content_3331