首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏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.3K20发布于 2021-02-20
  • 来自专栏窗户

    相互递归(2)

    Colin-Cai/p/10920847.html   作者:窗户   QQ/微信:6679072   E-mail:6679072@qq.com   本章继续上一章,说明一下这个问题:   所有的相互递归都可以被转化为一般的递归 假设有以下对于 的相互递归:         ...      如果我们定义一个高阶函数(算子)f,满足         ...       于是以上就是一个对于f的普通递归(f递归到f)。   从而,我们就知道了,任何递归都可以转化为到自身的普通递归。   然而,对于lambda演算,因为自身没有名字,那又如何递归呢?    最大公约数的递归其实很简单:   (1)   (2)如果a不等于0,那么 ,此处%是取余数   (3)   其中第一条、第二条连续使用就是著名的欧几里得算法,或者称辗转相除法。    这个早在Church创建lambda验算体系的时候就已经发现,而且至关重要,否则就不知道怎么递归了。   

    1K10发布于 2019-05-25
  • 来自专栏小点点

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

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

    36410编辑于 2022-12-12
  • 来自专栏Lcry个人博客

    Java8新特性-使用Stream流递归实现遍历树形结构

    可能平常会遇到一些需求,比如构建菜单,构建树形结构,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中的Stream流一次性把数据查出来,然后通过流式处理,我们一起来看看, this.name = name; this.parentId = parentId; this.childList = childList; } } 递归组装树形结构 "子节点1",1), new Menu(3,"子节点1.1",2), new Menu(4,"子节点1.2",2), new Menu(5,"根节点1.3",2), new Menu(6,"根节点2",1), new Menu(7,"根节点2.1",6), "-------转json输出结果-------"); System.out.println(JSON.toJSON(collect)); } /** * 递归查询子节点

    1.7K20编辑于 2022-11-29
  • 来自专栏苦逼的码农

    递归与动态规划----基础篇2

    4 4 4 5 2 6 5 解题思路: 对于这种有多种选择的题,一般都可以使用递归的方法来做,上节讲过,对于递归的题,最重要的 就是找出递归的两个条件: 1. 两个函数之间存在的关系 2. 递归结束的临界条件 我们先来声明一些变量来记录一些东西 1. 现在我们来寻找递归的两个条件 1. 我们从第0行开始一直走,显然,当我们走到最后一行时,递归结束,此时i = n-1(因为我们从第0行开始算) 2. O(n2),因为三角形的数字总和为n(n+1)/2n(n+1)/2 ps:其实这道题也可以用递推方法的动态递归来接, 从底部往上算起,有兴趣的可以思考下。 (2).函数与函数之间的递归关系 1.先找结束条件: (1)当 n < 1时,显然不需要用2*1块覆盖,应该返回 0。

    61020发布于 2018-08-30
  • 来自专栏CSDN搜“看,未来”

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

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

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

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

    当n=3时,执行else下的return 3*Method(2),Method(2)即以2为实参重新调用了函数Method()本身;同理,n=2时,执行else下的return 2*Method(1); 递归有以下特点:        1、递归实现时,是把一个问题转化为类似的规模较小的问题,而这个新的问题与原问题的解决方法相同,只是处理对象不同,通过多次递归得出最简单的解,然后逐层向上返回调用,得到最终解 ;        2递归要有结束条件,用来终止循环调用,即当满足这个条件时,就不再进行递归,否则一直调用本身,知道满足这个条。 递归实现的实例       为了加深印象,这里分享几个可以用递归来实现的小例子       1、求1+2+3+……+100 的和 public class Sum { public static void ; //调用递归方法 System.out.print (num%2); </span

    47110发布于 2018-09-13
  • 来自专栏深度学习之tensorflow实战篇

    递归与伪递归区别,Python 实现递归与尾递归

          递归函数在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函 数。(1) 递归就是在过程或函数里调用自身。 (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 递归一般用于解决三类问题:  (1)数据的定义是按递归定义的。(n的阶乘)    (2)问题解法按递归实现。 因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储,因此递归次数过多容易造成栈溢出。 #递归函数 act(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! )的调用如下:  ''' #实现过程解读 ===> fact_iter(5, 1) ===> fact_iter(4, 5) ===> fact_iter(3, 20) ===> fact_iter(2,

    2.1K10发布于 2019-02-14
  • 来自专栏BaronTalk

    Java8新特性第2章(接口默认方法)

    除了上面看到的默认方法,Java8中还允许我们在接口中定义静态方法。这使得我们可以从接口中直接调用它相关的辅助方法,而不是从其它的辅助类中调用(如Collections)。 在做集合中元素比较的时候,我们一般需要使用静态辅助方法生成实现Comparator的比较器,在Java8中我们可以直接把该静态方法定义在Comparator接口中: public static <T, super U>> Comparator<T> comparing(Function<T, U> keyExtractor) { return (c1, c2) -> keyExtractor.apply (c1).compareTo(keyExtractor.apply(c2)); } 如果你喜欢我的文章,就关注下我的公众号 BaronTalk 、 知乎专栏 或者在 GitHub 上添个 Star 吧!

    96480发布于 2018-04-13
  • 来自专栏python读书笔记

    《算法图解》NOTE 3 递归1.定义2递归结构2.适用场合3.应用案例

    这是《算法图解》的第二篇读书笔记,内容主要涉及递归。 1.定义 递归是一种解决问题的方式。 2递归结构 递归在编程中展示的明显特为函数在运行过程中调用函数自身。 因此,递归函数的结构分为两部分,基线条件:用于终止递归递归条件:递归函数用于递归的代码。 2.适用场合 递归主要适用于将问题分解为子问题后,子问题的解法与原问题相同的场合。 递归算法能够很好地展示解决问题的思路,但其缺点也很明显,内存的使用率高。因为递归算法运行时,递归函数会不断调用本身。此时,外层的递归函数仍在运行,会占用内存。 因此,递归函数的调用次数越多,占用的内存就越大。 综上所述,若对算法的性能要求较高,可考虑使用循环替代递归的思路来解决问题。

    78840发布于 2018-06-19
  • 来自专栏技术一点点成长

    递归与尾递归

    前言:   本博客前面介绍了不少跟递归的思想相关的例子,比如“汉诺塔”,“八皇后”等。因最近又回忆起“尾递归”,故本文通过2个例子再跟大伙儿探讨一下尾递归。。。 什么是尾递归: 当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归递归实例一: 求阶乘! 1 package com.gdufe.recure; 2 3 import java.util.Scanner; 4 5 public class Factorial { 6 7 1:n*fac2(n-1); 31 } 32 /* 33 * 阶乘构造尾递归,进行编译优化 34 */ 35 public static int fac(int true 尾递归的意义: 从以上尾递归的实现过程当中我们可以发现,回归过程中不用做任何操作(运算),这样的一种特性使得在执行尾递归的过程时,能够被某些特定编译器进行优化,减少内存空间的消耗。

    1.2K20编辑于 2022-08-09
  • 来自专栏深度学习之tensorflow实战篇

    递归与伪递归区别,Python 实现递归与尾递归

          递归函数在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函 数。(1) 递归就是在过程或函数里调用自身。 (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。 递归一般用于解决三类问题:  (1)数据的定义是按递归定义的。(n的阶乘)    (2)问题解法按递归实现。 因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储,因此递归次数过多容易造成栈溢出。 #递归函数 act(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! )的调用如下:  ''' #实现过程解读 ===> fact_iter(5, 1) ===> fact_iter(4, 5) ===> fact_iter(3, 20) ===> fact_iter(2,

    2.5K70发布于 2018-03-16
  • 来自专栏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天 坚持就是胜利,继续加油。

    24210编辑于 2023-10-15
  • 来自专栏后端Coder

    java8

    setMoney(BigDecimal.valueOf(3.25)).setNum(10)); APPLE_LIST.add(new Apple().setId(1).setName("苹果2" ).setMoney(BigDecimal.valueOf(1.35)).setNum(20)); APPLE_LIST.add(new Apple().setId(2).setName Integer, Apple> appleMap = APPLE_LIST.stream().collect(Collectors.toMap(Apple::getId, x -> x, (k1, k2) Map<Integer, Apple> map = APPLE_LIST.stream().collect(Collectors.toMap(Apple::getId, y -> y, (k1, k2) -> k2)); System.out.println("map = " + map); System.out.println("==========

    1K20发布于 2020-02-10
  • 来自专栏二猫の家

    2.算法设计与分析__递归与分治策略

    由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。 1.递归算法 程序直接或间接调用自身的编程技巧称为递归算法(Recursion)。 递归需要有边界条件、递归前进段和递归返回段。 当边界条件不满足时,递归前进; 当边界条件满足时,递归返回。 注意:在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口,否则将无限进行下去(死锁)。 递归的缺点: 递归算法解题的运行效率较低。 fib(n-2); } 该算法的效率非常低,因为重复递归的次数太多。 6 5+1 4+2, 4+1+1 3+3, 3+2+1, 3+1+1+1 2+2+2, 2+2+1+1, 2+1+1+1+1 1+1+1+1+1+1 2 分治策略 分治策略是对于一个规模为

    1.2K31编辑于 2022-11-29
  • 来自专栏Linux云计算网络

    漫谈递归转非递归

    斐波那契数列问题:fib(n) = fib(n-1) + fib(n-2),当n = 1和n = 2时,存在简单情境:fib(1) = 1, fib(2) = 1。 1 //递归判断一个字符串是否为回文串level, abba; 2 bool isPalinString(int n, char* str) 3 { 4 if (n == 1 || n == 0 isPalinString(n-2, str+1): false; 7 } 二:递归的效率       递归导致一个函数反复调用自己,我们知道函数调用是通过一个工作栈来实现的,在大多数机器上,每次调用函数时大致要做三个工作 1) fact1(3, 3, 2) fact1(2, 4, 6) fact1(1, 5, 24) fact1(0, 6, 120) 2、斐波那契数列:fib(n) = fib(n-1) + fib(n , pre+cur); } fib1(5, 1, 1) fib1(4, 1, 2) fib1(3, 2, 3) fib1(2, 3, 5)  四:递归转非递归       不可否认,递归便于算法的理解

    2.2K70发布于 2018-01-11
  • 来自专栏Go编程点滴

    Go算法实战 - 2.【两数相加LeetCode-2】非递归解法

    Leetcode-2 两数相加 原题链接 https://leetcode-cn.com/problems/add-two-numbers/ 我们继续看上一个题目,这次我们尝试写一个非递归的解法。 我个人认为,非递归递归写法更加麻烦,所以放到了第二讲。一开始直接上手用非递归的解法,很容易迷失在 边界条件 和 循环条件 中,排查问题也比较麻烦。 非递归实现的思路 简化问题 我们不考虑进位问题,看看大致的代码架构: 不考虑进位的解法 func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode 利用位操作 walker.Next = node walker = walker.Next } return sentinel.Next 一般情况下,非递归的实现会比递归的性能更高 非递归减少了函数的堆栈,所以性能更高; 递归通过递归函数简化了复杂度,而非递归则需要循环; 持续优化 A - 简单优化代码结构(推荐) func addTwoNumbers(l1 *ListNode,

    33250发布于 2021-08-05
  • 来自专栏踏浪的文章

    递归与尾递归

    n,若 n=0 或者 n=1,函数返回 1, 否则函数返回 1+2+3+... 那么上面的函数运行流程 n = 5 ==> 5 + fn(5 - 1) n = 4 ==> 5 + 4 + fn(4 - 1) n = 3 ==> 5 + 4 + 3 + fn(3 - 1) n = 2 ==> 5 + 4 + 3 + 2 + fn(2 - 1) n = 1 ==> 5 + 4 + 3 + 2 + 1 即:最后的结果是 5 + 4 + 3 + 2 + 1 = 15 可以看到,一般的递归, (n -1, total + n) } 同样是 n=5,来看看运行过程 n = 5 ==> fn(5, 1) n = 4 ==> fn(4, 6) n = 3 ==> fn(3, 10) n = 2 = => fn(2, 13) n = 1 ==> fn(1, 15) 上面的运行每一次都是返回的一个单独的函数,没有其他的表达式与这个函数的结果运行,每一级递归的函数调用变成”线性”的形式。

    1.4K10发布于 2019-11-28
  • 来自专栏Java深度编程

    递归算法:计算1+2+3+……+n的值

    args) { int test = test(10); System.out.println(test); } } 测试结果: 55 要理解该算法,需要先懂递归 很多人只知道递归是自己调用自己,却并不明白自己调用自己的变量作用域的关系,其实每一次调用自己它的变量都是独立的,是互不影响的,如果你实在理解不了,就把这所有递归的次数,每一次调用都当成不是在调用自己,而是另一个独立的方法 比如我们可以把上面的test()方法,写成10个test()方法,用1,2,3……10来区分,然后将上面的代码写成一个循环,没一次循环调用不同的方法,执行相同的逻辑,能得到相同的结果,这样有助于自己对递归的理解 其实递归真的没那么难,你觉得难可能是一种心理障碍,没有去思索它,缺乏了探索的精神而已。 你只需要把每一次递归都当成调用了一次方法,这个方法得到了一个返回结果,这个结果接着又调用了一个跟自己一样逻辑的方法,继续参与了运算,如果反复往返罢了!

    3.1K30发布于 2020-06-10
  • 来自专栏python+前端 知识分享

    「Python」递归函数(递归特点和递归案例)

    函数调用自身的编程技巧称为递归。一、递归函数的特点特点:一个函数内部调用自己,函数内部可以调用其他函数,当然在函数内部也可以调用自己。代码特点:1. 这个非常重要,通常被称为递归的出口,否则会出现死循环示例代码:def sum_numbers(num): print(num) # 递归的出口很重要,否则会出现死循环 # 递归的出口: 来到第1行代码输出num是2,继续向下执行到判断语句不满足条件继续向下执行,到第9行调用函数,此时参数是2-1=1,来到第1行输出num是1,继续向下执行此时满足条件,出现return后面的代码都不执行 二、递归案例 - 计算数字累加需求:1. 定义一个函数 sum_numbers2. 能够接收一个 num 的整数参数,3. 计算1+2+...num的结果示例代码:def sum_numbers(num): # 1. 出口 if num == 1: return 1 # 2.

    4K30编辑于 2022-06-15
领券