什么时候用递归好呢?
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-12-19 18:24:56