首页 > 其他 > 详细

漫谈递归

时间:2015-10-30 12:46:16      阅读:275      评论:0      收藏:0      [点我收藏+]

什么时候用递归好呢?

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等等



漫谈递归

原文:http://my.oschina.net/yang1992/blog/523921

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!