This document outlines a recursive program that reverses a string terminated by '!' and explores state space search strategies utilized in computing. The program reads characters recursively until it encounters '!', then outputs the reversed string. It delves into the concept of recursion and examples of state space search methods, including breadth-first, depth-first, and heuristic search techniques. The implementation of backtracking for solving constrained problems is also discussed, providing insights into search methodologies in algorithm design.
01 / 100Recursive Character Reversal Program Using State Space Search Techniques
1 / 17
Télécharger la présentation
Recursive Character Reversal Program Using State Space Search Techniques
Une image / un lien ci-dessous est fourni (tel quel) pour télécharger la présentation
Politique de téléchargement : le contenu du site vous est fourni TEL QUEL pour votre information et votre usage personnel ; il ne peut être vendu, concédé sous licence ni partagé sur d’autres sites sans l’accord de son auteur.Le contenu vous est fourni TEL QUEL, pour votre information et votre usage personnel uniquement.Téléchargez la présentation en cliquant sur ce lien.Lors du téléchargement, si vous ne parvenez pas à télécharger une présentation, l’éditeur a peut-être supprimé le fichier de son serveur.Pendant le téléchargement, si vous ne parvenez pas à obtenir une présentation, le fichier a peut-être été supprimé par l’éditeur.
F I N
Plus de contenu associé
Transcription de la présentation
例3:输入一串以‘!’结束的字符,按逆序输出。例3:输入一串以‘!’结束的字符,按逆序输出。 program p4(input,output); procedure rever; var c:char; begin read(c); if c<>'!' then rever; write(c); end; begin {主程序} rever; end. 运行: 输入 hey! 输出 !yeh。 程序中,c 是过程rever的局部变量。每一次递归调用,都要为局部变量重新分配单元,因此各层的变量c实际上是不同的量,它们分别用于保存执行本层调用时的输入值。
hey! c=‘!’ procedure rever; var c:char; begin read(c); if c<>'!' then rever; write(c); end; c=‘y’ procedure rever; var c:char; begin read(c); if c<>'!' then rever; write(c); end; c=‘e’ procedure rever; var c:char; begin read(c); if c<>'!' then rever; write(c); end; c=‘h’ procedure rever; var c:char; begin read(c); if c<>'!' then rever; write(c); end;
程序中的递归过程图解如下: procedure num(x: integer) begin if x=5 then a:=10 else begin num(x+1); a:=a+2 end end; 整个递归过程可视为由往返双向“运动”组成,先是逐层递进,逐层打开新的“篇章”,(有可能无具体计算值)当最终递进达到边界,执行完本“层”的语句,才由最末一“层”逐次返回到上“层”,每次返回均带回新的计算值,直至回到第一次由主程序调用的地方,完成对原问题的处理。
试一试,如果n位,n<6,如何改动? program expl_dg; var a:array[1..10] of integer; procedure print; var i:integer; begin for i:=1 to 3 do write(a[i],' '); writeln; end; procedure work(x:integer); var i:integer; begin if x>3 then begin print ;exit;end; for i:=1 to 3 do begin a[x]:=i; work(x+1); end; end; begin work(1); end. 如果要求输出不重复的全排列呢?
program expl_dg; var a:array[1..10] of integer; n:integer; procedure print; var i:integer; begin for i:=1 to n do write(a[i],' '); writeln; end; function try(x,i:integer):boolean; var j:integer; begin try:=true; for j:=1 to x-1 do if a[j]=i then begin try:=false;break;end; end; procedure work(x:integer); var i:integer; begin if x>n then begin print;exit;end; for i:=1 to n do if try(x,i)=true then begin a[x]:=i; work(x+1); end; end; begin readln(n); work(1); end. 剪枝
关于回溯法搜索的递归程序框架全排列算法的递归解法为例做个介绍:关于回溯法搜索的递归程序框架全排列算法的递归解法为例做个介绍: const n=5;var a:array [1..n] of integer; {记录搜索的解} e:array [1..n] of boolean; {标记数组用于记录i是否已经用过} {初始状态都是false} procedure print; var i:integer; begin for i:=1 to n do write(a[i],' '); end;procedure search(deep:integer); {deep是搜索深度} var i:integer; begin if deep>n then begin print; {输出结果} exit; {退出本层,回溯} end; for i:=1 to n do if e[i]=false then begin {如果i没有用过,限定条件} e[i]:=true; {标记为用过i} a[deep]:=i; {记录该位置的元素为i} search(deep+1); {搜索deep+1个位置上的元素} e[i]:=false; {回溯之后取消i元素的已用标记} end; end; 在很多题目中,"限定条件"需要用邻接矩阵等数据表示,这个"限定条件"就是输出结果中需要满足的条件,具体的可以根据题目来修改。
数字排列问题的递归实现 procedure try(k:integer); var i :integer; begin if( )then begin print; exit; end; for i:=1 to n do begin ( ); if( )then try(k+1) end end; begin readln(n); try(1); end. var i,k,n:integer; x:array[1..9] of integer; function place(k:integer):boolean; var i:integer; begin place:=true; for i:=1 to k-1 do if( )then begin place:=false; break end ; end; procedure print; var i:integer; begin for i:=1 to n do write(x[i],' '); writeln; end; k>n x[i]=x[k] x[k]:=i place(k)
四色问题 n块,m代表当前在填第几块 procedure search(m: integer); // 递归搜索第m个省份 begin if m > n then // 是否所有省份都已经填色 begin write(s[1]); // 已全部填色,输出结果,终止程序 for j := 2 to n do write(' ', s[j]); writeln; halt end else // 还未全部填色 for j := 1 to 4 do // 依次用四种颜色对当前省份填色 begin if 可以 then {同相邻的块没有色彩冲突} begin // 没有冲突 s[m] := j; // 记录当前省份颜色 search(m + 1); // 递归检查下一个省份 end; end; end;
const maxm=10; maxn=10; const dx:array[1..4] of integer=(-1,1,0,0); { 上下左右方向 } dy:array[1..4] of integer=(0,0,-1,1); type address=record x,y:integer; end; var a:array[0..maxm+1,0..maxn+1] of integer; step:array[1..maxm*maxn] of address; m,n,x0,y0,x1,y1:integer; procedure init; var i,j:integer; begin readln(m,n); for i:=0 to m+1 do for j:=0 to n+1 do a[i,j]:=1; for i:=1 to m do for j:=1 to n do read(a[i,j]); readln(x0,y0); readln(x1,y1); step[1].x:=x0; step[1].y:=y0; end; procedure print(steps:integer); var i:integer; begin for i:=1 to steps-1 do write('(',step[i].x,',',step[i].y,')-->'); writeln('(',step[steps].x,',',step[steps].y,')'); halt; end; procedure try(i:integer); var j,x,y:integer; begin for j:=1 to 4 do begin x:=step[i-1].x+dx[j]; y:=step[i-1].y+dy[j]; if a[x,y]=0 then begin step[i].x:=x; step[i].y:=y; a[x,y]:=-1; if (x=x1) and (y=y1) then print(i) else try(i+1); a[x,y]:=0; end; end; end; begin init; a[x0,y0]:=1;try(2); end.
var x:array[1..n] of integer; a:array[1..n] of boolean; {列控制标志:true:可以放,false:不能放} b:array[2..2*n] of boolean; {左上右下方斜线控制标志,true:可以放,false:不能放} c:array[1-n..n-1]of boolean; {左下右上方斜线控制标志,true:可以放,false:不能放} 初始时: fillchar(x,sizeof(x),0); fillchar(a,sizeof(a),true); fillchar(b,sizeof(b),true); fillchar(c,sizeof(c),true);
procedure try(i:integer); var j:integer; begin if i=n+1 then print else for j:=1 to n do if a[j] and b[i+j] and c[i-j] then begin x[i]:=j; a[j]:=false; {列控制标志} b[i+j]:=false; {左上右下方斜线控制标志} c[i-j]:=false; {左下右上方斜线控制标志} try(i+1); {如果不能递归进行,既a[j] and b[i+j] and c[i-j]=false: 无法放置i+1个皇后,说明当前皇后i放置不正确,要回溯,消除标志} a[j]:=true; b[i+j]:=true; c[i-j]:=true end; end; begin try(1) end.
皇后序号 四皇后问题的递归实现 procedure try(k:integer); var i:integer; begin if( ) then begin print; ( ) end; for i:=( )do begin ( ); if place(k) then( ); end; end ;begintry(1);{摆放第一个皇后} end. const n=4;var i,j,k:integer; x:array[1..n] of integer; {保存第i个皇后的列号}function place(k:integer):boolean; var i:integer; begin place:=true; for i:=1 to k-1 do if(x[i]=x[k])or(abs(x[i]-x[k])=abs(i-k)) then place:=false; end;procedure print; var i:integer; begin for i:=1 to n do write(x[i]:4); writeln; end; k=n+1 因为从第i个皇后到第i+1个皇后的摆放方法是相同的,所以可以用递归的方法. exit 1 to n x[k]:=i try(k+1) 摆放下一个皇后
const maxx=15; maxy=15; x:array[1..4,1..2]of integer=((1,-2),(2,-1),(2,1),(1,2)); {4个方向} var n,m,t:integer; a:array[1..maxx+1,1..2]of integer;{记录走的路径坐标} procedure print(i:integer); var j:integer; begin inc(t); write(t,':'); for j:=1 to i do write('(',a[j,1],' ',a[j,2],')'); writeln; end;
procedure try(i:integer); {搜索到当前第i个点} var j:integer; begin if (a[i,1]=n) and (a[i,2]=m) then print(i); for j:=1 to 4 do if (a[i,1]+x[j,1]>=0)and(a[i,1]+x[j,1]<=n) and(a[i,2]+x[j,2]>=0)and(a[i,2]+x[j,2]<=m){判界} then begin a[i+1,1]:=a[i,1]+x[j,1]; a[i+1,2]:=a[i,2]+x[j,2]; try(i+1); end; end; begin assign(output,'house1.out'); rewrite(output); readln(n,m); t:=0; a[1,1]:=0;{起始位置作为第1个点,x,y为0} a[1,2]:=0; try(1); close(output); end.
求最少步到达B点。 Best:最短路线,a:临时得到的一个路线。Min:最少步。 procedure try(i:integer); {搜索到当前第i个点} var j:integer; begin if ((a[i,1]=n) and (a[i,2]=m))and(i<min) then begin min:=i;best:=a;exit;end; {记下当前最短路径和最少步数} if ((a[i,1]<>n) or (a[i,2]<>m))and(i>=min) then exit; {剪枝优化} for j:=1 to 4 do if (a[i,1]+x[j,1]>=0)and(a[i,1]+x[j,1]<=n) and(a[i,2]+x[j,2]>=0)and(a[i,2]+x[j,2]<=m) then begin a[i+1,1]:=a[i,1]+x[j,1]; a[i+1,2]:=a[i,2]+x[j,2]; try(i+1); end; end; 19 19
算法框架 procedure search(i:integer; j:byte); {递归求解} var k:byte; begin if now+f[j]<=ans then exit; {如果没有必要搜索下去} if now>ans then begin {修改最优解} ans:=now; out:=ou; end; for k:=j to n do {选取物品} if w[k]<=i then begin now:=now+p[k]; ou[k]:=true; search(i-w[k],k+1); now:=now-p[k]; ou[k]:=false; end; end;
Connexion au compte
Connectez-vous pour publier votre contenu sur SlideServe.