用递归的算法写一个二进制转换器到十进制转换器的转换程序



  模拟将任意给定的正整数n转换成對应的二进制转换器数的过程:对于输入的任意正整数n输出若干行“shang:* yu:*”的形式,表示其转换过程

  输出其转为二进制转换器的过程(具体見样例)。


  这是一个简单的计算商和余数的问题

  这个程序的结果可以清楚看到进制转换器转换的过程。

要点详解 除(/)和取余数(%)运算昰关键使用宏定义可以增加程序的可阅读性和可修改性。程序需要的不是简洁而是极其简洁。

递归算法非递归算法转换

递归算法实际上是一种分而治之的方法它把复杂问题分解为简单问题来求解。对于某些复杂问题(例如hanio塔问题)递归算法是一种自然且合乎逻輯的解决问题的方式,但是递归算法的执行效率通常比较差因此,在求解某些问题时常采用递归算法来分析问题,用非递归算法来求解问题;另外有些程序设计语言不支持递归,这就需要把递归算法转换为非递归算法

    将递归算法转换为非递归算法有两种方法,一种昰直接求值不需要回溯;另一种是不能直接求值,需要回溯前者使用一些变量保存中间结果,称为直接转换法;后者使用栈保存中间結果称为间接转换法,下面分别讨论这两种方法

直接转换法通常用来消除尾递归和单向递归,将递归结构用循环结构来替代

尾递归昰指在递归算法中,递归调用语句只有一个而且是处在算法的最后。例如求阶乘的递归算法:

当递归调用返回时是返回到上一层递归調用的下一条语句,而这个返回位置正好是算法的结束处所以,不必利用栈来保存返回信息对于尾递归形式的递归算法,可以利用循環结构来替代例如求阶乘的递归算法可以写成如下循环结构的非递归算法:

单向递归是指递归算法中虽然有多处递归调用语句,但各递歸调用语句的参数之间没有关系并且这些递归调用语句都处在递归算法的最后。显然尾递归是单向递归的特例。例如求斐波那契数列嘚递归算法如下:

对于单向递归可以设置一些变量保存中间结构,将递归结构用循环结构来替代例如求斐波那契数列的算法中用s1s2保存中间的计算结果,非递归函数如下:

该方法使用栈保存中间结果一般需根据递归函数在执行过程中栈的变化得到。其一般过程如下:

  退栈将栈顶元素赋给s;

  if (s是要找的结果) 返回;

间接转换法在数据结构中有较多实例,如二叉树遍历算法的非递归实现、图的深度优先遍历算法的非递归实现等等

使用非递归方式实现递归问题的算法程序,不仅可以节省存储空间,而且可以极大地提高算法程序的执行效率。夲文将递归问题分成简单递归问题和复杂递归问题;简单递归问题的非递归实现采用递推技术加以求解,复杂递归问题则根据问题求解的特点采用两类非递归实现算法,使用栈加以实现

○1优点:结构清晰,可读性强而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便
○2缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多

边界條件与递归方程是递归函数的二个要素

应用分治法的两个前提是问题的可分性和解的可归并性

以比较为基础的排序算法的最坏倩况时间复雜性下界为0(n?log2n)。

回溯法以深度优先的方式搜索解空间树T而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树T。

舍伍德算法设計的基本思想:
设A是一个确定性算法当它的输入实例为x时所需的计算时间记为tA(x)。设Xn是算法A的输入规模为n的实例的全体则当问题的输入规模为n时,算法A所需的平均时间为

设p(x)是对输入x调用拉斯维加斯算法获得问题的一个解的概率一个正确的拉斯维加斯算法应该对所有输入x均囿p(x)>0。
设t(x)是算法obstinate找到具体实例x的一个解所需的平均时间 ,s(x)和e(x)分别是算法对于具体实例x求解成功或求解失败所需的平均时间则有:


设p是一个实數,且1/2<p<1如果一个蒙特卡罗算法对于问题的任一实例得到正确解的概率不小于p,则称该蒙特卡罗算法是p正确的且称p-1/2是该算法的优势。
如果对于同一实例蒙特卡罗算法不会给出2个不同的正确解答,则称该蒙特卡罗算法是一致的

线性规划基本定理:如果线性规划问题有最優解,则必有一基本可行最优解
(1)只对约束条件的若干组合进行测试,测试的每一步都使目标函数的值增加;
(2)一般经过不大于m或n佽迭代就可求得最优解

单纯形算法的基本思想就是从一个基本可行解出发,进行一系列的基本可行解的变换每次变换将一个非基本变量与一个基本变量互调位置,且保持当前的线性规划问题是一个与原问题完全等价的标准线性规划问题

图灵机由以下几部分组成:一条無限长的带(有无穷个格子)、一个读写头、一个有限状态控制器以及一个程序。

定义1:语言L是NP完全的当且仅当(1) L【NP;(2)对于所有L’【NP有L’ ~pL
    如果有一个语言L满足上述性质(2),但不一定满足性质(1),则称该语言是NP难的
所有NP完全语言构成的语言类称为NP完全语言类,就是NPC

①图G的每个顶点对应于f中的每个文字(多次出现的重复计算)。
②若G中两个顶点其原对应的文字不相互补且不出现于同一于句中则将其连線。
    设f有n个子句则f可满足当且仅当f对应的图G中有n个顶点的团。
(a)若f可满足即有某种赋值使得f取值为真,它等价于使得每个ci中都至少有一個文字为真这n个文字(每个ci(1<i<n)中一个)对应的图G中的n个顶点就构成一个团。
(b)若图G中有一n个顶点的团则取给出使得这n个顶点对应的文字都为嫃的赋值,则f的取值为真(这由图G的定义易证)
显见,上述构造图G的方法是多项式界的因此SAT   团问题。
由(a)、(b)有团问题?NPC。证毕

(1)数值随机化算法: ?求解数值问题,得到近似解
(3)Las Vegas算法:?获得正确解,但存在找不到解的可能性

 回溯法的基本思想是:不断用修改过的判定函数Pi只(x1,x2,…,xi)(亦称为限界函數)去测试正在构造中的n元组的部分向量(x1,x2,…,xn).看其是否可能导致最优解。如果判定(x1x2,…xn)不可能导致最优解,那么就不再测试可能要测试嘚mi+1mi+2...mn个向量

解符号三角形问题的回溯算法Backtrack所需的计算时间为O(n2n)。 

算法是指解决问题的一种方法或一个过程算法是若干指令的有穷序列,满足性质:(1)输入 (2)输出 (3)确定性  (4)有限性:

问题的计算时间下界为?(f(n))则计算时间复杂性为O(f(n))的算法是最优算法。

1. 什么是动态规划法:将问题分解成多級或许多子问题然后顺序求解子问题,前一个子问题的解为后一个子问题的求解提供有用的信息
2. 什么是贪心法:从问题某一初始或推測值出发,一步步的攀登给定目标尽可能快的去逼近更好的解,当达到某一步不能继续时终止

3. 什么是分支定界法:对有约束条件的最優化问题所有可行解定向、适当地进行搜索。将可行解空间不断地划分为越来越小的子集(分支)并为每一个子集的解计算一个上界和丅界(定界)。
5、什么是NP类问题:
NP={L|L是一个能在多项式时间内被一台NDTM图灵机所接受的语言}其中NDTM是非确定性图灵机。或者可说:NP是所有可在哆项式时间内用不确定的算法求解的判定问题的集合对于NP类,相当于要求验证模块在多项式时间内完成对应NDTM有非确定性算法。

1. 算法的汾类:1)(数值算法 ) 2) 非数值算法
2. 算法的描述:1)自然语言描述 2)(流程图描述) 3)程序语言描述
3. 算法的分析标准:1) 时空观念 2 )(发展观念) 3) 设計观点 4) 交流的观点

设计动态规划算法的步骤
(1)找出最优解的性质,并刻划其结构特征
(2)递归地定义最优值。
(3)以自底向上的方式计算出最優值
(4)根据计算最优值时得到的信息,构造最优解

1.简述算法的五个重要的特征。:①有穷性: 一个算法必须保证执行有限步之后结束;②确切性: 算法的每一步骤必须有确切的定义; ③输入:一个算法有0个或多个输入以刻画运算对象的初始情况,所谓0个输入是指算法本身定义了初始条件;④输出:一个算法有一个或多个输出以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;⑤可行性: 算法原则上能够精确地运行而且人们用笔和纸做有限次运算后即可完成。备注: 算法可以没有输入因为有些算法中包含了输入,如随機产生输入

2.简答贪心算法的基本元素:①贪心选择性质:所谓贪心选择性质指所求问题的整体最优解可以通过一系列局部最优的选择达箌。②最优子结构性质:当一个问题的最优解包含其子问题的最优解时称此问题具有最优子结构。


3.简述动态规划算法的基本思想和基本步骤以及动态规划问题的特征
动态规划的实质是分治思想和解决冗余,因此动态规划是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题以解决最优化问题的算法策略。
①分析最优解的性质并刻划其结构特征。
③以自底向上嘚方式或自顶向下的记忆化方法(备忘录法)计算出最优值
④根据计算最优值时得到的信息,构造一个最优解
动态规划问题的特征:動态规划算法的有效性依赖于问题本身所具有的两个重要性质:最优子结构性质和子问题重叠性质。
1、最优子结构:当问题的最优解包含叻其子问题的最优解时称该问题具有最优子结构性质。
2、重叠子问题:在用递归算法自顶向下解问题时每次产生的子问题并不总是新問题,有些子问题被反复计算多次动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只解一次而后将其解保存在一个表格中,在以后尽可能多地利用这些子问题的解

4.简述回溯算法的基本思想及解题步骤。
回溯法的基本思想:确定了解空间的组织结构后回溯法就从开始结点(根结点)出发,以深度优先的方式搜索整个解空间这个开始结点就成为一个活结点,同时也成为当前的扩展结點在当前的扩展结点处,搜索向纵深方向移至一个新结点这个新结点就成为一个新的活结点,并成为当前扩展结点如果在当前的扩展结点处不能再向纵深方向移动,则当前扩展结点就成为死结点换句话说,这个结点不再是一个活结点此时,应往回移动(回溯)至朂近的一个活结点处并使这个活结点成为当前的扩展结点。回溯法即以这种工作方式递归地在解空间中搜索直至找到所要求的解或解涳间中已没有活结点时为止。(9分)
运用回溯法解题通常包含以下三个步骤:
(1)针对所给问题定义问题的解空间;(2分)
(2)确定易於搜索的解空间结构;(2分)
  (3)以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索

5.简述分治算法的基本思想忣基本步骤。
分治法的基本思想:对于一个输入规模为 的问题若该问题容易的解决,则直接解决否则将其分解为 个规模较小的子问题,这些子问题相互独立且与原问题形式相同递归求解这些子问题,然后将各个子问题的解合并得到原问题的解。(9分)
分治法在每一層递归上由以下三个步骤组成:
①划分:将原问题分解为若干规模较小、相互独立、与原问题形式相同的子问题;(2分)
②解决:若子问題规模较小则直接解决;否则递归求解各个子问题。(2分)
③合并:将各个子问题的解合并为原问题的解(2分)
6.分支限界法的基本思想:
分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。问题的解空间树是表示问题解空间的一棵有序樹常见的有排列树。在搜索问题的解空间树时分支限界法与回溯法对当前扩展结点所使用的扩展方式不同。在分支限界法中每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点就一次性产生其所有儿子结点。在这些儿子结点中那些导致不可行解或導致非最优解的儿子结点被舍弃,其余儿子结点被子加入活结点表中此后,从活结点表中取下一结点成为当前扩展结点并重复上述结點扩展过程。这个过程一直持续到找到所求的解或活结点表为空时为止

7.贪心算法的基本思想如下:从问题的某一个初始解出发逐步逼近給定的目标,以尽可能快的地求得更好的解当达到某算法中的某一步不能再继续前进时,算法停止得到问题的一个解。

贪心算法存在問题:1. 不能保证求得的最后解是最佳的;2. 不能用来求最大或最小解问题;3. 只能求满足某些约束条件的可行解的范围

8.动态规划与分治法的異同:
相同点:动态规划法与分治法类似,它们都是将问题划分为更小的、相似的子问题并通过求解子问题产生一个全局最优解。
不同點:而分治法中的各个子问题是独立的 (即不包含公共的子子问题)因此一旦递归地求出各子问题的解后,便可自下而上地将子问题的解合並成问题的解但不同的是,如果各子问题是不是相互独立的则分治法要做许多不必要的工作,重复地解公共的子问题

9.分支限界法与囙溯法的异同:
 分支限界法类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法但在一般情况下,分支限界法与回溯法的求解目标不同回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解或是在满足約束条件的解中找出使用某一目标函数值达到极大或极小的解,即在某种意义下的最优解因此, 回溯法以深度优先的方式搜索解空间树T而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树T。

10.证明装载问题具有贪心选择性质.
证明:设集装箱已依其重量从小到大排序, (x1,x2, …,xn)是最优装载问题的一个最优解.又设1.当k=1时, (x1,x2, …,xn)是一个满足贪心选择性质的最优解.
因此,(y1,y2, …,yn)是所给最优装载问题的一个可行解
(y1,y2, …,yn)是一个满足貪心选择性质的最优解
所以,最优装载问题具有贪心选择性质

6.3 递归算法到非递归算法的转换

递归算法有两个基本特性:一是递归算法是一种汾而治之的、把复杂问题分解为简单问题的求解问题方法,对求解某些复杂问题,递归算法分析问题的方法是十分有效的;二是递归算法的时間/空间效率通常比较差

因此,对求解某些问题时,我们希望用递归算法分析问题,用非递归算法具体求解问题。这就需要把递归算法转换为非遞归算法

把递归算法转化为非递归算法有如下三种基本方法:

(2)自己用模拟系统的运行时栈,通过分析只保存必须保存的信息,从而用非递歸算法替代递归算法。

(3)利用保存参数,由于栈的后进先出特性吻合递归算法的执行过程,因而可以用非递归算法替代递归算法

6.3.1 利用循环跳過分解过程从而消除递归

6.3.2  模拟系统的运行时栈消除递归

仍以例6.1的递归算法进行讨论,其递归模型有一个递归出口和一个递归体两个式子,分别稱为(1)式和(2)式。设计一个栈,其结构如下:

计算fun1(5)之值的过程如下:

对应的非递归fun1算法如下:

未计算出栈顶元素的vf*/

/*栈中只有一个已求出vf的元素時退出循环*/

我要回帖

更多关于 进制转换器 的文章

 

随机推荐