第8章 程序设计基本算法与应用.pptVIP

  • 3
  • 0
  • 约3.3千字
  • 约 33页
  • 2017-08-19 发布于河南
  • 举报
第8章 程序设计基本算法与应用

第8章 程序设计基本算法与应用;8.1 迭代法:方程求根(牛顿迭代法); 设r是f(x) = 0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L,L的方程为y = f(x0)+f(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f(x0),称x1为r的一次近似值。过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/f(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f(x(n)),称为r的n+1次近似值,上式称为牛顿迭代公式。 ;#include math.h #include stdio.h float fun(float a,float b,float c,float d) { float x=0.5,y; do { y=x; x=x-(((a*x+b)*x+c)*x+d)/((3*a*x+2*b)*x+c); }while(fabs(x-y)=0.0000001); return x; };main() { float a,b,c,d; printf(\nplease input a,b,c,d:); scanf(%f%f%f%f,a,b,c,d); printf(x=%10.7f\n,fun(a,b,c,d)); } ;8.2 递推法:斐波那契数列;8.2 递推法:斐波那契数列;8.2 递推法:斐波那契数列;8.2 递推法:斐波那契数列;8.3 递归法:斐波那契数列;8.3 递归法:斐波那契数列;8.3 递归法:斐波那契数列;8.4 穷举法:水仙花数; 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 1、问题描述 从出发点(入口)开始,在给定的空间中,沿可行的路径进行探索,直到达到目标(出口)。 在资源勘探中,在战争或游戏中,都会有类似的情景,在给定的空间中,如森林、山洞、沙漠等,搜索特定目标,如出路、人或物等。 这类问题都可以归结为迷宫问题。 ;2、 需要解决的问题 如何表示给定的空间和可行的路径? 如何表示入口和出口? 当有多条可行的路径时如何选择? 当某条路径在某一点再没有可行之路时如何处理? 前两个问题属于数据结构选择和设计, 后两个问题涉及算法设计。;3、迷宫表示 可以用一个m行n列的二维数组maze[m][n]来表示迷宫空间(或称迷宫地图),并约定: 当数组元素maze[i][j]=0,表示通路, maze[i][j]=1,表示不通; 入口为左上角maze[1][1], 出口为右下角maze[m][n];;;迷宫地图简化 为了使探索方向个数一致,可在原来的迷宫地图四周都扩展一个点,即增加两行和两列,并将迷宫四周增加点的值全部置为1,表示是墙,不能通行。 这样做使得原迷宫地图中的所有点都成为了中间点,不用再判断当前点是角点、边点、还是中间点,每个点的探索方向均为8个。 ;;4、增量数组DeltaXY;5、已解决问题和还未解决的问题 (1) 二维数组maze[m+2][n+2]来表示迷宫,解决了迷宫地图的存储; (2)一维数组DeltaXY[8]来记载了8个探索方向的坐标增量,将8个探索方向数字化为0到7,并将向下一点前进的操作统一为当前点的坐标+沿该探索方向的增量,即可得到下一点的坐标; (3) 当某点无路可通行时,需要从该点返回到前一点,再从前一点选择下一个方向继续进行探索,即需要知道前一点和前一点当前探索的方向。因此,我们需要保留依次到达的各点的坐标和到达该点的方向;;(4)如何保留到达各点的坐标和到达时的探索方向? 1) 还需要防止重复到达某点,避免在迷宫中兜死圈子,需要记载已到达过的点。 2)可以选用一个数据结构----栈, 该栈中元素是由行号x、列号y和到达该点的探索方向d组成的三元组(x,y,d), 其中x为到达点的横坐标或行号,y为到达点的纵坐标或列号,d为0—7中的一个数字,表示到达坐标为(x,y)的点的方向。 例如从(2,2)点沿东南方向到达(3,3)点时,在栈中要记录一个三元组(3,3,1)。 ;(5)如

文档评论(0)

1亿VIP精品文档

相关文档