递归的应用
作业一
(1)使用组合数公式利用n!来计算
设计思想
先写出计算阶乘的函数,这个函数运用了递归的方法,
然后再根据公式求出组合数。
程序流程图
程序源代码
import java.util.Scanner; public class Combination_N { public static void main(String[] args) { int up_num=1,down_num=1;//up_num表示组合数的上数,down_num表示组合输的下数 Scanner scanner=new Scanner (System.in); while(true) { System.out.println("请输入组合数上边的数"); if(scanner.hasNextInt()) up_num=scanner.nextInt(); System.out.println("请输入组合数下边的数"); if(scanner.hasNextInt()) down_num=scanner.nextInt(); System.out.println(combin(up_num,down_num)); } } public static int factorial (int n)//求N! { if(n>1) return factorial(n-1)*n; else return 1; } public static int combin(int up,int down)//求组合数 { return factorial(down)/(factorial(up)*factorial(down-up)); } }
程序截图
(2)使用递推的方法用杨辉三角形计算
程序设计思想
创建二维数组,运用杨辉三角的思想递推求组合数
程序流程图
源代码
import java.util.Scanner; public class Zuheshu3 { public static void main(String[] args) { Scanner scanner =new Scanner(System.in); int up_num=1,down_num=1;//up_num表示组合数的上数,down_num表示组合输的下数 while(true) { System.out.println("请输入组合数上边的数"); if(scanner.hasNextInt()) up_num=scanner.nextInt(); System.out.println("请输入组合数下边的数"); if(scanner.hasNextInt()) down_num=scanner.nextInt(); System.out.print(Combination(up_num,down_num)); } } public static int Combination(int up,int down)//计算组合数 { int a[][]=new int[down+1][down+1]; int i,j; for(i=0;i<=down;i++) a[i][0]=1; for(i=1;i<=down;i++) a[i][i]=1; for(i=2;i<=down;i++) for(j=1;j<i;j++) a[i][j]=a[i-1][j]+a[i-1][j-1]; return a[down][up]; } }
(3)使用递归的方法用组合数递推公式
设计思想
直接把所给的公式写成函数,并采取递归的方法,函数结束的条件是组合数的上下两个数相等,或者上变数是1
程序流程图
import java.util.Scanner; public class YH_tri { public static void main(String[] args) { Scanner scanner =new Scanner(System.in); int up_num=1,down_num=1;//up_num表示组合数的上数,down_num表示组合输的下数 while(true) { System.out.println("请输入组合数上边的数"); if(scanner.hasNextInt()) up_num=scanner.nextInt(); System.out.println("请输入组合数下边的数"); if(scanner.hasNextInt()) down_num=scanner.nextInt(); System.out.print(Combination(up_num,down_num)); } } public static int Combination(int up,int down)//计算组合数 { int Com; if(up==1) return down; else if(up==down) return 1; else return(Combination(up,down-1)+Combination(up-1,down-1)); } }
运行截图
作业2:递归编程解决汉诺塔问题
程序设计思想
经分析得移动每个盘子都需移动他的上边的盘子;由此产生递归的条件求组合数
程序流程图
程序源码
import java.util.Scanner; public class Hanoi { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int num=1; System.out.println("请输入汉诺塔的层数"); if(scanner.hasNextInt()) { num=scanner.nextInt(); } System.out.println("操作步骤如下(其中A表示起始塔,B表示借助的塔,C表示最终塔)"); hanoi(num,'A','B','C'); } public static void hanoi(int num,char one,char two,char three)//one表示起始塔,two表示移动过程借助的塔,three表示最终的位置塔 { if(num==1) { move(one,three); } else { hanoi(num-1,one,three,two); move(one,three); hanoi(num-1,two,one,three); } } public static void move(char from,char to)//from表示移动的初位置,to表示末位置 { System.out.println(from+"->"+to); } }
实验截图
作业3
设计思想
先确定字符串的长度,然后即可比较第一个和最后一个字符,然后再去掉原来字符串的首尾字符,在进行比较
程序流程图
程序源码
import java.util.Scanner; public class Palindrome { public static void main(String[] args) { String str=" "; Scanner input =new Scanner(System.in); while(true) { System.out.println("请输入一段话"); if(input.hasNext()) str=input.next(); if(huiwen(str)) { System.out.print("这段话是回文"); } else System.out.print("这段话不是回文"); } } public static boolean huiwen(String str) { int len; len=str.length(); if(len==1||len==0) return true; else if(str.charAt(0)==str.charAt(len-1)) { return huiwen(str.substring(1, len-1)); } else return false; } }
实验截图