1.组合式公式
设计思想
实验要求输入两个数求组合数,首先要输这两个数才能进行程序,输入后,根据组合数公式中全是阶乘,使用递归比较方便,n!=n*(n-1)*......1,递归中返回n*zuheshu(n-1),实现阶乘,最后调用阶乘函数,输出就完成程序。
程序流程图
实验源代码
import java.util.Scanner; public class Sz { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner input=new Scanner(System.in); int a; int b; int c; //定义所需的三个变量 System.out.println("输入组合数公式所需的数:"); a=input.nextInt(); b=input.nextInt(); //对要计算的两个变量进行赋值。 while(a==0||a<=b) { System.out.println("无法计算,重新输入"); } //判断底下的除数是否可除 c=zuheshu(a)/(zuheshu(b)*zuheshu(a-b));//用递归函数对a,b进行赋值计算后传给c。 System.out.println("组合数为"+c);//输出组合数。 } //创建递归函数,设置形参,还有int类型,用来返回int型的c。 public static int zuheshu(int n) { if(n==1||n==0) { return 1; } else return n*zuheshu(n-1);//递归,自己引用自己进行计算。 } }
实验截图
2.杨辉三角算组合数
设计思想
与前面的思想大致相同,但所需要递归调用的数学式子不同。值得注意的是调用函数的返回值要与定义的赋值元素相同,否则无法执行。
程序源代码
import java.util.Scanner; public class Sz2 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner input=new Scanner(System.in); int a; int b; System.out.println("输入杨辉三角的两个数:"); a=input.nextInt(); b=input.nextInt(); System.out.println(yhsjdg(a+1,b)-yhsjdg(a,b-1)); } public static long yhsj(int n) { if(n==1 || n==0){ return 1; } return n*yhsj(n-1); } public static long yhsjdg(int i,int j) { long c= yhsj(i)/yhsj(j)/yhsj(i-j); return c; } }
实验截图
3.递推方法算组合数
实验思想
前两个都是递归求阶乘后再次算出组合数,递推直接求,直接返回 (zuheshu(n-1,k-1)+zuheshu(n-1,k));
程序源代码
import java.util.Scanner; public class Sz1 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner input=new Scanner(System.in); int a; int b; int c; //定义所需的三个变量 System.out.println("输入组合数公式所需的数:"); a=input.nextInt(); b=input.nextInt(); System.out.println("组合数为:"+zuheshu(a,b)); } public static int zuheshu(int n,int k) { if(k==0) { return 1; } else if(n==k) { return 1; } else return (zuheshu(n-1,k-1)+zuheshu(n-1,k)); } }
实验截图
实验中出现的问题
1.对于递归调用这种函数要想很久才能绕过弯来。
2.在判断a,b为0或1时,返回值return应为1,一直返回0导致程序无法执行找不到错误。
3.杨辉三角的不熟悉导致第二个没有思路可以下手。
4.汉诺塔问题
设计思路
先假设最简单的有3个盘子,要把上面两个放到中间B的位置,再把最底下的放到C位置,要把两个放到B上面又要把第一个放到C上,第二个放到B上,再把第一个放到B上,最后就是把B上第一个的放到A,第二个放到C,再把A上的放到C,就完成了。这就是一种递归,假设有n个盘子,先把(n-1)放到B坐,把最下面的放到C,(n-1)中又把(n-2)放到B,再拿出最底下的(n-1),一直重复最后放完。
程序流程图
程序源代码
import java.util.Scanner; public class Hannuota { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner input=new Scanner(System.in); int m; System.out.println("放入的盘子数:"); m=input.nextInt(); System.out.println("移动的步骤:"); buzhou(m,'A','B','C'); } public static void buzhou(int n,char one,char two,char three) { if(n==1) move(one,three); else{ buzhou(n-1,one,three,two); move(one,three); buzhou(n-1,two,one,three); } } public static void move(char x,char y) { System.out.println(x+"——>"+y); } }
实验截图
实验问题
1.由于要递归两次,所以导致该开始没有实现。
2.温馨提示就是c语言书中有操作步骤,可以作为参考。
5.回文数
实验思想
回文数就是说正着读,反着读都一样,也就是说如果只有一个字符,一定回文,两个一样的,一定回文,三个以上的话,最左边和最右边相同然后依次向里夹都相同就回文。“往里夹”就是要用递归的基本方式。这是这个程序的核心,整体的思路就是输入字符串,然后进行调用回文的递归函数,判断后,输出。
实验流程图
程序源代码
import java.util.Scanner; public class Hw { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner input=new Scanner(System.in); String s; System.out.println("输入要判断的字符:"); s=input.next(); System.out.println(huiwenshu(s)); } public static boolean huiwenshu(String s) { int length = s.length(); for(int i=0;i<length/2;i++){ if(s.charAt(i)!=s.charAt(length-i-1)){ return false; } } return true; } }
实验截图