蔡明志数据结构java 版第 5章.pptVIP

  • 1
  • 0
  • 约2.04千字
  • 约 12页
  • 2019-11-09 发布于广东
  • 举报
第5章 递归 5.1 n阶乘 5.2 斐波纳契数 5.3 将输入的词组以先进后出法打印 5.4 一个典型的递归范例:汉诺塔 5.5 程序集锦 5.6 思考题 第5章 递归 一个调用它本身的函数称为递归函数。 5.1 n阶乘 n! = n × (n-1)!… (n-1)! = (n-1) × (n-2)! (n-2)! = (n-2) × (n-3)! 1! = 1 从上述公式可得知其相同的规则为:某一数A的阶乘为本身A乘以(A-1)的阶乘。其程序如下: 5.1 n阶乘 public int fact(int n) { int ans; if(n==1) ans=1; else ans=n×fact(n-1); return ans; } 在编写递归程序时,千万要记住必须有一个结束点,可以使函数往上追溯直到结束。如上例中,当n = 1时,1! = 1即为其结束点。 5.2 斐波纳契数 斐波纳契数(Fibonacci number)表示某一数为其前两个数的和,假设n0 = 1,n1 = 1,则 n2 = n1 + n0 = 1 + 1 = 2 n3 = n2 + n1 = 2 + 1 = 3 ?… 所以ni = ni–1 + ni–2 5.1 n阶乘 其递归程序如下: public int fibon(int n) { int ans; if(n==0||n==1) ans=1; else ans=fibon(n-1)+fibon(n-2); return(ans); } 5.3 将输入的词组以先进后出法打印 编译程序在处理递归时,会借助栈将调用本身函数的下一个语句的地址存储起来,待执行完后,再将栈的数据一一出栈处理。下面以一范例说明。此例是将输入的词组(word)以先进后出的方式打印出来,其程序如下: public static void push_f() { // 新增函数 DataInputStream in=new DataInputStream(System.in); 5.3 将输入的词组以先进后出法打印 if(top=MAX-1) // 当栈已满,则显示错误 System.out.print(\n Stack is full !\n); else { top++; System.out.print(\n Please enter item to insert: ); System.out.flush(); try { stack[top]=in.readLine(); }catch (IOException e) {} } System.out.println(); } 5.4 一个典型的递归范例:汉诺塔 19世纪在欧洲有一游戏称为汉诺塔(Towers of Hanoi),有64个大小不同的金盘子,3个镶钻石的柱子分别为A、B、C,现要求把64个金盘子从A柱子借助B柱子移到C柱子,游戏规则为: (1)每次只能移动一个盘子。 (2)盘子有大小之分,大盘子必须在下,小盘子在上。 假设有n个金盘子(1, 2, 3, …, n-1),数字越大表示重量越重,其搬移的算法如下: 5.4 一个典型的递归范例:汉诺塔 假设n = 1则搬移第1个盘子从A到C 否则: ① 搬移n-1个盘子从A到B,借助C ② 搬移第n个盘子从A到C ③ 搬移n-1个盘子从B到C,借助A 编写的程序如下: 5.4 一个典型的递归范例:汉诺塔 public static void HanoiTower(int n,char from,char aux,char to) { if (n==1) System.out.print(Move disk+n+from+from+-+to+\n); else { // 将A上n-1个盘子借助C移到B HanoiTower(n-1, from,to,aux); System.out.print(Move disk+n+from+from+-+to+\n); // // 将B上n-1个盘子借助A移到C HanoiTower(n-1,aux,from,to); } } 5.5 程序集锦 1.利用递归的方式计算n阶乘 2.利用递归方式计算斐波纳契数 3.利用递归方式解汉诺塔问题 5.6 思考题 1. 请举几个使用递归的例子,并详细说明其递归的做法。 2. 继续上题,将所举的例子以C语言来执行。 3. 试计算出有n个金盘子在汉诺塔 B柱子,共需移动多少次

文档评论(0)

1亿VIP精品文档

相关文档