递归算法的介绍.docxVIP

  • 4
  • 0
  • 约3.08千字
  • 约 4页
  • 2023-08-24 发布于辽宁
  • 举报
递归应用实例介绍姓名:周凡学号业:计算机科学与技术09级5班 姓名:周凡 学号关键词递归汉诺塔斐波那契数列快速排序 递归之所以能作为一种算法在程序设计语言中广泛应用,主要在于采用递归编写程序能使程序变得简洁和清晰.。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。说得直接一点,递归就是在过程或函数里调用自身。 下面,从本人掌握的编程知识,介绍几个使用递归算法的实例。 汉诺塔问题是源于印度一个古老传说的益智玩具。上帝创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上安大小顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢?这里需要递归的方法。假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2n-1。n=64时, f(64)=2^64-1=18446744073709551615 假如每秒钟一次,共需多长时间呢?一个平年365天,闰年366天,平均每,计算一下, 18446744073709551615584554049253.855年,显然这是人力所不能及的,但是使用递归算法可以很快的解决问题首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放ABC; 若n为奇数,按顺时针方向依次摆放ACB。 按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子A,则把它移动到B;若圆盘1在柱子B,则把它移动到C;若圆盘1在柱子C,则把它移动到A。 接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘。这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。 反复进行(1)(2)操作,最后就能按规定完成汉诺塔的移动。 汉诺塔汉诺塔问题的递归实现: #includestdio.h voidhanoi(intn,charA,charB,charC) { if(n==1) { printf(Movedisk%dfrom%cto%c\n”,n,A,C); } else { hanoi(n-1,A,C,B); printf(Movedisk%dfrom%cto%c\n”,n,A,C); hanoi(n-1,B,A,C); } } main() { intn; printf(请输入数字n以解决n阶汉诺塔问题:\n); scanf(%d”,n); hanoi(n,,A,,,B,,,C,); }相比非递归算法而言,递归算法更加简洁,代码行数更少,节约了时间与空间。 斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、……这个数列从第三项开始,每一项都等于前两项之和。从第二项开始,每个奇数项的平方者K比前后两项之积多1,每个偶数项的平方都比前后两项之积少1。 该问题我们同样可以利用递归算法进行解读,算法如下: publicclassFib{ publicstaticvoidmain(String[]args){System.out.println(f(20));System.out.println(fx(20)); } 〃递归方式 publicstaticintf(intn){//参数合法性验证if(n1){System.out.println(参数必须大于1!);System.exit(-l);}if(n==1||n==2)return1;elsereturnf(n-1)+f(n-2); }快速排序的思想是:先从数据序列中选一个元素,并将序列中所有比该元素小的元素都放到它的右边或左边,再对左右两边分别用同样的方法处之直到每一个待处理的序列的长度为1,处理结束. 程序如下: programkspv; constn=7; type arr=array[1..n]ofinteger; var

文档评论(0)

1亿VIP精品文档

相关文档