递归调用

重载toString产生的无限递归

蹲街弑〆低调 提交于 2019-12-08 09:25:10
class InfiniteRecursion { @Override public String toString () { return "SXD" + this ; } } 字符串’SXD’碰到加号会试图把后面的this也转化成String,于是调用this.toString()进入死循环,抛出java.lang.StackOverflowError异常, Java编程思想(P510)采用调用父类的方法super.toString() 来源: CSDN 作者: CodingBugs 链接: https://blog.csdn.net/qq_33061377/article/details/79249942

PHP用递归返回无限级分类回字符串或数组实例

夙愿已清 提交于 2019-12-08 09:24:59
在栏目比较多的网站中,经常会用到无限分类,本文我们来分享一个用php递归实现的无限分类实例,实例的返回值可以选择是字符串还是数组,很实用。 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性。那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类。 递归,简单的说就是一段程序代码的重复调用,当把代码写到一个自定义函数中,将参数等变量保存,函数中重复调用函数,直到达到某个条件才跳出,返回相应的数据。 Mysql 首先我们准备一张数据表class,记录商品分类信息。表中有三个字段,id:分类编号,主键自增长;title:分类名称;pid:所属上级分类id。 class表结构: CREATE TABLE IF NOT EXISTS `class` ( `id` mediumint(6) NOT NULL AUTO_INCREMENT, `title` varchar(30) NOT NULL, `pid` mediumint(6) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 插入数据后,如图: PHP 根据不同的需求,我们提供两种不同格式的自定义函数,一种是返回字符串,一种是返回数组,两种函数都使用了递归方法

C++中的递归

谁说我不能喝 提交于 2019-12-08 09:24:47
1.概念 递归函数即自调用函数,在函数内部直接的或者间接地调用自己。在求解某些具有随意性的复杂问题时经常使用递归,如要求编写一个函数,将输入的任意长度的字符串反向输出。普通做法是将字符串放入数组中然后将数组元素反向输出即可,然而这里的要求是输入是任意长度的,总不能开辟一个很大的空间保存字符串吧?这时候递归就起作用了。递归采用了分治的思想,将整体分割成部分,从最小的基本部分入手,逐一解决,其中部分通常和整体具有相同的结构,这样部分可以继续分割,直到最后分割成基本部分。 递归函数必须定义一个终止条件,即什么情况下终止递归,终止继续调用自己,如果没有终止条件,那么函数将一直调用自己,知道程序栈耗尽,这时候等于是写了一个Bug! 总结递归的特点: (1) 使用递归时,一定要有明确的终止条件! (2) 递归算法解题通常代码比较简洁,但不是很容易读懂。 (3) 递归的调用需要建立大量的函数的副本,尤其是函数的参数,每一层递归调用时参数都是单独的占据内存空间,他们的地址是不同的,因此递归会消耗大量的时间和内存。而非递归函数虽然效率高,但相对比较难编程。 (4) 递归函数分为调用和回退阶段,递归的回退顺序是它调用顺序的逆序。 2.实践 斐波那契数列当n>3时,第n个元素的值等于第n-1个元素和n-2个元素的和,当n不确定具体数值时,可以通过递归的方式实现 int Fib(int n) { if

python:python基础语法四,函数

試著忘記壹切 提交于 2019-12-08 04:41:21
python基础语法 文章目录 python基础语法 函数简介(function) 函数的参数 不定长的参数 参数的解包(拆包) 返回值 help() 作用域(scope) 命名空间(namespace) 递归 函数式编程 高阶函数 filter()过滤器 匿名函数 lambda 函数表达式 (语法糖) map() sort() sorted() 闭包 装饰器 函数简介(function) - 函数也是一个对象 - 对象是内存中专门用来存储数据的一块区域 - 函数可以用来保存一些可执行的代码,并且可以在需要时,对这些语句进行多次的调用 - 创建函数: def 函数名([形参1,形参2,...形参n]) : 代码块 - 函数名必须要符号标识符的规范 (可以包含字母、数字、下划线、但是不能以数字开头) - 函数中保存的代码不会立即执行,需要调用函数代码才会执行 - 调用函数: 函数对象() - 定义函数一般都是要实现某种功能的 # 比如有如下三行代码,这三行代码是一个完整的功能 # print('Hello') # print('你好') # print('再见') # 定义一个函数 def fn() : print('这是我的第一个函数!') print('hello') print('今天天气真不错!') # 打印fn # print(fn) <function fn at

Scala学习笔记3 (Functional Programming)

别等时光非礼了梦想. 提交于 2019-12-07 18:39:04
3. FP 3.1. 函数 函数的地位和一般的变量是同等的,可以作为函数的参数,可以作为返回值。 传入函数的任何输入是只读的,比如一个字符串,不会被改变,只会返回一个新的字符串。 Java 里面的一个问题就是很多只用到一次的 private 方法,没有和使用它的方法紧密结合; Scala 可以在函数里面定义函数,很好地解决了这个问题。 3.1.1. 函数定义 函数和方法一般用 def 定义;也可以用 val 定义 匿名函数 ,或者定义 函数别名 。 def m0(x:Int) = x*x val m1 = (x:Int)=> x*x // 用 (), () 是必须的 val m2 = {x:Int=> x*x} // 用 {}, {} 是必须的 m0(10) // 100 m1(10) // 100 m2(10) // 100 不需要返回值的函数,可以使用 def f() {...} ,永远返回 Unit (即使使用了 return ) , 即: def f() {...} 等价于 def f():Unit = {...} 例如: def f() { return "hello world" } f() // Unit ,而不是 "hello world" 需要返回值的函数,用 def f() = {...} 或者 def f = {...} def f() = { "hello

递归的应用之乘方

 ̄綄美尐妖づ 提交于 2019-12-07 09:01:54
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。 乘方问题 对于给定的整数x和y,用递归求出x的y次方的值。其核心思想是:x^y=(x^2)^(y/2)。 下面给出java中的实现代码: public static long power(long x,long y){ if(y==1){ return x; } if(y%2==1){ return x*power(x*x,y/2); } return power(x*x,y/2); } 来源: CSDN 作者: iLemon 链接: https://blog.csdn.net/yanan_seachange/article/details/39521005

数据结构复习————递归与栈

拈花ヽ惹草 提交于 2019-12-07 04:43:39
递归的定义: 若一个对象部分的包括它自己,或用它自己给自己定义,则称这个对象是递归的,递归也可定义为,在一个过程中直接或间接的调用自己,则这个过程也是递归的。 能采用递归算法的问题的特征: 当一个问题具有以下三个特征时,就可以用递归算法。 1)大问题能分解成若干个子问; 2)子问题或是一个定值(直接解),或是与大问题具有相同性质的问题仅仅是规模比大问题小,即被定义项在定义中应具有更小的尺度; 3)子问题在最小尺度上有直接解,即分解过程能最终能结束(递归有结束条件)。 举个列子,比方说求n!(n为自然数)。正常人为的求解可能是1x2x3x—(n-1)xn。但这个问题可以分为两种情况考虑: (1)当n=0时,n!=1 (2)当n>0时,n!=nx(n-1)! 再对照上述的三个条件,n!分为一个子问题n(为一个定值),和另一个规模比n!小的问题(n-1)!满足1),2)两个条件。再者(n-1)!可以继续分:(n-1)!=(n-1)x(n-2)!=(n-1)x(n-2)x(n-3)!=—,—x2x1!。而1!就等于1,所以子问题在最小尺度上有直接解,满足条件3)。其递归函数如下所示: int fact( int n){ if (n== 0 ) /*递归结束条件*/ return 1 ; else return (n*fact(n- 1 )); } 递归与栈的关系: 那么就产生问题呢

一文教你学会递归解题

↘锁芯ラ 提交于 2019-12-06 23:48:32
前言 递归是算法中一种非常重要的思想,应用也很广,小到阶乘,再在工作中用到的比如统计文件夹大小,大到 Google 的 PageRank 算法都能看到,也是面试官很喜欢的考点 最近看了不少递归的文章,收获不小,不过我发现大部分网上的讲递归的文章都不太全面,主要的问题在于解题后大部分都没有给出相应的时间/空间复杂度,而时间/空间复杂度是算法的重要考量!递归算法的时间复杂度普遍比较难(需要用到归纳法等),换句话说,如果能解决递归的算法复杂度,其他算法题题的时间复杂度也基本不在话下。另外,递归算法的时间复杂度不少是不能接受的,如果发现算出的时间复杂度过大,则需要转换思路,看下是否有更好的解法 ,这才是根本目的,不要为了递归而递归! 本文试图从以下几个方面来讲解递归 什么是递归? 递归算法通用解决思路 实战演练(从初级到高阶) 力争让大家对递归的认知能上一个新台阶,特别会对递归的精华:时间复杂度作详细剖析,会给大家总结一套很通用的求解递归时间复杂度的套路,相信你看完肯定会有收获 什么是递归 简单地说,就是如果在函数中存在着调用函数本身的情况,这种现象就叫递归。 以阶乘函数为例,如下, 在 factorial 函数中存在着 factorial(n - 1) 的调用,所以此函数是递归函数 public int factorial(int n) { if (n < =1) { return 1;

资深安卓程序员带你用另一种角度学习 View 事件分发!

丶灬走出姿态 提交于 2019-12-06 21:09:20
我无法忘却 3 年前备受折磨的那个夜晚 —— 在我第一次学习 View 事件分发,却被网文折磨的那个夜晚。 是网上介绍 View 事件分发的文章不够多吗? 不是的,恰恰相反,网上的爆款文章不计其数,待你仔细阅读,却 颇有一种“外地人上了黑车”的感觉 —— 一言不合先上 30 张图表,带你在城市外围饶个上百圈,就是不直奔主题 解释一个现象为什么会存在、造成它存在的缘由为何、它如此设计是为了解决什么问题 …… 比起 拨开迷雾、明确状况、建立感性认识,他们更热衷于自我包装。 —— 有没有帮助我不管,先唬住人再说。 为了唬人,就算给他人徒添困扰、白费大量时间,也在所不惜! 正是对那次痛苦经历的念念不忘,于是我将这篇文章分享给大家。 在此,我向 3 年前的那个自己发誓,我必在 结尾 200 字 就讲明白,别人非要绕个 3000、5000 字都讲不明白的事件分发。 不仅如此,我还要额外地帮助大家理解,事件分发流程中的 3 个小细节:之所以如此设计,是出于什么考虑。通过“知其所以然”,来方便大家更好地加深印象。 还没阅读的小伙伴也请不要着急,正因为今天讲的是基础,光是看了这一篇,你也没白来! View 事件分发的本质是递归! 什么是递归呢?递归的本质是什么呢? 顾名思义,递归是一种包含 “递” 流程和 “归” 流程的算法。当我们在找寻目标时,便是处于 “递” 流程,当我们找到目标

递归函数的编写要点总结

和自甴很熟 提交于 2019-12-06 15:21:24
关于递归函数的编写:明确一点,递归就是自己调用自己,对于函数的编写,从上到下分为三个部分 第一部分:编写递归到底的处理逻辑(此时不用调用自己) 第二部分:编写未递归到底的处理逻辑 第三部分:编写返回上一层调用时需要的处理逻辑 伪代码: public void func(args){ //1.第一部分 if(递归到底){   //递归到底的处理逻辑   return; } //2.第二部分:改变参数,调用自身 func(changedArgs); //3.第三部分:往上层回退时的处理逻辑(此处的逻辑第一次执行是在,递归到底返回之后,层数是在倒数第二层)     //比如在递归操作树这个数据结构的时候,此处对应叶子节点的上一层,此时可以进行一些额外的逻辑处理    }    来源: https://www.cnblogs.com/chenyulin/p/11992626.html