《数据结构与算法分析》递归简论

1、当一个函数用它自己来定义时就称为递归的。C允许函数是递归的。但重要的是:C提供的仅仅是遵循递归思想的一种企图。不是所有的数学递归函数都能有效地(或正确地)由C的递归模拟来实现。

int Bad(unsigned int N)
{
    if (N == 0)
    {
        return 0;
    }
    else
    {
        return Bad(N / 3 + 1) + N - 1;
    }
}

在以上例子中,计算机将会反复调用Bad(1)以期解出它的值。最后计算机薄记系统将占满空间,程序崩溃。

注意:实际上,递归调用在处理上与其他的调用没有什么不同。跟踪挂起的函数调用(这些调用已经开始但是正等待着递归调用来完成)以及它们中变量的记录工作都是由计算机自动完成的。

2、递归的四条基本法则。

(1)基准情形。

你必须总要有某些基准的情形,它们不用递归就能求解。

(2)不断推进。

对于那些需要递归求解的情形,递归调用必须总能够朝着产生基准情形的方向推进。

(3)设计法则。

假设所有的递归调用都能运行。这是一条重要法则,因为它意味着,当设计递归程序时一般没有必要知道开销管理的细节,不必视图追踪大量的递归调用,计算机能够算出复杂的细节。

(4)合成效益法则。

在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性工作。

例如:使用递归来计算诸如斐波那契数列之类简单数学函数的值的想法一般来说不是一个好主意。

时间: 2024-10-31 18:58:29

《数据结构与算法分析》递归简论的相关文章

《数据结构与算法分析》学习笔记(二)——算法分析

一.对算法分析方法的最简单的理解和使用方法 1.首先大家可能一般会被那些数学的概念搞晕,其实简单理解下来,就是假设任何语句执行的效率都是一样的,所以设定每一个语句的执行时间都是一个时间单位,那么只要计算这个程序到底执行了多少语句,就可以算出其时间复杂度. 2.其次就是我们要明白,我们是个估算,所以可以进行化简,明显我们可以忽略那些相对来说低阶的项,只分洗最高阶项.然后主要就是有这些常见的法则: (1)FOR循环 一次for循环的运行时间至多是该for循环内语句的运行时间乘以迭代次数. (2)嵌套

《数据结构与算法分析—C语言描述》pdf

下载地址:网盘下载 内容简介 编辑 <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行时间分析的基础上考查了一些高级数据结构,从历史的角度和近年的进展对数据结构的活跃领域进行了简要的概括.由于<数据结构与算法分析:C语言描述(原书第2版)>选材新颖,方法实用,题例丰富,取舍得当.<数据结构与算法分析:C语言描述(原书第2版)>的目的是培养学生良好的程序设计技巧和熟练的算

《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——Alpha-Beta剪枝

2014.07.08 22:43 简介: “搜索”与“剪枝”几乎是如影随形的.此处的“搜索”指的是带有回溯算法的深度优先搜索. 在之前的“Minimax策略”中我们给出了一个三连棋的程序,运行后你就知道计算一步棋要花多少时间. 为了计算最优的一步棋,我们可能需要递归9万多次.如果毫无疑问这种阶乘式的穷举过程必须通过剪枝来加速. 本篇介绍一种用于Minimax策略的剪枝思路——α-β剪枝. 剪枝的英语是pruning,所以不要想当然说成trimming. 图示: 在上一篇讲解Minimax策略的博

数据结构与算法分析-排序

作者:xiabodan 出处:http://blog.csdn.net/xiabodan 排序算法(Sorting Algorithm)是计算机算法的一个组成部分.也是程序=算法+数据结构中的一部分(算法). 实验平台:raspberry 2 B + Ubuntu Mate 插入排序 外循环i由1到N-1,内循环由j由i到1,每次内循环都将A[j]插入到序列A[0]-A[i]的正确位置,这样就保证了每次外循环之后序列A[0]-A[i]都是已经排好序的,外循环不过将自己插入在A[0]-A[i]之间

数据结构与算法分析(4)算法分析的编程练习

    数据结构和算法分析的编程习题.     (1)生成不重复的随机数,并且具有上界和下界.可以产生有序的,也可以产生无序的. 知识: C编程语言不允许返回整个数组作为函数的参数.但是,您也可以返回一个指针,没有索引到一个数组中指定数组的名称. 例如: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 5 int *getRandom(){ 6 static int r[10]; 7 int i

&lt;数据结构与算法分析 C++描述&gt;算法分析之最大子序列和问题

声明:这个系列博客是<数据结构与算法分析 C++描述>的读书笔记系列 参考博客:点击打开链接 本文是原书第二章内容,主要内容包括:算法的时间复杂度分析/算法的优化,分析的例子是很出名的最大子序列求和问题. 分为了四种方法来求解:穷举/穷举优化/递归(分治)/联机算法(动态规划), 算法复杂度为O(N^3)/O(N^2)/O(N*logN)/O(N). 思路都在具体代码里 ----------------------------------------代码如下------------------

数据结构与算法分析 - 7 - 图

1.图的相关概念 图:G = (V,E),集合V中的元素被称为顶点,集合E中的元素是集合V中的某一对顶点(u,v)之间的边. 约定集合V和集合E均为有限集,其规模分别记为n = | V |,e = | E |. 边:顶点之间存在的某种关系就是边.可分为有向边和无向边.若边(u,v)中的顶点u和v的次序无所谓,即(u,v) = (v,u),边(u,v)即为无向边,反之即为有向边. 有向图和无向图:当一个图中的所有边都是无向边时,该图为无向图.而只要一个图中存在有向边,该图就是有向图. 度:与某顶点

学习记录:数据结构与算法分析c++版

数据结构与算法分析c++版 学习记录 一.绪论 1.数据结构的必要性 计算机程序被设计出来的目的不仅仅是为了计算,同时其也要完成数据的提取和检索任务,并尽可能地高效快速.在这个意义下,数据结构和算法分析作为程序的核心,就显得尤为重要.如何利用数据结构和算法,设计出简单易懂,并且高效地利用计算机资源的程序是这门课的核心议题. Def    一个算法被称为有效的(effective),如果其能在计算机的资源限制下解决相应问题:这些限制通常包括计算机储存量限制,以及算法运行的时间限制.    算法的消

数据结构1:数据结构和算法分析

问题引出 假设有一道题目:有一组N个数而要确定其中第k个最大者,我们称之为选择问题,那么这个程序如何编写?最直观地,至少有两种思路: 1.将N个数读入一个数组中,再通过某种简单的算法,比如冒泡排序法,以递减顺序将数组排序,则第k个位置上的元素就是我们需要的元素 2.稍微好一些的做法,将k个元素读入数组并以递减顺序排序,接着将接下来的元素再逐个读入,当新元素被读到时,如果它小于数组中的第k个元素则忽略之,否则将其放到数组中正确的位置上,同时将数组中的一个元素挤出数组,当算法终止时,位于第k个位置上

《数据结构与算法分析:C语言描述》复习——第四章“树”——AVL树

2014.06.15 16:22 简介: AVL树是一种高度平衡的二叉搜索树,其命名源自于联合发明算法的三位科学家的名字的首字母.此处“平衡”的定义是:任意节点的左右子树的高度相差不超过1.有了这个平衡的性质,使得AVL树的高度H总是接近log(N),因此各种增删改查的操作的复杂度能够保证在对数级别.没有bad case是AVL树与普通的二叉搜索树的最大区别.为了实现平衡性质,我们需要记录每个节点的高度(或者平衡因子)来检测不平衡的情况.为了修正高度不平衡,需要用到“旋转”的方法,分为单旋转和双