算法设计分质递归c语言,浅述C语言递归算法.doc

浅述C语言递归算法

浅述C语言递归算法

摘要:递归算法,结构清晰,形式简单,符合人的思维习惯,容易被理解和阅读,因而成为计算机程序设计中的一种重要方法,掌握它也有助于理解其他算法。该文阐述了递归算法的基本概念,成立的三个条件,直接和间接递归分类,通过实例深入分析递归在数据结构、函数应用和执行过程中的应用,以及将递归转化为非递归的一般方法。

关键词:递归;算法;消除;程序;应用

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2012)30-7229-06

1 递归概念

1.1 概述

本文阐述了递归算法的基本定义、成立的必要条件和递归执行的特点以及在实例中的具体应用,让学生能理解“递归是一种思想”这个概念。

在生活实际中,有些问题是不能用数学公式解决的,需要通过其他方式、其他算法才能完成,其他重要算法有分治法、回朔法和动态规划等。分治法的三个步骤为:①分解:将当前区间一分为二,求分裂点;②求解:递归地对两个子区间进行归并排序;③组合:将已排序的两个子区间归并为一个有序的区间。其递归的终结条件:子区间长度为1(一个记录自然有序)。 回朔法的三个步骤:①搜索策略:符合递归算法,问题解决可以化为子问题,其子问题算法和原问题相同,只是数据增大或减少;②控制策略:避免不必要的穷举搜索,遇到搜索失败,从失败点返回到上一点重新搜索;③数据结构:用数组保存搜索过程中的状态、路径。可见,其他算法依然以递归算法为基础,利用递归帮助解决问题。

1.2 概念和成立条件

递归是设计和描述算法的一种有力的工具,它在复杂算法的描述中被经常采用

1.2.1 概念

一个函数、过程、概念或数学结构,如果在其定义或说明内部直接地或间接地出现有其本身的引用,或者是为了描述问题的某一状态,必须用到它的上一状态,而描述上一状态,又必须用到它的上一状态………这种用自己定义自己的方法,称之为递归或者是递归定义。

1.2.2 成立条件

应满足三点:①符合递归的描述:需要解决的问题可以化为子问题求解,而子问题求解的方法与原问题相同,只是数量增大或减少;②递归调用的次数是有限的;③必须有递归结束的条件。

1.3 递归分类

1.3.1 直接递归

程序设计中,过程或函数直接或者间接调用自己,就被称为递归调用。子程序直接调用自己,这称为直接递归;嵌套关系的子程序A和B,内层的B调用外层的A,这是间接低归;平级关系的子程序A和B,其中A调用了B,B调用了A,这也是间接递归,不过,这种间接递归用到了“超前引用”的规则。

2 递归本质

2.1 函数递归调用机制

递归函数调用同样遵守函数调用机制,当函数调用自己时也要将函数状态、返回地址、函数参数、局部变量压入栈中进行保存。

实际上函数被调用时执行的代码是函数的一个副本,与调用函数的代码无关。当一个函数被调用两次,则函数就会有两个副本在内存中运行,每个副本都有自己的栈空间且与调用函数的栈空间不同,因此不会相互影响。这种调用机制决定了函数是可以递归调用的。

2.2 递归调用优缺点

递归使一些复杂的问题处理起来简单明了,尤其在学习算法设计、数据结构时更能体会到这一点。但是,递归在每一次执行时都要为局部变量、返回地址分配栈空间(对方法的每次递归调用都会生成新的局部变量和局部参数。假如递归层次太多的话,就会消耗太多的stack),这就降低了运行效率,也限制了递归的深度。因此,在必要的时候可以只使用递归的思想来求解,而程序则转用非递归的方式书写。

3 递归的应用

3.1 递归定义的数据结构

3.1.1 二叉树(定义)

二叉树的递归定义 二叉树或者是一棵空树,或者是一棵由一个根结点和两棵互不相交的左子树和右子树所组成的非空树,左子树和右子树又同样都是二叉树。

下面介绍二叉树的二叉链式存储结构。我们先给出二叉链表链结点类型描述:

tnode为链表结点类型名,tlink为指向链结点的指针类型,elemtp为结点数据的类型.

那么如何根据输入的数据建立二叉链表呢?设二叉树结点数据类型为字符型,各结点数据按照二叉树的数组表示方式存储在字符串str中,字符串变量为s;string、整型变量为n;integer及指针为root;tlink,它们已经在外部说明,则二叉链表的建立过程可表示为procedure build(str;string);其功能为根据字符串str的内容建立二叉树的二叉链表,并让root指向这个二叉链表。其处理过程为:以1为参数调用递归子函数function build0(i;integer):tilink完成二叉链表的建立,并让root指向该链表。递归子函数function build0(i;integer):tilink的功能为

你可能感兴趣的:(算法设计分质递归c语言)