meili 发表于 2022-10-21 20:47:17

信息学竞赛常用算法与策略:递归 标签:信息学

<p><strong>优学合肥奥数网讯:信息学竞赛常用算法与策略:递归。</strong></p><p>递归是计算机科学的一个重要概念,递归的方法是程序设计中有效的方法,采用递归编写</p><p>程序能是程序变得简洁和清晰.</p><p><strong>2.1 递归的概念</strong></p><p>1.概念</p><p>一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数).</p><p>如:</p><p>procedure a;</p><p>begin</p><p>.</p><p>.</p><p>.</p><p>a;</p><p>.</p><p>.</p><p>.</p><p>end;</p><p>这种方式是直接调用.</p><p>又如:</p><p>procedure b;procedure c;</p><p>begin begin</p><p>..</p><p>..</p><p>..</p><p>c; b;</p><p>. .</p><p>. .</p><p>. .</p><p>end; end;</p><p>这种方式是间接调用.</p><p>例1计算n!可用递归公式如下:</p><p>1当 n=0 时</p><p>fac(n)={n*fac(n-1) 当n>0时</p><p>可编写程序如下:</p><p>program fac2;</p><p>var</p><p>n:integer;</p><p>function fac(n:integer):real;</p><p>begin</p><p>if n=0 then fac:=1 else fac:=n*fac(n-1)</p><p>end;</p><p>begin</p><p>write('n=');readln(n);</p><p>writeln('fac(',n,')=',fac(n):6:0);</p><p>end.</p><p>例2 楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编一程序计算共有多少种不同的走法.</p><p>设n阶台阶的走法数为f(n)</p><p>显然有</p><p>1n=1</p><p>f(n)={2n=2</p><p>f(n-1)+f(n-2)n>2</p><p>可编程序如下:</p><p>program louti;</p><p>var n:integer;</p><p>function f(x:integer):integer;</p><p>begin</p><p>if x=1 then f:=1 else</p><p>if x=2 then f:=2 else f:=f(x-1)+f(x-2);</p><p>end;</p><p>begin</p><p>write('n=');read(n);</p><p>writeln('f(',n,')=',f(n))</p><p>end.</p><p><strong>2.2 如何设计递归算法</strong></p><p>1.确定递归公式</p><p>2.确定边界(终了)条件</p><p>练习:</p><p>用递归的方法完成下列问题</p><p>1.求数组中的最大数</p><p>2.1+2+3+...+n</p><p>3.求n个整数的积</p><p>4.求n个整数的平均值</p><p>5.求n个自然数的最大公约数与最小公倍数</p><p>6.有一对雌雄兔,每两个月就繁殖雌雄各一对兔子.问n个月后共有多少对兔子?</p><p>7.已知:数列1,1,2,4,7,13,24,44,...求数列的第 n项.</p><p><strong>2.3 典型例题</strong></p><p>例3 梵塔问题</p><p>如图:已知有三根针分别用1,2,3表示,在一号针中从小放n个盘子,现要求把所有的盘子</p><p>从1针全部移到3针,移动规则是:使用2针作为过度针,每次只移动一块盘子,且每根针上</p><p>不能出现大盘压小盘.找出移动次数最小的方案.</p><p>程序如下:</p><p>program fanta;</p><p>var</p><p>n:integer;</p><p>procedure move(n,a,b,c:integer);</p><p>begin</p><p>if n=1 then writeln(a,'--->',c)</p><p>else begin</p><p>move(n-1,a,c,b);</p><p>writeln(a,'--->',c);</p><p>move(n-1,b,a,c);</p><p>end;</p><p>end;</p><p>begin</p><p>write('Enter n=');</p><p>read(n);</p><p>move(n,1,2,3);</p><p>end.</p><p>例4 快速排序</p><p>快速排序的思想是:先从数据序列中选一个元素,并将序列中所有比该元素小的元素都放到它的右边或左边,再对左右两边分别用同样的方法处之直到每一个待处理的序列的长度为1, 处理结束.</p><p>程序如下:</p><p>program kspv;</p><p>const n=7;</p><p>type</p><p>arr=array of integer;</p><p>var</p><p>a:arr;</p><p>i:integer;</p><p>procedure quicksort(var b:arr; s,t:integer);</p><p>var i,j,x,t1:integer;</p><p>begin</p><p>i:=s;j:=t;x:=b;</p><p>repeat</p><p>while (b>=x) and (j>i) do j:=j-1;</p><p>if j>i then begin t1:=b; b:=b;b:=t1;end;</p><p>while (b<=x) and (i<j) do i:=i+1;</p><p>if i<j then begin t1:=b;b:=b;b:=t1; end</p><p>until i=j;</p><p>b:=x;</p><p>i:=i+1;j:=j-1;</p><p>if s<j then quicksort(b,s,j);</p><p>if i<t then quicksort(b,i,t);</p><p>end;</p><p>begin</p><p>write('input data:');</p><p>for i:=1 to n do read(a);</p><p>writeln;</p><p>quicksort(a,1,n);</p><p>write('output data:');</p><p>for i:=1 to n do write(a:6);</p><p>writeln;</p><p>end.</p><p>练习:</p><p>1.计算ackerman函数值:</p><p>n+1m=0</p><p>ack(m,n)={ ack(m-1,1)m<>0 ,n=0</p><p>ack(m-1,ack(m,n-1))m<>0,n<>0</p><p>求ack(5,4)</p><p>关于合肥市青少年信息学竞赛更多的信息,请关注优学合肥奥数网“<strong>青少年信息学竞赛</strong>”频道。</p><p>信息学竞赛常用算法与策略:算法的概念</p><p>青少年信息学竞赛Pascal语言:程序调试(十一)</p><p>青少年信息学竞赛Pascal语言:指针(十)</p><p>信息学竞赛Pascal语言:记录与文件类型(九)</p><p><strong>更多精彩内容推荐>></strong></p>
页: [1]
查看完整版本: 信息学竞赛常用算法与策略:递归 标签:信息学