一.使用计算机计算组合数

1.使用组合数公式利用n!来计算

(1)设计思想

 首先定义阶乘函数的算法,在计算组合数的公式中调用阶乘函数

(2)程序流程图

 

(3)源代码

package jiecheng;
import java.util.Scanner;
public class jiecheng
{
public static int jiecheng0(int j)//计算j的阶乘,结果为k
{
int k=1;
Scanner input=new Scanner(System.in);
j=input.nextInt();
for(int i=1;i<=j;i++)//利用循环结构计算阶乘
{
k=k*i;
}
return k;
}
public static void main(String[] args)
{
Scanner input1=new Scanner(System.in);
System.out.println("请输入组合数的上标");
int k=input1.nextInt();
System.out.println("请输入组合数的下标");
int n=input1.nextInt();
if(k>n)
{
System.out.println("输入有误");
}
else//计算组合数
{
int m;
m=jiecheng0(n)/(jiecheng0(k)*jiecheng0(n-k));
System.out.println("组合数值为"+m);
}
}
}

(4)结果截图

2.使用递推的方法用杨辉三角形计算

(1)设计思想

先构建杨辉三角,再利用杨辉三角计算组合数

(2)程序流程图

 

(3)源代码

package yanghui;
import java.util.Scanner;
public class yanghui
{
public static void main(String args[])
{
Scanner input=new Scanner(System.in);
int n,k;//组合数公式中的n k
System.out.println("请输入组合数公式的n和k:");
n=input.nextInt();
k=input.nextInt();
int [][]f=new int[27][27];//构建杨辉三角
f[0][0] = 1; 
for(int i = 1;i <= 24;i++) 

  for(int j = 1;j <= i + 1;j++) 

  f[i][j] = f[i - 1][j - 1] + f[i - 1][j]; 
  } 

System.out.println("组合结果为"+f[n+1][k+1]);//输出结果
}
}

(4)结果截图

3.使用递归的方法用组合数递推公式计算

(1)设计思路

定义一个递归函数,反复调用得出组合数

(2)程序流程图

 

(3)源代码

package digui;
import java.util.Scanner;
public class digui
{
public static void main(String args[])
{
Scanner input=new Scanner(System.in);
int n,k;//组合数公式中的n k
System.out.println("请输入组合数公式的n和k:");
n=input.nextInt();
k=input.nextInt();
System.out.println("组合结果为"+ZuHe(n,k));
}
public static long ZuHe(int a,int b)//构造递归函数
{
if(b==0)
return 1;
else if(a==1)
return 1;
else if(a==b)
return 1;
else

return (ZuHe(a-1,b-1)+ZuHe(a-1,b));
}
}

(4)结果截图

二.递归编程解决汉诺塔问题(用Java实现)

(1)设计思路

利用递归函数不断分解移动步骤,直到分解为求三个盘子的移动操作

(2)程序流程图

 

 

(3)源代码

import java.util.Scanner;
public class hannuota
{
public static void move(char x,char y)
{
System.out.printf("%c->%c", x,y);
System.out.println();
}
public static void hannuota(int n,char one,char two,char three)
{
if(n==1)
move(one, three);
else
{
hannuota(n-1, one, three, two);
move(one, three);
hannuota(n-1, two, one, three);
}
}
public static void main(String[] args)
{
Scanner input= new Scanner(System.in);
System.out.println("请输入汉诺塔的个数:");
int a =input.nextInt();
System.out.println("移动步骤:");
hannuota(a, 'x','y','z');
}
}

(4)结果截图

三.使用递归方式判断某个字串是否是回文( palindrome )

(1)设计思路

从字符数组的两端开始判断它是否符合回文的规则 

(2)程序流程图

 

(3)源代码

package huiwenzifuchuan;
import java.util.Scanner;
public class huiwenzifuchuan
{
public static void main(String[] args)
{
System.out.println("请输入一个字符串:");
Scanner scan = new Scanner(System.in);
String temp;
char[] arr;
int i, j, len; //接收输入的字符串
temp = scan.nextLine(); //将字符串temp中的全部字符存入字符数组arr中
arr = temp.toCharArray();
len = arr.length; //从字符数组的两端开始判断它是否符合回文的规则
for(i=0,j=len-1; i<j; i++,j--)
{
if(arr[i] != arr[j])
{
break;
}
} //根据判断是否全部完成来决定它是否是回文串
if(i >= j)
{
System.out.println(temp + " 是回文字符串");
}
else
{
System.out.println(temp + " 不是回文字符串");
}
}
}

(4)结果截图