漫谈递归

什么时候用递归好呢?

1、写个冒泡排序,用递归肯定不合适,因为操作的方法不具备可迭代性,比如A是B的上层,只要A比B大就行,然后B下面又有C,B负责执行找出B和C最大的就行,这样就像一个树的关系,上层只需要关注和他下层的一个集合的比较,然后把任务不断往下分发,相反,快速排序就很满足这样的特性,所以递归就是这样不断迭代放大的过程,比如经典的N!的计算

2、递归的具体实例,比如查找某目录下的所以文件,目录嵌套目录,这就满足1中的不断递归的演进,我写个测试程序:

用golang查找目录下文件

func Glob(pattern string) (matches []string, err error) {
	if !hasMeta(pattern) {
		if _, err = os.Lstat(pattern); err != nil {
			return nil, nil
		}
		return []string{pattern}, nil
	}

	dir, file := Split(pattern)
	switch dir {
	case "":
		dir = "."
	case string(Separator):
		// nothing
	default:
		dir = dir[0 : len(dir)-1] // chop off trailing separator
	}

	if !hasMeta(dir) {
		return glob(dir, file, nil)
	}

	var m []string
	m, err = Glob(dir) //递归就发生在这里
	if err != nil {
		return
	}
	for _, d := range m {
		matches, err = glob(d, file, matches)
		if err != nil {
			return
		}
	}
	return
}

3、递归模型和mapreduce模型比较:

mapreduce模型的map阶段是不断的划分,然后计算,然后合并,然后递归则是数据查找计算的不断迭代演进,每一步都包含一组计算,然后像滚雪球一样,不断的扩散这个过程

4、递归和一般循环

循环只是线性操作,没有上下包含关系,比如递归就是可以让函数,和函数中递归的函数有包含关系

5、函数式语言

函数式语言就是用递归进行循环,比如Erlang,Scala,F#,以及始祖Lisp等等

时间: 2024-07-29 03:59:44

漫谈递归的相关文章

漫谈递归:递归的思想 --转载

为什么要用递归 编程里面估计最让人摸不着头脑的基本算法就是递归了.很多时候我们看明白一个复杂的递归都有点费时间,尤其对模型所描述的问题概念不清的时候,想要自己设计一个递归那么就更是有难度了. 很多不理解递归的人(今天在csdn里面看到一个初学者的留言),总认为递归完全没必要,用循环就可以实现,其实这是一种很肤浅的理解.因为递归之所以在程序中能风靡并不是因为他的循环,大家都知道递归分两步,递和归,那么可以知道递归对于空间性能来说,简直就是造孽,这对于追求时空完美的人来说,简直无法接接受,如果递归仅

漫谈递归和迭代

递归(recursion)在计算机科学中是指一种通过重复将问题分解为同类问题的子问题而解决问题的方法.可以极大地减少代码量.递归的能力在于用有限的语句来定义对象的无限集合.递归式方法可以被用于解决很多计算机科学问题,因此它是计算机科学中十分重要的一个概念.绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归.计算理论可以证明递归可以完全取代循环,因此在很多函数编程语言中习惯用递归来实现循环. 与重复密切相关的是递归,在递归技术中,概念是直接或间接由其自身定义的.例如,我们

算法设计方法:递归的内涵与经典应用

摘要: 大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归.毋庸置疑地,递归确实是一个奇妙的思维方式.对一些简单的递归问题,我们总是惊叹于递归描述问题的能力和编写代码的简洁,但要想真正领悟递归的精髓.灵活地运用递归思想来解决问题却并不是一件容易的事情.本文剖析了递归的思想内涵,分析了递归与循环的联系与区别,给出了递归的应用场景和一些典型应用,并利用递归和非递归的方式解决了包括阶乘.斐波那契

PHP树生成迷宫及A*自己主动寻路算法

PHP树生成迷宫及A*自己主动寻路算法 迷宫算法是採用树的深度遍历原理.这样生成的迷宫相当的细,并且死胡同数量相对较少! 随意两点之间都存在唯一的一条通路. 至于A*寻路算法是最大众化的一全自己主动寻路算法 完整代码已上传,http://download.csdn.net/detail/hello_katty/8885779 ,此处做些简单解释,还须要大家自己思考动手.废话不多说,贴上带代码 迷宫生成类: /** 生成迷宫类 * @date 2015-07-10 * @edit http://w

PHP树生成迷宫及A*自动寻路算法

PHP树生成迷宫及A*自动寻路算法 迷宫算法是采用树的深度遍历原理,这样生成的迷宫相当的细,而且死胡同数量相对较少! 任意两点之间都存在唯一的一条通路. 至于A*寻路算法是最大众化的一全自动寻路算法 完整代码已上传,http://download.csdn.net/detail/hello_katty/8885779 ,此处做些简单解释,还需要大家自己思考动手.废话不多说,贴上带代码 迷宫生成类: /** 生成迷宫类 * @date 2015-07-10 * @edit http://www.l

尾递归(转)

add by zhj: 尾递归其实跟循环在代码形式上非常像,尾递归会同时用到反推和正推,由n->n-1是反推,由acc1, acc2 = acc2, acc1+acc2是正推.参见本文最后,分别用循环和尾递归实现Fibonacci数列. 原文:http://www.nowamagic.net/librarys/veda/detail/2325 尾递归(tail recursive),看名字就知道是某种形式的递归.简单的说递归就是函数自己调用自己.那尾递归和递归之间的差别就只能体现在参数上了. 尾

机器学习漫谈

机器学习漫谈 数据挖掘/机器学习项目一般包括四个关键部分,分别是,数据分析,特征工程,建立模型,验证. 1     数据分析 从广义上讲,数据分析包括数据收集,数据处理,数据清洗,探究性数据分析,建模和算法设计,数据可视化等等[1].从狭义上讲,数据分析指的是探究性数据分析(EDA). 所谓探索性数据分析(Exploratory Data Analysis,以下简称EDA),是指对已有的数据(特别是调查或观察得来的原始数据)在尽量少的先验假定下进行探索,通过作图.制表.方程拟合.计算特征量等手段

编程珠玑番外篇之番外篇-O 中间语言和虚拟机漫谈(ZZ)

http://blog.youxu.info/2014/05/11/language-and-vm/ 导言 编程语言的发展历史,总的来说,是一个从抽象机器操作逐步进化为抽象人的思维的过程.机器操作和人的思维如一枚硬币的两面,而语言编译器就像是个双面胶,将这两面粘在一起,保证编程语言源程序和机器代码在行为上等价.当然,人本身并不是一个完美的编译器,不能无错的将思维表达为高级语言程序,这种偏差,即Bug.因为编译器的帮助,我们可以脱离机器细节,只关心表达思维和程序行为这一面. 编程语言的发展日新月异

漫谈高数 特征向量物理意义

[1. 特征的数学意义]        我们先考察一种线性变化,例如x,y坐标系的椭圆方程可以写为x^2/a^2+y^2/b^2=1,那么坐标系关于原点做旋转以后,椭圆方程就要发生变换.我们可以把原坐标系的(x,y)乘以一个矩阵,得到一个新的(x',y')的表示形式,写为算子的形式就是(x,y)*M=(x',y').这里的矩阵M代表一种线性变换:拉伸,平移,旋转.那么,有没有什么样的线性变换b(b是一个向量),使得变换后的结果,看起来和让(x,y)*b像是一个数b乘以了一个数字m*b? 换句话说