文档章节

怎样去写递归

沙米笔记
 沙米笔记
发布于 2017/06/19 10:20
字数 634
阅读 122
收藏 0

    刚开始编程时,发现写递归函数还是有点难,搞不好就造成程序意外退出、卡死等尴尬处境。其实写好递归函数只要把握2点,就可以做到妈妈再也不用担心我的递归了。

怎样写递归

    1、递归函数中要有调用自己的地方(也就是说有继续递归的条件和递归处理)

    2、递归函数中要有结束自己的地方(也就是说有递归结束的条件和结束处理)

举例

    打印指定目录的文件结构(即有子目录,也要打印子目录下的文件)

    打印的目录格式如下:

---  home
------  MS
---------  Version
------------  S900
---------------  odbg.jpg
------------  S910
---------------  myweb.jpg
------  VER
---------  hello.txt

 Go语言代码如下:

package main

import (
	"fmt"
	"io/ioutil"
	"os"
)

func main() {
	var path string
	path = "G:\\home"

	err := PrintFilesInDir(path, "")
	if err != nil {
		fmt.Println("PrintFilesInDir:: err=", err.Error())
	}
}

func PrintFilesInDir(dirPath string, preSpace string) error {
	//文件名前面空格,便于标识文件层次
	preSpace = fmt.Sprintf("%s---", preSpace)

	//获取文件信息
	finf, err := os.Stat(dirPath)
	if err != nil {
		fmt.Println("PrintFilesInDir:: os.Stat err=", err.Error())
		return err
	}

	if finf.IsDir() { //如果是目录需要递归子文件
		//打印目录名
		fmt.Println(preSpace, "", finf.Name())
		//获取此目录子文件名
		finfs, err := ioutil.ReadDir(dirPath)
		if err != nil {
			fmt.Println("PrintFilesInDir:: ioutil.ReadDir err=", err.Error())
			return err
		}

		for _, v := range finfs {
			sonDir := fmt.Sprintf("%s\\%s", dirPath, v.Name())
			PrintFilesInDir(sonDir, preSpace)
		}

	} else { //如果不是目录,打印出此文件名,结束递归
		fmt.Println(preSpace, "", finf.Name())
		return nil
	}

	return nil
}

到此为止,主要内容就已经说完了,下面就是一些关于递归的讨论了......

 

递归的好处

(1)可以减少代码量。几行问题可以解决的没必要使用几十行来写
(2)处理逻辑清晰,便于理解

 

什么时候递归

(1) 子问题须与原始问题为同样的事,且更为简单;

(2)不能无限制地调用本身,须有个出口,化简为非递归状况处理。

其实就是一个问题中的同样的处理逻辑需要做很多次,而且处理逻辑中也有结束的处理。

 

递归的缺点

    运行效率较低、 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等

 

结语

    本文主要给大家介绍,怎么去写递归,不会造成程序异常(只要把握住继续递归和结束递归条件这两点就OK啦)。

© 著作权归作者所有

沙米笔记
粉丝 29
博文 43
码字总数 45024
作品 0
深圳
程序员
私信 提问
Java递归示例2:实现区域树

1、controller中的方法 3、总结: 数据库中区域信息的通过pid来维护父子节点的,但前台页面是通过children来维护父子节点的。该递归方法主要实现了将list中的pid转换为children。 4、之前的一...

ytangdigl
2017/11/29
0
0
用 JavaScript 的方式理解递归

原文地址 1. 递归是啥? 递归概念很简单,“自己调用自己”(下面以函数为例)。 在分析递归之前,需要了解下 JavaScript 中“压栈”() 概念。 2. 压栈与出栈 栈是什么?可以理解是在内存中...

hankzhuo
2018/10/26
0
0
【从蛋壳到满天飞】JS 数据结构解析和算法实现-链表与递归

前言 【从蛋壳到满天飞】JS 数据结构解析和算法实现,全部文章大概的内容如下: Arrays(数组)、Stacks(栈)、Queues(队列)、LinkedList(链表)、Recursion(递归思想)、BinarySearchTree(二分搜...

哎哟迪奥
2019/03/24
0
0
Y Combinator学习总结

最近看完The little schemer,第一次看到这种编排的书,一问一答的形式,不知不觉就翻完了整本。很自然的教会大家写递归,怎样写程序,一点点的CPS,还有Y combinator。个人觉得第九章推导Y...

rongtou
2016/09/27
89
0
怎样深层次理解递归??

比如有名的汉诺塔问题,就用到了递归,虽然会写,但是不能很清楚的了解到底是如何执行的,(就是进层退层……),然后就是,因为默认的堆栈是固定的,如何修改堆栈呢,也就是如果在汉诺塔问题...

恒水
2012/04/21
2.6K
2

没有更多内容

加载失败,请刷新页面

加载更多

关于docker0: iptables: No chain/target/match by that name的问题解决

由于Docker 0默认网桥的iptables策略冲突问题,将导致一些web server启动时出现如下错误: docker: Error response from daemon: driver failed programming external connectivity on endpo......

王焱君
今天
87
0
js 下载 canvas 兼容移动端

很蛋疼的问题PC上好好的, 移动端下载不了 , 貌似前端 js 生成的时 base64 格式的 图片数据,移动端无法直接下载, 但是chrome 移动端和pc端都没问题, 国产的几个浏览器全部挂了 之前的下载方式...

阿豪boy
昨天
76
0
微信小程序获取用户OpenId

1.在小程序中获得UserCode: wx.login({success: function (res) {thisApp.setData({userCode: res.code})}}) 2.在小程序中获得UserInfo: wx.getUserInfo({success...

kaition
昨天
54
0
代码生成器技术乱弹二十三,未来之野望,未实现的功能SQLTypes

在原先的Java类型系统的基础上新增SQL类型系统,有校验确保SQL类型系统兼容于Java类型系统。在生成数据库脚本时候使用SQL类型系统。

火箭船
昨天
48
0
Mybatis在插入自增字段时,会对当前对象未赋值的自增字段进行赋值

Mybatis在插入自增字段时,会对当前对象未赋值的自增字段进行赋值,如下即自动完成对id的赋值 OrderItem orderItem = new OrderItem(); System.out.println("==...

Gotcha_
昨天
42
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部