- 9
- 0
- 约 59页
- 2016-08-01 发布于湖北
- 举报
数据结构与算法-第十章Algorithmdesigntechniques 武汉理工大学
10.3.3 递归算法到非递归算法的转换 递归算法有两个基本特性: 一是递归算法是一种分而治之的、把复杂问题分解为简单问题的求解问题方法,对求解某些复杂问题,递归算法分析问题的方法是十分有效的; 二是递归算法的时间效率通常比较差。 因此,对求解某些问题时,我们希望用递归算法分析问题,用非递归算法具体求解问题。 这就需要把递归算法转换为非递归算法。 把递归算法转化为非递归算法有如下三种基本方法: (1)对于尾递归和单向递归的算法,可用循环结构的算法替代。 (2)自己用栈模拟系统的运行时栈,通过分析只保存必须保存的信息,从而用非递归算法替代递归算法。 (3)利用栈保存参数,由于栈的后进先出特性吻合递归算法的执行过程,因而可以用非递归算法替代递归算法。 (见教材) 10.4 逐步求精(Stepwise Refinement) 简单地讲,逐步求精方法,是一种逐步“划分”的方法,即将问题的解决,先用几个大/粗的模块的组合表示。对这些模块,先不考虑它们的内部实现,只规定其功能。然后再按类似方法继续划分这些模块,直到它们都变为程序设计语句。在这种划分中,应遵循下列规则: 保证模块的粒度应逐步变小。粒度越大/粗,“说明性”越强,越远离程序设计语言,但越容易给出(设计); 保证当前正确。对每次划分,若假定各模块都可正确实现,则它们的当前组合(即划分方式)是整个问题的正确实现; 对逐步求精的描述,一般采用“伪码”。所谓伪码,是指不完全的程序代码,它一般以程序设计语言(典型的是C/Pascal之类的结构化程序设计语言)的流程控制语句(如while, for, if等)为主体,夹杂自然语言的描述。 [例] 求矩阵的鞍点 考虑求矩阵鞍点的问题。所谓矩阵鞍点,是指满足这样条件的矩阵元素:它是所在行上的最小元素,同时是所在列上的最大元素。可以证明,一个矩阵可以有多个鞍点,但它们的值均相等。 显然,求鞍点的一个直接的方法是,检查矩阵中每个元素是否为鞍点,用伪码描述为(设矩阵名为a,有n行m列,元素下标从0起): for (i=0; in; i++) for (j=0; jm; j++) { 判断a[i][j]是否为鞍点; if (a[i][j] 是鞍点) 输出a[i][j]; } [例] 求矩阵的鞍点(续1) 这里,关键问题是判断a[i][j]是否为鞍点,所以关键是细化模块“判断a[i][j]是否为鞍点”。解决该问题,先检查a[i][j]是否为i行上的最小者,若是,则继续检查其是否为j列上最大者,若是,则为鞍点。其他情况都不是鞍点。该过程的伪码描述为: isSaddle = 0; 检查a[i][j]是否为i行上最小者; if (是) { 检查a[i][j]是否为j列上最大者; if (是) isSaddle = 1; } [例] 求矩阵的鞍点(续2) 这段程序结束后,isSaddle为非0时表示a[i][j]为鞍点,否则不是鞍点。在这里,有两个模块需要细化: a) 检查a[i][j]是否为i行上最小者,这可以先找出i行上最小者的下标,然后与a[i][j]比较即可: kk=0; for (k=1; km; k++) if (a[i][k] a[i][kk] ) kk=k; if (a[i][kk]==a[i][j]) a[i][j]为i行上最小者; [例] 求矩阵的鞍点(续3) b) 检查a[i][j]是否为j列上最大者: kk=0; for (k=1; km; k++) if (a[k][j] a[kk][j] ) kk=k; if (a[kk][j]==a[i][j]) a[i][j]为j列上最大者; 10.5 分治法(Divide and Conquer) 分治是指“分而治之”(Divide and conquer),是把一个规模为n的问题分成两个或多个较小的与原问题类型相同的子问题,通过对子问题的求解,并把子问题的解合并起来从而构造出整个问题的解,即对问题分而治之。 如果子问题的规模仍然相当大,还不足以很容易地求得它的解,这时可以对此子问题重复地应用分治策略。 10.5 分治法(Divide and Conquer) 分治法求解过程,分为3个阶段: 划分。规模为n的原问题划分为k(k=1)规模较小子问题。 求解子问题。各子问题与原问题解法相同,可用递归方法求解各个子问题。子问题足够小时,直接求解。 合并。把各个子问题的解合并起来。 分治法的算法框架 return_type d_and_c( objArray * p , int i , int j )
您可能关注的文档
最近下载
- 临沂大学 2018—2019 学年第一学期2018级《高等数学I》(上)-本科试题B附参考答案.docx VIP
- 关于加强过程安全绩效指标(KPI)考核的通知.doc VIP
- 基孔肯雅热培训考试试题.docx VIP
- 2025-2026学年人教版(新教材)小学数学二年级下册(全册)教学设计(附教材目录P161).docx
- 单相智能电表设计方案.ppt VIP
- 5S管理推行手册.ppt VIP
- 福州市鼓楼区数学六年级上学期数学期末检测卷(一).doc VIP
- 基于PLC的地铁自动门控制系统设计.doc
- I期药物临床试验简介.pptx VIP
- 2025年新人教版七年级下册地理全册知识点复习资料-(精编版).docx VIP
原创力文档

文档评论(0)