第二篇 递归思想

今天说说递归思想,在我们编码时,有的时候递归能够让我们的算法更加通俗易懂,并且代码量也是大大的减少。比如我先前的系列中说到了

关于树的“先序,中序和后序”遍历,那么看看用递归来描叙这个问题是多少的简洁,多么的轻松。

 1 #region 二叉树的先序遍历
 2          /// <summary>
 3  /// 二叉树的先序遍历
 4  /// </summary>
 5  /// <typeparam name="T"></typeparam>
 6  /// <param name="tree"></param>
 7          public void BinTree_DLR<T>(ChainTree<T> tree)
 8          {
 9              if (tree == null)
10                  return;
11
12              //先输出根元素
13              Console.Write(tree.data + "\t");
14
15              //然后遍历左子树
16              BinTree_DLR(tree.left);
17
18              //最后遍历右子树
19              BinTree_DLR(tree.right);
20          }
21          #endregion
22
23          #region 二叉树的中序遍历
24          /// <summary>
25  /// 二叉树的中序遍历
26  /// </summary>
27  /// <typeparam name="T"></typeparam>
28  /// <param name="tree"></param>
29          public void BinTree_LDR<T>(ChainTree<T> tree)
30          {
31              if (tree == null)
32                  return;
33
34              //优先遍历左子树
35              BinTree_LDR(tree.left);
36
37              //然后输出节点
38              Console.Write(tree.data + "\t");
39
40              //最后遍历右子树
41              BinTree_LDR(tree.right);
42          }
43          #endregion
44
45          #region 二叉树的后序遍历
46          /// <summary>
47  /// 二叉树的后序遍历
48  /// </summary>
49  /// <typeparam name="T"></typeparam>
50  /// <param name="tree"></param>
51          public void BinTree_LRD<T>(ChainTree<T> tree)
52          {
53              if (tree == null)
54                  return;
55
56              //优先遍历左子树
57              BinTree_LRD(tree.left);
58
59              //然后遍历右子树
60              BinTree_LRD(tree.right);
61
62              //最后输出节点元素
63              Console.Write(tree.data + "\t");
64          }
65          #endregion

看看,多么简洁明了。当然递归都是可以改成非递归的,但是就不见得简洁和通俗易懂了。

一: 概念

递归,说白了就是直接或者间接的调用自己的一种算法。它是把求解问题转化为规模较小的子问题,然后通过多次递归一直到可以得出结果

的最小解,然后通过最小解逐层向上返回调用,最终得到整个问题的解。总之递归可以概括为一句话就是:“能进则进,不进则退”。

二:三要素

<1>  递归中每次循环都必须使问题规模有所缩小。

<2>  递归操作的每两步都是有紧密的联系,如在“递归”的“归操作时”,前一次的输出就是后一次的输入。

<3>  当子问题的规模足够小时,必须能够直接求出该规模问题的解,其实也就是必须要有结束递归的条件。

三: 注意

<1>  前面也说了,递归必须要有一个递归出口。

<2>  深层次的递归会涉及到频繁进栈出栈和分配内存空间,所以运行效率比较低,当问题规模较大时,不推荐使用。

<3>  在递归过程中,每次调用中的参数,方法返回点,局部变量都是存放在堆栈中的,如果当问题规模非常大时,容易造成堆栈溢出。

时间: 2024-12-30 12:35:37

第二篇 递归思想的相关文章

算法之递归思想

树的遍历的实现就是典型的递归思想. /* * description:树的遍历示例,递归 * 访问顺序: * 前序: 当前节点 - 左子树 - 右子树 * 中序: 左子树 - 当前节点 - 右子树 * 后序: 左子树 - 右子树 - 当前节点 * * writeby: nick * date: 2012-10-22 23:56 */ #include <iostream> using namespace std; struct node { int item; node *l, *r; nod

Android开源项目第二篇——工具库篇

本文为那些不错的Android开源项目第二篇——开发工具库篇,主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多媒体相关及其他. Android开源项目系列汇总已完成,包括: Android开源项目第一篇——个性化控件(View)篇 Android开源项目第二篇——工具库篇 Android开源项目第三篇——优秀项目篇 Android开源项目第四篇——开发及测试工具篇 Android开源项目第五篇——优秀个人和

Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界

这篇我要给大家介绍两个知识点: 1. 创建游戏物理世界 2. 没了(小若:我噗) 害怕了?不用担心,这太简单了~! 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址:http://www.benmutou.com/blog/archives/804 文章来源:笨木头与游戏开发 3.0新亮点,史上最简单的物理引擎 在Cocos2d-x3.0里使用物理引擎,会很有快感,因为很多繁琐的东西它都帮我们封装好了. 那么,我要开始创建游戏的关卡场景了,大家跟紧了. 我们给关卡场景命名为Toll

java学习笔记 第二篇 核心技术(二)

第十四章 集合类 集合类用来存放对象的引用.继承关系如下图: 14.1 Collection 接口 是层次结构中的根接口,构成Collection的单位称为元素.Collection接口不能直接使用,但该接口提供了添加元素.删除元素.管理数据的方法. Collection接口常用方法: 14.2 List 集合 包括List接口以及List集合的所有实现类.List集合中的元素允许重复,各元素循序就是对象插入的顺序 1.List接口,两个重要方法: get(int index): 获取指定索引位

c#开发Mongo笔记第二篇

写到第二篇不得不说是我之前犯了一个小错误,其实实现子表存储也是很简单的事,先说我想实现什么样的效果吧 就是用户表里有个成绩字段,成绩字段是个子表 其实实现这个功能也很简单,用面向对象的思想很好理解,子表就是user表的一个对象字段或者集合字段,所以我觉得用c#开发Mongo用面向对象的思想开发更合适一些 public class User { public ObjectId Id { get; set; } public string Name { get; set; } public stri

读书笔记:《如何阅读一本书》(暂定第一篇、第二篇)

我阅读这本书的最初动力: 我希望能够通过这本书得到正确的阅读方法,让我在阅读书籍的时候,能够真正的吸收进去,而不是表面的看完.系统的进行学习方法论并且能够亲身实践的方法论. 背景: 作者认为当下的人们,只通过了最基础的阅读训练,但是实际上对于一些严谨或者说需要严密思考的章节的阅读能力是不足的.所以出了这本书,让人们了解如何阅读一本书,分了四个章节:首先讲解了阅读的艺术,以及阅读的层级,基础阅读以及检视阅读的层次如何做到,还有什么样的阅读者才能够真正的阅读进去.接着讲解了最重要的一种阅读方式,分析

ansible系列第二篇(模块使用)

ansible系列第二篇(模块使用) 模块使用 设置ansible提权 在hosts文件加入sudo提权的密码: 18.18.23.102 ansible_become_pass='passwd' 执行: ansible test -S -R root -m shell -a "ls -l /" 查看ansible有那些模块: ansible-doc -l 获取各个模块详细帮助信息 ansible-doc -s ping ping模块: ansible test -m ping 从受控

并发编程之J.U.C的第二篇

并发编程之J.U.C的第二篇 3.2 StampedLock 4. Semaphore Semaphore原理 5. CountdownLatch 6. CyclicBarrier 7.线程安全集合类概述 8. ConcurrentHashMap 3. JDK7 ConcurrentHashMap 3. 性能比较 10. ConcurrentLinkedQueue 11. CopyOnWriteArrayList 3.2 StampedLock 该类自JDK8加入,是为了进一步优化读性能,它的特

Java并发包下锁学习第二篇Java并发基础框架-队列同步器介绍

Java并发包下锁学习第二篇队列同步器 还记得在第一篇文章中,讲到的locks包下的类结果图吗?如下图: ? 从图中,我们可以看到AbstractQueuedSynchronizer这个类很重要(在本文中,凯哥就用AQS来代替这个类).我们先来了解这个类.对这个类了解之后,学习后面的会更容易了. 本篇是<凯哥(凯哥Java:kagejava)并发编程学习>系列之<Lock系列>教程的第一篇:<Java并发包下锁学习第二篇:队列同步器>. 本文主要内容:同步器介绍:同步器