`
gaofen100
  • 浏览: 1189685 次
文章分类
社区版块
存档分类
最新评论

递归

 
阅读更多

递归算法采用了分而治之的思想,将复杂的问题分解为小的问题,并且这个小的问题的类型与原始问题的类型完全相同。通过分解,最终原始问题变得非常小,其解决方案显而易见,或为已知。那么对此类问题应怎样建立递归模型呢。

1,分析问题:确定问题能否分解为一个更小的问题,并且小的问题的类型和原始问题类型相同。确定该问题的循环不变式(loop invariant).

2,确定基例:当把问题分解的足够小时,即其最小问题的解决方案显而易见或者已知,即寻找到了此问题的基例。将基例作为解决问题的最小条件,由此条件而逐级回溯从而解决问题。
3,执行步骤:将一级小问题视为已知完全求解,则此原始问题的解决方案很容易确定,由此确定解决方案的执行步骤。
4,参数确定:递归函数的参数可分为四类:源因子,控制因子,接收因子和行为因子。具体问题具体分析,确定其需要的参数因子。
实例分析
hanoi塔
hanoi塔大家都已经熟知,在这里我就不多说了,直入正题。
初始状态时,所有的圆盘都在A上,目的是将A上的圆盘全部移到B上,那么将A上的n-1、n-2 个圆盘放在B上与将A上的所有的圆盘都放在B上类型相同,即可确定采用递归算法。当盘的数目为0或者为1时可确定达到基例,其无需进行操作或者将一个盘移到由A移到B上。将A盘上n-1个圆盘操作视为已完成的整体(即可一次性将其移到B或C盘)。完成原始问题的解决方案确定为,将A上n-1个圆盘移到C上,然后将A上的最后一个移到B上,然后再将C盘上的n-1个圆盘移到B上,则完成所有操作。
参数选择时把N作为源因子,‘A’ ‘B’ ‘C’作为表示操作的行为因子。则其函数表达式为:
查找数组最大项:
在数组Array中查找最大项,分解数组为两个部分,分别找出最大项然后进行比较,取最大值。当分解的数组只有一项时,则其最大值即为该唯一项,由此可确定基例。
将数组的两个部分分别视作已完成的整体(即分别取得两个部分的最大值),然后进行比较,取最大值返回。

参数选择时,把arr作为源因子,first last作为控制因子。则其函数表达式为:


折半查找法
在已排序的数组array中查找指定值,分解数组为两个部分,判断指定值位于哪个部分,然后再将指定值所在的部分数组进行分解。
当分解的数组中只含有一项时,达到基例或者只含有一项时并且与指定值不相等时为基例(因为这是一个返回值函数,当存在指定值时已经返回,不存在指定值可作为基例)。
将数组的两个部分分别视作已完成的整体(具有返回值,或找到或找不到),返回由判断可知的那部分数组。

参数选择,传递一个源因子,first last 作为控制因子,则其函数表达式为:



查找第k最小项:

这个我理解的不到位就不多说了。函数表达式为:


reference

《Data Abstraction and Problem Solving wiht c++ 》(Fourth Edition)


分享到:
评论

相关推荐

    c++递归c++递归c++递归

    c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘 n!c++ 递归 阶乘...

    C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法

    本文实例讲述了C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法。分享给大家供大家参考,具体如下: /*求二叉树叶子节点个数 -- 采用递归和非递归方法 经调试可运行源码及分析如下: ***/ #include #...

    n后问题---递归回溯法 n后问题---递归回溯法

    n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---递归回溯法 n后问题---...

    二叉树的操作--递归非递归遍历、结点个数、树深度

    遍历递归的先中後序, 非递归的先中後序, 计算出深度 结点数 /* 运行结果: ------------------------ 请先序输入二叉树(如:ab三个空格表示a为根节点,b为左子树的二叉树) ab c 先序递归遍历二叉树: a b c 先序...

    读懂C++递归程序

    递归在计算学科中是一种非常重要的方法,计算理论中到处都有用递归进行表述的问题及求解方法。 在程序设计中,数据描述和算法表达也常用递归,通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题...

    c语言 二叉树应用:创建、递归非递归遍历、计算结点、分支、交换子树

    递归先序遍历二叉树: 递归中序遍历二叉树: 递归后序遍历二叉树: 非递归先序遍历二叉树: 非递归中序遍历二叉树: 非递归后序遍历二叉树: 非递归中序遍历二叉树(算法2): 层次遍历二叉树: 递归计算单...

    递归和非递归解决迷宫问题

    (1)以链栈作为存储结构,编写一个求解迷宫的非递归程序,并将求得的通路以三元组(i,j,d)的形式输出,其中: i,j指示迷宫中的一个坐标,d表示走到下一坐标的方向; (2)编写递归形式的算法,求得迷宫中所有可能...

    代码 RQA对离散时间序列进行递归图分析

    代码 RQA对离散时间序列进行递归图分析代码 RQA对离散时间序列进行递归图分析代码 RQA对离散时间序列进行递归图分析代码 RQA对离散时间序列进行递归图分析代码 RQA对离散时间序列进行递归图分析代码 RQA对离散时间...

    编译原理——语法分析器(递归下降分析法 )

    递归下降分析法 一、实验目的: 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。 二、实验说明 1、递归下降分析法的功能 词法分析器...

    JavaScript的递归之递归与循环示例介绍

    递归与循环 对于不同类型的需要重复计算的问题,循环和递归两种方法各有所长,能给出更直观简单的方案。另一方面,循环和递归的方法可以互相转换。任何一个循环的代码都可以用递归改写,实现相同的功能;反之亦然。...

    宏递归宏递归宏递归宏递归

    宏递归宏递归宏递归宏递归宏递归宏递归宏递归宏递归宏递归宏递归

    C++二叉树非递归以及递归算法

    3.使用递归 先序遍历一棵二叉树 4.使用递归 中序遍历一棵二叉树 5.使用递归 后序遍历一棵二叉树 6.使用非递归 先序遍历一棵二叉树 7.使用非递归 中序遍历一棵二叉树 8.使用非递归 后序遍历一棵二叉树 PS:代码为C++...

    C#递归 C#递归 C#递归

    C#递归C#递归C#递归C#递归C#递归C#递归C#递归C#递归C#递归

    递归和非递归方式计算Ackerman函数

    递归和非递归方式计算Ackerman函数。非递归方法用堆栈实现。代码内部有详细的注释说明,比较适于学习。

    编译原理课设:属性计算-递归下降语法分析器

    参考例6.2构造一个翻译模式,并由此构造一个递归下降翻译器,把每个标识符的类型存入符号表。 功能拓展: 对于输入的一串执行语句,其中包括:赋值语句、选择语句和循环语句。设计递归下降翻译器,完成语法分析和...

    Python语言基础:递归函数.pptx

    递归函数的定义 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 递归函数的特点 递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但...

    C通过运行时堆栈支持递归函数的实现。递归函数就是直接或间接调用自身的函数。

    C通过运行时堆栈支持递归函数的实现。递归函数就是直接或间接调用自身的函数。 许多教科书都把计算机阶乘和菲波那契数列用来说明递归,非常不幸我们可爱的著名的老潭老师的《C语言程序设计》一书中就是从阶乘的计算...

    ackermann函数的递归实现和非递归实现

    ackman函数的递归和非递归,学习数据结构的素材,非递归是使用堆栈实现的。

    递归下降分析法 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。

    对下列文法,用递归下降分析法对任意输入的符号串进行分析: (1)E->eBaA (2)A->a|bAcB (3)B->dEd|aC (4)C->e|dc 输出的格式如下: (1)递归下降分析程序,编制人:姓名,学号,班级 (2)输入一以#结束的符号...

    c++合并排序算法递归与非递归方式

    c++实现的合并排序算法 用递归和非递归两种方式实现的

Global site tag (gtag.js) - Google Analytics