首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏小点点

    (三)算法基础——递归(2)

    目录 例题 1.四则运算表达式求值 2.爬楼梯 3.放苹果  4.算24 ----         这篇文章是上篇文章的延续,所以不会对递归进行详细的介绍,如果对递归还不太清楚的同学可以去康康上篇文章哦 /"结果也是整数 样例输入 (2+3)*(5+7)+9/3 样例输出 63 解题思路         首先我们需要理解表达式的定义,其实表达式也是通过递归来定义的,我们来看一看吧!  首先,表达式由项通过加减得到,项通过因子的乘除得到,而因子由整数或者表达式组成,至此,表达式再次出现了,所以他其实是满足递归的,所以我们首先考虑使用递归来解决。 之所以要变成递归的形式来解决,就是因为优先级这个概念对于计算机来说是比较难处理的。所以接下来就只要处理好这三部分,就可以解决问题了。 ---- 2.爬楼梯 题目         树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数, 求不同的走法数。

    46310编辑于 2022-12-12
  • 来自专栏Michael阿明学习之路

    算法--递归--走台阶问题(2种递归+递归改循环)

    递归: 一个问题可以分解成若干子问题,且求解思路一样,当到一定的情况下有终止条件,这样的问题可以用递归方法求解 注意事项: 递归调用深度太大,栈空间会耗尽溢出 注意避免调用中某些值的重复计算(见以下代码 3) 递归,频繁调用函数,时间成本高(见以下代码1) 递归代码可以改成循环代码 (见以下代码2) 问题1 给你 n 个台阶,你的最大步幅是2步,可以一次走1步,也可以一次走2步,问有多少种走法? = f (n-1) + f (n-2) 终止条件:f (1) = 1; f (2) = 2; 1.递归代码(未考虑重复计算问题) 以下所有代码原来采用 size_t 溢出,改用 unsigned long } else { size_t sum = cal(n-1,n_fn_map)+cal(n-2,n_fn_map); //递归调用函数 n_fn_map.insert n-1,stepWalkAway+1)+cal(n-2,stepWalkAway+1); //递归调用函数 } } int main() { size_t n, stepWalkAway

    2.5K20发布于 2021-02-20
  • 来自专栏CSDN搜“看,未来”

    【C++】算法集锦(2):递归精讲

    文章目录 前言 从“楼梯事件”说起 解决方案 自下而上 记忆化 代码实现 递归的解题步骤 递归精练 1、打印杨辉三角的第k行 代码实现: 2、合并两个有序链表 代码实现: 3、快速排序 双边遍历 单边遍历 双边循环代码实现 2、单边循环代码实现 前言 之前是写过一篇“递归”的博客,但是感觉有点水,例题没有给到位,细节也没有点明白,所以今天再写一遍,前面那篇就删了吧。 递推到什么时候结束呢,递归到某一层的方法数可以唯一确定的时候,比方说递推到了1层和2层。 现在,我们只需要存储30个递归栈了。 ---- 这就是最优方案了吗?很显然,并不是,我们还可以精益求精。 如果说,4层 = 3层+2层,那我们为什么不给它倒过来呢? 1、明确你要干嘛 2、明确递归的结束条件 3、寻找递推关系式 4、注意边界条件与调用方式 ---- 递归精练 1、打印杨辉三角的第k行 ---- 代码实现: vector<int> getRow(int

    74950发布于 2021-09-18
  • 来自专栏Danny的专栏

    【J2SE快速进阶】——递归算法

    https://blog.csdn.net/huyuyang6688/article/details/42149477 递归算法        递归,百度百科对其定义为:程序调用自身的编程技巧 当n=3时,执行else下的return 3*Method(2),Method(2)即以2为实参重新调用了函数Method()本身;同理,n=2时,执行else下的return 2*Method(1); ;        2、递归要有结束条件,用来终止循环调用,即当满足这个条件时,就不再进行递归,否则一直调用本身,知道满足这个条。 递归实现的实例       为了加深印象,这里分享几个可以用递归来实现的小例子       1、求1+2+3+……+100 的和 public class Sum { public static void ; } } 递归与迭代的区别        一些初学者有时可能会把递归和迭代这两种算法混淆,递归是一个函数(或过程)通过不断对自己的调用而求得最终结果的一个算法,迭代则可以看做循环。        

    61610发布于 2018-09-13
  • 来自专栏cs

    递归算法

    据说凡是可以循环的步骤,都可以递归表示出来。 递归的关键有二点: 1.0 递归公式,即递推式。 2.0 递归出口。 ---- 递归求数组的和 package day20180407; public class Sumarry { public static void main(String[] args) { int[] arry= {1,2,3,4,5}; System.out.println("the sum of the arry="+sum(arry,arry.length- static int count=0; public static void main(String[] args) { int[] arry= {1,2,3,4,5,88 我感觉递归就像一种哲学。

    1.2K50发布于 2018-04-27
  • 来自专栏Super 前端

    算法--递归

    递归是一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的。用递归过程定义的函数,称为递归函数。它解决问题的各个小部分,直到解决最初的大问题。 在有限次(必须有出口)可预见性结果中,找到结果与上一次结果之间的关系; 关键在于梳理清楚本次结果和上一次结果的关系有哪些方面或是因素; 在算法的分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化成为一个递归方程的求解 经典递归案例: 示例: 斐波那契数列:1、1、2、3、5、8、13、21、34 F(0) = 0; F(1) = 1; F(n) = F(n-1) + F(n-2) function fibonacci 1 : fibonacci(n - 1) + fibonacci(n - 2) } })() 示例: 最大公约数,采用辗转相除法(欧几里得算法) 定理:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数 , name: 'a2', meta: {name: 'a2'}, }] }, { path: '/b',

    81621发布于 2019-08-15
  • 来自专栏帅哥哥写代码

    递归算法

    前言 递归算法(英语:recursion algorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。 问题解法按递归算法实现。如Hanoi问题。 数据的结构形式是按递归定义的。如二叉树、广义表等。 name: chid2, pid: p1, childs: [{ id: c21, name: chid21, pid: c2, 第三:递归函数中,位于递归调用前的语句和各级被调函数具有相同的执行顺序。 第四:递归函数中,位于递归调用后的语句的执行顺序和各个被调函数的顺序相反。 第五:虽然每一级递归都有自己的变量,但是函数代码不会复制。 第六:递归函数中必须包含终止递归的语句。

    1.2K20发布于 2019-04-16
  • 来自专栏程序猿人

    算法——递归

    背景 最近遇到一个类似爬楼梯的算法题。索性对递归的处理总结一下。 爬楼梯题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? else if(n == 2) return 2; else return climbStairs(n-1) + climbStairs(n-2); } 解法2(递归代码要警惕重复计算 递归代码要警惕重复计算;(解法2) 比方说f(5)= f(4)+f(3)需要计算f(4)和f(3),那么我们计算f(4) = f(3)+f(2)还需要计算f(3)。 那么怎么计算递归算法的时间复杂度呢?其实在所有的递归问题中,因为是大问题拆分小问题的思路,所以整个计算过程算下来就好像是一棵树。 ? 这就是利用递归树求解递归的时间复杂度。 以上。。。 王争 《数据结构和算法之美》

    92710发布于 2020-08-11
  • 来自专栏技术趋势

    递归算法

    /** * @author: csh * @Date: 2021/6/27 10:03 * @Description:递归算法 */ public class Recursion { public return i+=sum(i-1); }else{ return i; } } } 结果 5050 5050 最后 递归算法非常简单明了 在日常相同属性的计算机以这样来写,在后续的递归排序就是以些基础为计算逻辑。

    88410发布于 2021-07-29
  • 来自专栏DDD

    算法渣-递归算法

    前言 之前的排序算法 《快速排序》 与 《归并排序》 都使用了递归手法,如果不能理解递归,那分治思想类算法实现就难以理解 递归 To iterate is human,to recurse divine Peter Deutsch 迭代的是人,递归的是神 递归思想 递归的基本思想是把规模大的问题转化为规模小的相似的子问题来解决。 斐波那契数列 斐波那契数列的递推公式:Fib(n)=Fib(n-1)+Fib(n-2),指的是如下所示的数列: 1、1、2、3、5、8、13、21..... ; else if (n == 0 || n == 1) return n; else return fib(n - 1) + fib(n - 2); } VS迭代 递归算法与迭代算法的设计思路区别在于:函数或算法是否具备收敛性,当且仅当一个算法存在预期的收敛效果时,采用递归算法才是可行的,否则,就不能使用递归算法 参考资料 怎么更好地终极理解递归算法

    1.2K30发布于 2021-03-23
  • 来自专栏二猫の家

    递归算法

    对于很多编程初学者来说,递归算法是学习语言的最大障碍之一。很多人也是半懂不懂,结果学到很深的境地也会因为自己基础不好,导致发展太慢。 可能也有一大部分人知道递归,也能看的懂递归,但在实际做题过程中,却不知道怎么使用。今天,我们就来说一说递归算法的使用。 什么是递归 递归,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。 也就是说,递归算法是一种直接或者间接调用自身函数或者方法的算法。 通俗来说,递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。 编写正确的递归算法,一定要有 ”归“ 的步骤,也就是说递归算法,在分解问题到不能再分解的步骤时,要让递归有退出的条件,否则就会陷入死循环,最终导致内存不足引发栈溢出异常。 /*数列中从第3项开始每一项等于前两项之和*/ f2=f2+f1; } }

    1.1K21编辑于 2022-11-30
  • 来自专栏Java架构师必看

    递归下降算法_递归算法经典实例

    递归下降算法 算法模型: Term = Term + Expr Expr=Expr+Factor Factor =单个元素。最小单位。 我用递归下降算法写了个简单的计算器,递归算法为我的运算符号+ - * / 等基础运算符号形成优先级。在使用的过程中发现了递归下降算法很容易产生的一个问题,左递归问题。 什么叫左递归? 举个例子:1-2+1 正确答案应该是0,如果出现左递归答案将会是-2。 物理模型图对比: 左递归的时候生成的Node: 算式1-2+4,越是后面生成的优先级就会高于前面生成的,所以左递归,会先计算2+4。从而导致错误。 解决方案: 将运算符号抽象出来单独成立一层,将数值节点统统存入Vector,这样的话,在实际生成到内存中需要判断优先级的只有+ - * / 四个了,因为递归下降算法,所以只要让 * /在+ -的下一级子类中生成

    91810编辑于 2022-05-12
  • 来自专栏技术博文

    算法-递归算法-阶乘

    /** * 递归算法 * 递归算法是很常用的算法思想。使用递归算法,往往可以简化代码编写,提高程序的可读性。但是,不合适的递归往往导致程序的执行效率变低。 * 递归优点: * 程序代码更简洁清晰,可读性更好。有的算法用递归表示要比用循环表示简洁精练,而且某些问题,特别是与人工智能有关的问题,更适宜用递归方法,如八皇后问题、汉诺塔问题等。 有的算法,用递归能实现,而用循环却不一定能实现。 * 递归缺点: * 大部分递归例程没有明显地减少代码规模和节省内存空间。递归形式比非递归形式运行速度要慢一些。 如果递归层次太深,还可能导致堆栈溢出。 * 阶乘问题: * 从1到指定数之间的所有自然数相乘的结果,n的阶乘为:n!=n*(n-1)*(n-2)*……*2*1 * 而对于(n-1)! =(n-1)*(n-2)*……*2*1 * 从上述两个表达式可以看到阶乘具有明显的递推性质,即符合如下递推公式:n!=n*(n-1)!

    1.4K40发布于 2021-03-07
  • 来自专栏C++/Linux

    【算法专题】递归算法

    递归 递归 1. 汉诺塔问题 2. 合并两个有序链表 3. 反转链表 4. 两两交换链表中的节点 5. Pow(x, n) --- 快速幂 递归 在解决⼀个规模为 n 的问题时,如果满足以下条件,我们可以使用递归来解决: 问题可以被划分为规模更小的子问题,并且这些子问题具有与原问题相同的解决⽅法。 思路: 这是一道递归方法的经典题目,我们可以先从最简单的情况考虑: 假设 n = 1,只有⼀个盘子,很简单,直接把它从 A 中拿出来,移到 C 上; 如果 n = 2 呢? : 递归函数的含义:交给你两个链表的头结点,把它们合并起来,并且返回合并后的头结点; 函数体:选择两个头结点中较小的结点作为最终合并后的头结点,然后将剩下的链表交给递归函数去处理; 递归出口:当某一个链表为空的时候 ; 递归出口:当 n 为 0 的时候,返回 1 即可。

    45910编辑于 2024-03-01
  • 来自专栏C/C++学习

    【递归、搜索与回溯算法练习】day2

    2.解题思路 递归思路: 先处理第二个节点之后的节点,再将前两个节点进行交换,最后连接后面处理好的节点 迭代思路: 双指针法(三指针法) 两个指针进行交换,第三个指针进行遍历,直到将链表遍历结束 3.代码 递归: /** * Definition for singly-linked list -> next = prev; prev -> next = next; } return newhead; } }; 4.运行结果 递归 Pow(x, n) 2.解题思路 思路:先计算x的n / 2次,再相乘(注意n的正负性和奇偶性) 因为可能会出现n是INT_MIN的情况,因为-INT_MIN会导致溢出,所以我们将n的类型改为 、搜索与回溯算法练习的第2天 坚持就是胜利,继续加油。

    37510编辑于 2023-10-15
  • 来自专栏叶子陪你玩编程

    递归算法(下)

    上文讲了递归算法比较简单的用法,相信对递归算法有一定的概念了。这篇文章再来试试两个相对复杂一点点的案例,最后在总结一下使用递归的一般方法已经需要注意的地方。 汉诺塔 汉诺塔是一种移动圆盘的游戏,同时也是一个简单易懂的递归算法应用示例。(案例及图片来源于《我的第一本算法书》) 游戏规则 ? 移动一个盘子: 直接移动 盘子1 从A-->C 移动两个盘子: ? 步骤: 1.移动 盘子1 从A-->B 2.移动 盘子2 从A-->C 3.移动 盘子1 从B-->C 移动三个盘子: ? 步骤: 1.移动 盘子1 从A-->C 2.移动 盘子2 从A-->B 3.移动 盘子1 从C-->B 4.移动 盘子3 从A-->C 5.移动 盘子1 从B-->A 6.移动 盘子2 从B-->C 7 递归的三要素 1. 明确递归终止条件。 2. 给出递归终止时的处理办法,一般地,在这种情境下,问题的解决方案是直观的、容易的。 3.. 提取重复的逻辑,缩小问题规模。

    79311发布于 2020-05-12
  • 来自专栏后端技术学习

    递归算法使用

    1.什么是递归算法 通常递归算法可以将一个问题的重复调用进行分解,将其分解成一个多次调用,最终完成筛选或者需要的数据。 比如我们常见的斐波那契数列就是这样的: 0、1、1、2、3、5、8、13、21、34这样的递归数据,可以通过此来总结出它的数学公式规律: F(0) = 0; F(1) = 1; F(n) = F(n-1 ) + F(n-2);(n >= 2) 将其转成程序可以写成: public static int getFn(int n){ //先排除不满足的条件,然后针对特定场景的条件,最后是共性的实现 ; } } 而F(n) = F(n-1) + F(n-2)的这个过程就是是借助上面的F(0)和F(1)的结果来进行递推的,这个过程在数学上是一个数列的递推公式,在高中我们学过的数列上。 2.项目中使用递归 而在我们的项目中,经常会出现像树形菜单的需求。比如我们想将权限做成按钮级别,这个时候就需要做一个树形菜单,可以让用户根据需要进行启用和禁用。

    1.1K30发布于 2021-06-24
  • 来自专栏kwai

    算法(一) 递归

    理解(不保证正确) 1,递归想对于迭代,代码会更加清晰一些。 2,递归分两种 一种是return 递归式,求的是最后一个递归式的结果,作为整个函数的结果。 { if(l1 == null) return l2; if(l2 == null) return l1; if(l1.val>l2.val) { l2.next = mergeTwoLists(l1,l2.next); return l2; } else { l1.next = mergeTwoLists(l1.next,l2); return l1; } } } 理解 1,想到用递归做题有点难 3,二叉树遍历 在算法(八)那篇文章里。 很重要。(不过递归算法太简单不是很重要)

    52360编辑于 2022-01-10
  • 来自专栏编程

    算法之递归

    各种数学问题如: 8皇后问题 , 汉诺塔, 阶乘问题, 迷宫问题, 球和篮子的问题(google编程大赛) 各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等. = 0,可能是 1. 2. 3 return false; } } } /** * 使用递归回溯给小球找路 ,是回溯算法的典型案例。 然后回头继续第一个皇后放第二列,后面继续循环执行 1,2,3,4的步骤 说明:理论上应该创建一个二维数组来表示棋盘,但是实际上可以通过算法,用一个一维数组即可解决问题. arr[8] = {0 , 4, 7, 5, 2, 6, 1, 3} //对应arr 下标 表示第几行,即第几个皇后,arr[i] = val , val 表示第i+1个皇后,放在第i+1行的第val+1列 八皇后问题算法代码实现 package

    58410编辑于 2024-10-28
  • 来自专栏信安本原

    算法之递归

    递归是一种应用非常广泛的算法,在很多的数据结构和算法的编码中都会用到,理解递归是非常重要的。 ---- 递归就这样完成了,上面这个例子是只有一个递归调用的分支,还是比较好理解的,如果有多个递归分支的话,单纯靠人脑是很难理解清楚的,计算机比较适合做重复的工作,我们如果一环一环往递归里走的话,很快就迷糊了 •如果有两层台阶,(1,1)、(2),有两种•如果有三层台阶,(1,1,1)、(1,2)、(2,1),有三种•如果有四层台阶 ,(1,1,1,1)、(1,1,2)、(1,2,1)、(2,1,1)、(2,2 ),有五种•如果有五层台阶 ,(1,1,1,1,1)、(1,1,1,2)、(1,1,2,1)、(1,2,1,1)、(2,1,1,1)、(1,2,2)、(2,1,2)、(2,2,1),有八种•以此类推 举几个例子 为了避免这些情况,也可以将递归代码改为迭代循环的非递归方式,就是使用循环的方式来进行处理。 参考文档 极客时间-数据结构与算法之美

    67710发布于 2020-03-08
领券