递归算法

简介: 递归算法

求数组中的最大值

image.png

该函数的功能是 在L和R范围上返回最大值

1、 L=R表示就一个数 最大值是它自己

2、如果不止一个数 就求中点的位置

一般的写法是 (L+R)/2

但这些写有问题 如果数组长度很大 L+R可能会溢出

溢出之后 结果可能为负值

可以写成 L + (R-L)/2

(R-L)/2 表示 L ~ R 之间距离的一半

L 加上 一半的距离 也是 L ~ R 的中点

这个结果是不溢出的 因为 L、R都不溢出,R>L,所以R-L也不溢出

更简洁的写法

L + ((R-L)>>1) 右移一位 就等同于除2了

右移一位比除2要快

3、L ~ mid 范围的调用递归求一个左侧部分的最大值

4、mid+1 ~ R 范围的调用递归求一个右侧部分的最大值

5、全局最大值就是左侧最大值和右侧最大值较大的那个

举例

image.png

p(0,5)

中点位置是5/2=2的位置

image.png

p(0,2)是0~2范围上求个最大值

p(3,5)是3~5范围上求个最大值

只有都返回结果了

才知道0~5范围上的最大值是谁


image.png

p(0,2)又分为p(0,1)和p(2,2)

p(2,2)就是它自己了 直接返回

以此类推 递推函数的依赖图如下

image.png

所有的子点跑完

最终汇总到p(0,5)的时候 才知道最终答案

执行p(0,5)的时候 知道要调用p(0,2)

p(0,5)的结果没有出来,p(0,5)就进栈了

调p(0,2)的时候 知道自己要先调用p(0,1)

p(0,2)就进栈了

调用p(0,1) 知道先调用p(0,0)所以p(0,1)就进栈了

p(0,0)和p(1,1)计算完之后 p(0,1)就得到结果了

此时p(0,0)和p(1,1)就出栈了

依此类推

悬而未决的东西就会进到栈中

算完的东西就会从栈里弹出

所以就可以认为整个递归过程就是一个多叉树

利用栈玩了一个遍历

每个节点都通过自己的子节点给自己汇总信息之后

才能够继续往上返回

那栈空间就是一个数的高度

只能在一个高度上压栈

这就是递归的过程


相关文章
|
2月前
|
存储 算法
递归算法
【10月更文挑战第11天】递归算法是一种强大而又具有挑战性的算法技术。通过深入理解和掌握递归的原理、应用以及优化方法,我们可以更好地利用它来解决各种问题,并在编程实践中发挥其独特的优势。同时,我们也要注意递归算法可能带来的性能和栈空间问题,通过合理的设计和优化来提高算法的效率和稳定性。
33 1
|
7月前
|
算法
递归算法实现二分查找
本文简要介绍了递归实现的二分查找算法,这是一种在有序列表中快速查找的策略。递归方法虽在实际应用中较少,但有助于理解递归思想,为学习数据结构中的树内容打下基础。文中提供了原版和递归版本的二分查找代码,并强调了递归算法中处理未找到情况的注意事项。此外,还提到了递归在解决复杂问题时的优势,并通过链接分享了一个关于递归实现素数判断的例子。
99 2
|
机器学习/深度学习 人工智能 算法
深入理解递归算法
概述 定义 计算机科学中,递归是一种解决计算问题的方法,其中解决方案取决于同一类问题的更小子集 In computer science, recursion is a method of solving a computational problem where the solution depends on solutions to smaller instances of the same problem. 比如单链表递归遍历的例子: void f(Node node) { if(node == null) { return; } print
66 0
|
7月前
|
算法
递归算法练习
递归算法练习
35 0
递归和非递归分别实现求第n个斐波那契数
递归和非递归分别实现求第n个斐波那契数
62 0
非递归实现二叉树遍历
非递归实现二叉树遍历
52 0
|
存储 算法 JavaScript
算法系列-二叉树遍历(非递归实现)
在内卷潮流的席卷下,身为算法小白的我不得不问自己,是否得踏上征程,征服这座巍巍高山。 从零开始,终点不知何方,取决于自己可以坚持多久。 希望你可以和我一样,克服恐惧,哪怕毫无基础,哪怕天生愚钝,依然选择直面困难。
|
机器学习/深度学习 算法 前端开发
递归算法使用
通常递归算法可以将一个问题的重复调用进行分解,将其分解成一个多次调用,最终完成筛选或者需要的数据。比如我们常见的斐波那契数列就是这样的: 0、1、1、2、3、5、8、13、21、34这样的递归数据,可以通过此来总结出它的数学公式规律:F(n) = F(n-1) + F(n-2)的这个过程就是是借助上面的F(0)和F(1)的结果来进行递推的,这个过程在数学上是一个数列的递推公式,在高中我们学过的数列上。我还记得当时求解递推公式可以使用函数方程,而函数方程的思想想想其实是借助了微分方程逆推得到积分方程的过程,或者说是采用不动点法可以实现这一求解的过程。这个过程,在我看到高等数学的时候才明白,现在想
194 0
递归算法使用
汉诺塔(递归+ 非递归版)
汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题。在A,B,C三根柱子上, 有n个不同大小的圆盘(假设半径分别为1-n吧),一开始他们都叠在我A上(如图所示),你的目标是在最少的合法移动步数内将所有盘子从A塔移动到C塔。 游戏中的每一步规则如下:
245 1
汉诺塔(递归+ 非递归版)