常用算法及策略(递归)
递归是计算机科学的一个重要概念,递归的方法是程序设计中 有效的方法,采用递归编写程序能是程序变得简洁和清晰.
一、 什么是递归
1.概念 一个过程(或函数)直接或间接调用自己本身,这种过程(或函数) 叫递归过程(或函数). 如,数学上所有的正偶数的集合可递归定义为: (1)0是一个偶数; (2)一个偶数和2的和是一个偶数。
分析: 1、将A柱中位于上面的几个圆盘视作整体,暂将它们移动B柱上; 2、将A柱剩下的那个最大圆盘移到C柱; 3、将B柱那几个圆盘视作整体移到C柱。
如下图:n=3 移动:A—C A—B
C—B A—C B—A B—C A—C
A
B
C
算法分析:
移塔的过程:MoveTower(N,A,C,B); MoveTower(N-1,A,B,C); (0,1,2,3) 分解: 和把一个圆盘从A柱移到C柱。 MoveTower(N-1, B, C, A); (1,1,3,2) 1—3 (0,2,3,1) (2,1,2,3) 1—2 (0,2,3,1) n=3 3—2 (1,2,3,1) (0,1,2,3) (3,1,3,2) 1—3 (0,2,3,1) (1,2,1,3) 2—1 (0,3,1,2) (2,2,3,1) 2—3 (0,2,3,1) (1,1,3,2) 1—3 (0,2,3,1)
begin writeln('inter'); continue:='Y'; while continue='Y' do begin i:=0; write('number:'); readln(n); writeln('moving:'); move(n,1,3,2); writeln; write('continue?---'); readln(continue); continue:=upcase(continue) end; writeln('ok,good bye'); end.
1、过程首部,过程名为try,其首部形式入下 procedure try(I:integer;var q:boolean); I为所放置下一个皇后的行号,亦表示是第几个皇后; q为放置成功的标志。
2、为选择下一个皇后的位置,设置初始状态:每次均从第1列 开始探索,j代表列号,即j:=0;
3、选择下一位置,即下一列:j:=j+1; q:=false;前假设为不成功。
program ex5_15; var n:1..64; continue:char; i:integer; procedure dise(fd,td:integer) ; begin i:=i+1; writeln(fd:2,'---->',td:2,' '); if i mod 10 =0 then writeln end; procedure move(n,a,c,b:integer); begin if n>0 then begin move(n-1 ,a,b,c); dise(a,c); move(n-1,b,c,a); end;
[例5-16]把一个十进制整数转化为k进制(k<=10) 根据进制转化的规则,把一个十进制整转化为k进制数,只要 用k依次去除这个数及其商,所得的余数依次作为k进制数相继 的低位数字。依此,直至商为0为止。最后的余数作为k进制数 的最高位数字。 算法如下:
(1)digit:=number mod k; (2)number:=number div k; (3)判number是否为0; (4)如果number不为0,则调用tentok(number,ok); (5)否则输出digit。
递归过程只描述递归关系和终止条件(就象递归算法自身的描述), 具体的执行过程并不明显指出,它被隐含在系统对递归的处理中。
〔例5-15〕汉诺(Hanoi)塔问题。 设有n个大小不等的中空圆盘,按照从小到大的顺序叠套在 立柱A上。另有两根立柱B和C,问题要求把全部圆盘从A柱(源柱 移到C(目标柱),移到过程中可借助B助(中间柱)。 移动有如下要求: (1)一次只移动一个盘; (2)不允许把大盘放在小盘上边; (3)可使用任意一根力柱暂存圆盘。
program p32; 写出下列程序的运行结果: var a,b:array[1..32] of integer; I:integer; Begin Procedure ssort(I,j:integer); For I:=1 to 16 do a[i]:=I; Var m,k,x:integer; Ssort(1,16); Begin For I:=1 to 16 do write(a[i]:3); If j-I>1 then Writeln; Begin Readln; M:=( I+j ) div 2; End. Ssort( I,m ) ; Ssort( m+1,j ); K:=I; 1 9 5 13 3 11 7 15 2 10 6 14 4 12 8 16 For x:=I to m do Begin B[k]:=a[x]; B[k+1]:=a[m+x-I+1]; K:=k+2; End; For x:=I to j do A[x]:=b[x]; End; End;
5 若限定第一个皇后 必须放在第1行上, 6 则仅需判定所放置的 7 诸皇后是否在同一列 8
已经对角线位置上.
编写试放置下一个皇后的递归过程:
Procedure 试放置下一个皇后;{带参过程} begin 为选择下一个皇后的位置设置初始状态; repeat 选择下一个位置,即下一列; if 可接受 then begin 放置皇后; if 未放置完8个皇后 then begin 试放置一个皇后;{递归调用,但参数不同} if 放置不成功 then 移去皇后 end else 置放置成功标志; end; until (放置成功) or (位置试完); end;
可接受的条件:a[j] and b[I+j] and c[I-j]
5、放置皇后:若定义一整型数组x var x:array[1..8] of integer; 以x[1]表示第1行上的皇后所在位置,即x中存放解的布局。 放置皇后可表示:x[i]:=j; a[j]:=false; b[I+j]:=false; c[I-j]:=false; 6、未放置完8个皇后:I<8; 7、试放置一个皇后:try(I+1,q); 8、放置不成功: not q; 9、移去皇后:a[j]:=true;b[I+j]:=true;c[I-j]:=true;
4、可接受,说明若在第i和第j列放置皇后,则在第j列上没有 皇后,与i行j列交叉的也没有皇后。 a:array[1..8]of boolean; {第j列上无皇后标志} b:array[b1..b2]of boolean;{从右上到左下对角线无皇后标志} c:array[c1..c2]of boolean;{从左上到右下对角线无皇后标志} 右上到左下满足:行坐标+列坐标=i+j;(常数) 左上到右下满足:行坐标+列坐标=i-j;(常数)
对于不要求大量试探的问题,采用回溯法比较适宜而且效率较高。
〔例5-18〕求解八皇后问题。 把八个皇后摆在8*8国际象棋盘格子内,使它们互不捕获对方。 即在任何一行、一列或一条对角线上,仅能放置一个皇后。 八皇后问题有解, 1 2 3 4 5 6 7 8 并且解不唯一. 1 共有92组不同的解. 如右是一组解. 2 八个皇后中的每一个 3 皇后必定位于不同的 4 行和不同的列上.
二、探索策略和回溯算法 递归技术的一个重要应用是在人工智能领域中用递归形式来 表示探索策略或者说控制策略的回溯算法过程。
回溯过程是一种控制策略可以试探的方法,按照一定的规则, 不断试探,不断纠错,直到找到问题的解,或确信不存在为止。
为求解一个特定问题,一般应执行如下三个步骤: (1)定义问题,包括待解问题的初始状态及目标状态; (2)分析问题,寻找对求解问题能起重要作用的一些特征; (3)选择合适技术去求解问题。
应用递归算法求解问题有两个特点: (1)存在某个特定条件,在这个特定条件下,可得到指定的解, 即递归存在终止状态;
(2)对任意给定的条件,有明确的定义规则,可以产生新的状态, 并将最终导出终止状态,即存在导致问题求解的递归步骤。
二、递归过程和函数 递归过程和一般过程的设计不同:
一般过程明确提出要计算机每步怎样去做;
Байду номын сангаас
10、放置成功标志:q:=true; 11、放置成功 or 位置试完:q or (j=8)
相关练习:
• • • • • • • 用递归的方法完成下列问题 1.求数组中的最大数 2.1+2+3+...+n 3.求n个整数的积 4.求n个整数的平均值 5.求n个自然数的最大公约数与最小公倍数 6.有一对雌雄兔,每两个月就繁殖雌雄各一对兔 子.问n个月后共有多少对兔子?7.已知:数列 1,1,2,4,7,13,24,44,...求数列的第 n项.
〔例5-14〕已知正整数n,n的阶乘定义如下: 1 若n=0 N!= Number=6 n*(n-1)! 若n>0 Program ex5_14; 0 f(6) Var number,fact:longint; 1 6*f(5) Function f(n:integer):longint; 2 5*f(4) Begin 4*f(3) if n<0 then writeln(‘input error!’) 3 4 3*f(2) else if n=0 then f:=1 5 2*f(1) else f:=n*f(n-1); 6 1*f(0) End; Begin write(‘input n:’); readln(number); fact:=f(number); wtieln(fact); readln; End.
心理学-思维与创造性(三)-2_真题(含答案与解析)-交互
心理学-思维与创造性(三)-2(总分100, 做题时间90分钟)一、单选题1.人们在解决问题时,通过增加初始状态与目标状态的差异以最终达到解决问题的目的,这种解决问题的方法是______SSS_SINGLE_SELA 启发式B 手段—目的分析法C 爬山法D 算法式分值: 1答案:C[解析] 经过评价当前的问题状态后,限于条件,不是去缩小,而是去增加这一状态与目标状态的差异,经过迂回前进,最终达到解决问题的总目标,这种解决方法称为爬山法。
答案为C。
2.在问题解决过程中,采取从目标状态出发,按照子目标组成的逻辑顺序逐级向初始状态递归的策略,称作______SSS_SINGLE_SELA 逆向工作法B 爬山法C 手段—目的分析法D 算法式分值: 1答案:A[解析] 本题是识记能力概念的考查。
这种策略是从目标状态出发,按照子目标组成的逻辑顺序逐级向初始状态递归的策略,称为逆向工作法。
答案为A。
3.在认知心理学中,表征是指______SSS_SINGLE_SELA 客观事物在头脑中的呈现方式B 客观事物的表面特征C 形象代码D 语义代码分值: 1答案:A[解析] 本题是识记能力概念的考查。
表征指客观事物在头脑中的呈现方式。
同一事物或问题由于表征的方式不同,在理解上会出现很大差异。
答案为A。
4.人脑对已有表象进行加工改造,形成新形象的过程称为______SSS_SINGLE_SELA 综合B 想像C 抽象D 联想分值: 1答案:B[解析] 想像是对头脑中已有的表象进行加工改造,形成新形象的心理过程。
答案为B。
5.思维敏捷、反应迅速、对于特定问题情景能够顺利做出多种反应或答案,这种创造性思维的特性是______SSS_SINGLE_SELA 独特性B 流畅性C 灵活性D 洞察性分值: 1答案:B[解析] 创造性思维的特征有:(1)敏感性;(2)流畅性;(3)灵活性;(4)独创性;(5)再定义性;(6)洞察性。
递归查找方法
递归查找方法
1.二分查找法:递归地在有序数组中查找目标元素。
该方法
首先将数组的中间元素与目标元素进行比较,如果相等则返回
该元素的索引,如果目标元素小于中间元素,则在数组的左半
部分继续查找,否则在数组的右半部分继续查找,直到找到目
标元素或者数组为空。
2.深度优先搜索算法(DFS):在图结构中查找目标元素。
DFS通过递归地遍历图的邻接节点来查找目标元素。
具体实现时,需要使用一个布尔数组来标记已经访问过的节点,以避免
重复访问。
3.广度优先搜索算法(BFS):同样用于图结构中查找目标
元素。
BFS通过递归地遍历图的邻接节点,但是与DFS不同的是,BFS通过使用一个队列来实现节点的访问顺序。
具体实现时,首先将起始节点入队列,然后按照先入先出的顺序逐个出
队列并访问节点的邻接节点,直到找到目标元素或者队列为空。
4.递归遍历树结构:在树结构中查找目标元素的最直接方法
是通过递归地遍历树的每个节点来查找。
这种方法可以使用前序、中序或后序遍历三种方式来实现,具体选择哪种方式取决
于具体问题的要求。
数据结构与算法分析论文(递归的讨论)
数据结构论文——递归算法的讨论所谓递归算法是把问题转化为规模缩小了的同类问题的子问题。
然后递归调用函数(或过程)来表示问题的解。
一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数)。
递归过程一般通过函数或子过程来实现。
递归方法:在函数或子过程的内部,直接或者间接地调用自己的算法。
递归算法是一种直接或者间接地调用自身算法的过程。
在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
递归算法解决问题的特点:(1) 递归就是在过程或函数里调用自身。
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。
(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。
递归次数过多容易造成栈溢出等。
所以一般不提倡用递归算法设计程序。
下面就让我们结合例子详细讨论一下递归算法。
一、递归算法的原理递归算法简单的说就是在函数中调用函数自身,不断调用,直到满足函数得出计算结果(某个条件)。
因为其需要不断循环的调用自身,所以称为递归调用。
递归的原理,其实就是一个栈(stack), 比如求5的阶乘,要知道5的阶乘,就要知道4的阶乘,4又要是到3的,以此类推,所以递归式就先把5的阶乘表示入栈, 在把4的入栈,直到最后一个,之后呢在从1开始出栈, 看起来很麻烦,确实很麻烦,他的好处就是写起代码来,十分的快,而且代码简洁,其他就没什么好处了,运行效率出奇的慢。
还有一个十分形象的例子:从前有座山,山里有个庙,庙里有个老和尚正在讲故事:从前有座山,山里有个庙,庙里有个老和尚正在讲故事:从前有座山,山里有个庙,庙里有个老和尚正在讲故事……如此循环往复到最终的要求。
递归分为2种,直接递归和间接递归。
直接递归,比如方法A内部调用方法A自身。
间接递归,比如方法A内部调用方法B,方法B内部调用方法C,方法C 内部调用方法A。
计算机常用算法
练习: 假设有一堆小石子,二人轮流去取,谁拿走最后一颗石子便输。 先让甲规定石子总数N以及每次最多取多少颗数k(n>=2*k+1), 甲每次取a颗, (N,k,a均为随机数),乙怎样取赢的可能性最大? 设甲为计算机产生的随机数,乙为由你编的计算机程序。
贪心法是从问题的某一个初始解出发,向给定的目标推进.
数学函数式递归 例1、阶乘n!=1*2*3*…(n-1)*n
[算法分析]:要求n!,只需求出(n-1)!,因为n!=n*(n-1)!,要求出(n-1)!, 只需求出(n-2)!,因为(n-1)!=(n-1)*(n-2)!,所以可得到阶乘的递归定 义式:
n!=
{
n*(n-1)!,n>0; 1, n=0。
模拟法: 就是模拟某个过程,通过改变数学的各种参数,进而观察变更这 些参数所引起过程状态的变化.一般题目给定或者隐含某一概率.设 计者利用随机函数和取整函数设定某一范围的随机值,将符合概率 的随机值作为参数.然后根据这一模拟的数学模型展开算法. 模拟策略的关键: 是如何按照概率的要求确定随机值的范围.这个随机值设计得好, 模拟效果就好.
找零钱问题:一个小孩买了价值为33美分的糖,并将1 找零钱问题:一个小孩买了价值为33美分的糖,并将1美元 33美分的糖 的钱交给售货员。售货员希望用数目最少的硬币找给小孩。 的钱交给售货员。售货员希望用数目最少的硬币找给小孩。 假设提供了数目不限的面值为25美分、10美分 25美分 美分、 美分、 假设提供了数目不限的面值为25美分、10美分、5美分、及1 美分的硬币。 求解所用方法即为贪心算法) 美分的硬币。(求解所用方法即为贪心算法)
5 7 6
பைடு நூலகம்
本题目有9个格子,要求填数,如果不考虑问题给出的条件, 共有9!=362880种方案,在这些方案中符合条件的即为解。因 此可以用枚举法。
五大常用算法ppt课件
桥了。
A B→ 2 A←1
AC → 5 A←1
AD → 8
一共就是2+1+5+1+8=17分钟。
Your company slogan
贪心算法
但其实有更快的办法: AB→2 A←1 CD→8 B←2 AB→2
一共是2+1+8+2+2=15分钟。这个办法的聪明之处在于让两个走得最慢的人同时过桥, 这样花去的时间只是走得最慢的那个人花的时间,而走得次慢的那位就不用另花时间过 桥了。可以把所有可能的方案都列举一遍,就会发现这是最快的方案了。
Your company slogan
贪心算法
2015年周得水等人提出一种基于Dijkstra的贪心算法来实现模糊连接度的快速计算。 基于模糊连接度的图像分割过程如下: (1)由用户在图像中选取种子点; (2)计算图像中各点相对于种子点的模糊连接度,同时得到各点到种子点的最优路径; (3)对得到的最优路径进行各点相对于种子点的属性相似度计算,同时得到图像中各点新 的隶属度; (4)用户通过选取阈值来分割图像。
1. if |P|≤n0
2. then return(ADHOC(P)) 3. 将P分解为较小的子问题 P1 ,P2 ,...,Pk
4. for i←1 to k 5. do yi ← Divide-and-Conquer(Pi) △ 递归解决Pi 6. T ← MERGE(y1,y2,...,yk) △ 合并子问题
后将各子问题的解合并得到原问题的解。(分治与递归)
适用情况: 1) 该问题的规模缩小到一定的程度就可以容易地解决; 2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质; 3) 利用该问题分解出的子问题的解可以合并为该问题的解; 4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
计算机算法设计五大常用算法的分析及实例
计算机算法设计五⼤常⽤算法的分析及实例摘要算法(Algorithm)是指解题⽅案的准确⽽完整的描述,是⼀系列解决问题的清晰指令,算法代表着⽤系统的⽅法描述解决问题的策略机制。
也就是说,能够对⼀定规范的输⼊,在有限时间内获得所要求的输出。
如果⼀个算法有缺陷,或不适合于某个问题,执⾏这个算法将不会解决这个问题。
不同的算法可能⽤不同的时间、空间或效率来完成同样的任务。
其中最常见的五中基本算法是递归与分治法、动态规划、贪⼼算法、回溯法、分⽀限界法。
本⽂通过这种算法的分析以及实例的讲解,让读者对算法有更深刻的认识,同时对这五种算法有更清楚认识关键词:算法,递归与分治法、动态规划、贪⼼算法、回溯法、分⽀限界法AbstractAlgorithm is the description to the problem solving scheme ,a set of clear instructions to solve the problem and represents the describe the strategy to solve the problem using the method of system mechanism . That is to say, given some confirm import,the Algorithm will find result In a limited time。
If an algorithm is defective or is not suitable for a certain job, it is invalid to execute it. Different algorithms have different need of time or space, and it's efficiency are different.There are most common algorithms: the recursive and divide and conquer、dynamic programming method、greedy algorithm、backtracking、branch and bound method.According to analyze the five algorithms and explain examples, make readers know more about algorithm , and understand the five algorithms more deeply.Keywords: Algorithm, the recursive and divide and conquer, dynamic programming method, greedy algorithm、backtracking, branch and bound method⽬录1. 前⾔ (4)1.1 论⽂背景 (4)2. 算法详解 (5)2.1 算法与程序 (5)2.2 表达算法的抽象机制 (5)2.3 算法复杂性分析 (5)3.五中常⽤算法的详解及实例 (6)3.1 递归与分治策略 (6)3.1.1 递归与分治策略基本思想 (6)3.1.2 实例——棋盘覆盖 (7)3.2 动态规划 (8)3.2.1 动态规划基本思想 (8)3.2.2 动态规划算法的基本步骤 (9)3.2.3 实例——矩阵连乘 (9)3.3 贪⼼算法 (11)3.3.1 贪⼼算法基本思想 (11)3.3.2 贪⼼算法和动态规划的区别 (12)3.3.3 ⽤贪⼼算法解背包问题的基本步骤: (12)3.4 回溯发 (13)3.4.1 回溯法基本思想 (13)3.3.2 回溯发解题基本步骤 (13)3.3.3 实例——0-1背包问题 (14)3.5 分⽀限界法 (15)3.5.1 分⽀限界法思想 (15)3.5.2 实例——装载问题 (16)总结 (18)参考⽂献 (18)1. 前⾔1.1 论⽂背景算法(Algorithm)是指解题⽅案的准确⽽完整的描述,是⼀系列解决问题的清晰指令,算法代表着⽤系统的⽅法描述解决问题的策略机制。
常见算法及其运算实例分析
常见算法及其运算实例分析算法是计算机科学中最重要的一部分。
算法既是计算机科学的基础,又是计算机编程的核心。
了解算法,可以让我们更深入地理解计算机的运行原理,以及如何利用计算机处理各种问题。
本文将为大家介绍几个常见的算法及其运算实例分析。
一、递归算法递归算法是一种函数调用自身的算法。
递归算法具有简单、直观、可理解等优点。
但同时也存在着栈溢出、时间复杂度高等问题。
递归算法通常包含有一些关键参数,如递归的次数和递归深度等,这些参数的变化对于程序的运行和结果都有着重要的影响。
实例:斐波那契数列我们可以通过递归算法来实现斐波那契数列。
斐波那契数列的定义如下:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n>=2)。
通过递归算法,可以很容易地实现斐波那契数列。
我们只需要以递归方式调用F函数即可,代码如下:```def F(n):if n==0:return 0elif n==1:return 1else:return F(n-1)+F(n-2)```二、分治算法分治算法是将问题分解成若干个子问题,然后递归地分别解决每个子问题,最终合并成一个整体的算法。
分治算法通常解决的问题都具备“可分解性”和“合并性”的特征。
实例:二分查找二分查找可以用分治算法来实现。
二分查找的思想是将数组分成两个区间,分别判断目标值是否在每个区间中。
如果目标值存在于某个区间中,则继续在该区间中进行查找;否则在另一个区间中进行查找。
通过分治算法,我们可以将二分查找优化成O(log n)的时间复杂度。
代码如下:```def binary_search(arr, left, right, target):if left > right:return -1mid = (left + right) // 2if arr[mid] == target:return midelif arr[mid] < target:return binary_search(arr, mid+1, right, target)else:return binary_search(arr, left, mid-1, target)```三、贪心算法贪心算法可以理解为通过每步选择中的局部最优解,从而达到全局最优的解决方案。
递归算法及经典例题详解
递归算法及经典例题详解大部分人在学习编程时接触的第一个算法应该就是递归了,递归的思想其实很好理解,就是将一个问题拆分为若干个与本身相似的子问题,通过不断调用自身来求解。
但很多新手在实际操作中却很难正确使用到递归,有时面对问题还会有种无从下手的感觉,在此,我总结了一些解决递归问题的方法和思路,希望对你能有所帮助。
1.什么是递归递归简单来说就是在运行过程中不断调用自己,直到碰到终止条件,返回结果的过程。
递归可以看作两个过程,分别是递和归。
递就是原问题把要计算的结果传给子问题;归则是子问题求出结果后,把结果层层返回原问题的过程。
下面设一个需要经过三次递归的问题,为大家详细看一下递归的过程:当然,现实中我们遇到递归问题是不会按照图中一样一步一步想下来,主要还是要掌握递归的思想,找到每个问题中的规律。
2.什么时候使用递归递归算法无外乎就是以下三点:1.大问题可以拆分为若干小问题2.原问题与子问题除数据规模不同,求解思路完全相同3.存在递归终止条件而在实际面对递归问题时,我们还需要考虑第四点:当不满足终止条件时,要如何缩小函数值并让其进入下一层循环中3.递归的实际运用(阶层计算)了解了大概的思路,现在就要开始实战了。
下面我们来看一道经典例题:求N的阶层。
首先按照思路分析是否可以使用递归算法:1.N!可以拆分为(N-1)!*N2.(N-1)!与N!只有数字规模不同,求解思路相同3.当N=1时,结果为1,递归终止满足条件,可以递归:public static int Factorial(int num){if(num==1){return num;}return num*Factorial(num-1);}而最后的return,便是第四步,缩小参数num的值,让递归进入下一层。
一般来说,第四步往往是最难的,需要弄清该如何缩小范围,如何操作返回的数值,这一步只能通过不断地练习提高了(当然如果你知道问题的数学规律也是可以试出来的)。
【算法】常见算法分类和思想
【算法】常见算法分类和思想我们在实际应⽤中,对⼀个问题会有不同的解题思路,⽐如我们在读书时候,往往对⼀道数学题⽬会有多种解题⽅法,可能有些⽅法⽐较简单,有些⽅法⽐较复杂,步骤较多。
所以找到⼀个合适的⽅法可以更快更好的去解决问题。
在程序应⽤中,我们也会有不同的算法去解决问题。
算法分类分为:1.基础算法:包括字符串,数组,正则表达式,排序,递归等。
2.数据结构:堆,栈,队列,链表,矩阵,⼆叉树等。
3.⾼级算法:贪⼼算法,动态规划等。
根据问题的不同,⼀般可以有以下算法思想去解决问题: 递推算法: 递推法,就是从已知的结果和条件出发,利⽤特定关系分解中间步骤得出推论,逐步推导⽽得到结果。
递推算法分为顺推和逆推两种。
递推与递归的⽐较 相对于递归算法,递推算法免除了数据进出栈的过程,也就是说不需要函数不断的向边界值靠拢,⽽直接从边界出发,直到求出函数值。
分治算法: 分治,顾名思义,分⽽治之,分治算法是⼀种化繁为简的算法思想,往往应⽤于计算步骤⽐较复杂的问题,通过将问题简化⽽逐步得到结果。
常⽤场景就是求出最轻、最重问题(在⼀堆形状相同的物品中找出最重或最轻的那⼀个,⼆分查找,快速排序和归并排序,分治算法也是许多⾼效算法的基础,⽐如快速傅⽴叶变换算法和 Karatsuba 乘法算法。
概率算法: 概率算法是在程序执⾏过程中利⽤概率统计的思路随机地选择下⼀个计算步骤,在很多情况下,算法在执⾏过程中⾯临选择时,随机性选择⽐最优选择省时,因此概率算法可以在很⼤程度上降低算法的复杂度。
概率算法⼤致分类如下: 1.贝叶斯分类算法。
2.蒙特卡罗(Monte Carlo)算法。
3.拉斯维加斯(Las Vegas)算法。
4.舍伍德(Sherwood)算法。
5.随机数算法。
6.近似算法。
7.机器学习算法中的的⼀些概率⽅法。
递归算法: 递归算法是指⼀种通过重复将问题分解为同类的⼦问题⽽解决问题的⽅法。
具体来说就是就是⼀个函数或者类⽅法直接或间接调⽤⾃⾝的⼀种⽅法。
算法设计与分析:第02章 递归与分治策略
A(1,0) 2 A(0, m) 1 m0 A(n,0) n 2 n2 A(n, m) A( A(n 1, m), m 1) n, m 1
2.1
递归的概念
例3 Ackerman函数 前2例中的函数都可以找到相应的非递归方式定义:
n! 1 2 3 (n 1) n
课件第2章
递归与分治策略
算法总体思想
• 将要求解的较大规模的问题分割成k个更小规模的子问 对这k个子问题分别求解。如果子问题的规模仍然不够 小,则再划分为k个子问题,如此递归的进行下去,直 题。 到问题规模足够小,很容易求出其解为止。
T(n)
=
n
T(n/2)
T(n/2)
T(n/2)
T(n/2)
算法总体思想
下面来看几个实例。
2.1
递归的概念
边界条件
例1 阶乘函数 阶乘函数可递归地定义为:
n0 1 n! n(n 1)! n 0
递归方程 边界条件与递归方程是递归函数的二个要素,递归函 数只有具备了这两个要素,才能在有限次计算后得出 结果。
2.1
递归的概念
例2 Fibonacci数列 无穷数列1,1,2,3,5,8,13,21,34,55,…,被 称为Fibonacci数列。它可以递归地定义为:
2.1
递归的概念
例6 Hanoi塔问题 public static void hanoi(int n, int a, int b, int c) 当n=1时,问题比较简单。此时,只要将编号为1的圆盘从塔座a直 在问题规模较大时,较难找到一般的方法,因此我们尝试 接移至塔座b上即可。 用递归技术来解决这个问题。 { 思考题:如果塔的个数变为a,b,c,d 当n>1时,需要利用塔座c作为辅助塔座。此时若能设法将n-1个 if (n > 0) 四个,现要将n个圆盘从a全部移动 较小的圆盘依照移动规则从塔座a移至塔座c,然后,将剩下的最 { 到d,移动规则不变,求移动步数最 大圆盘从塔座a移至塔座b,最后,再设法将n-1个较小的圆盘依照 hanoi(n-1, a, c, b); 小的方案。 移动规则从塔座c移至塔座b。 move(a,b); 由此可见,n个圆盘的移动问题可分为2次n-1个圆盘的移动问题, hanoi(n-1, c, b, a); 这又可以递归地用上述方法来做。由此可以设计出解Hanoi塔问题 的递归算法如下。 } }
