一:使用计算机计算组合数
(1)使用组合数公式用n!来计算
程序设计思想:利用递归的思想来定义方法jc()来及计算n!,并根据组合数公式C(m,n)=n!/m!*(n-m),定义一个变量sum,
用来输出结果,将n,m,n-m,代入jc(),输出结果。
程序流程图:
程序源代码:
import java.util.Scanner;
public class Zuheshu{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入两个数:");
int k =sc.nextInt();
int n =sc.nextInt();
int sum =jc(n)/(jc(k)*jc(n-k));
System.out.println(sum);
}
private static int jc(int s) {
if(s==0||s==1)
return 1;
else{
return s*jc(s-1);
}
}
}
程序测试截图:
(2)使用递归的方法用杨辉三角来计算组合数
程序设计思想:
定义一个二维数组T存储杨辉三角形,循环赋值构造杨辉三角形:并使T[i][0] = 1,T[i][i] = 1,其中每个T[i][j] =T[i - 1][j - 1] + T[i - 1][j]。所以C(m,n)=T[n][k],
最后输出结果。
程序流程图:
程序源代码:
import java.util.Scanner;
public class zuuheshu {
public static void main(String[] args) {
System.out.print("请输入组合数中的底数m:");
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
System.out.print("请输入组合数中的阶数n:");
int n= sc.nextInt();
System.out.println("该组合数的结果为:"+T(m,n));
}
public static int T(int m,int n){
int[][] S = new int[m + 1][m + 1];
S[0][0] = 1;
for(int i = 0;i < m + 1;i++)
{
S[i][0] = 1;
S[i][i] = 1;
}
for(int i = 2;i < m + 1;i++)
{
for(int j = 1;j < i;j++)
{
S[i][j] = S[i - 1][j - 1] + S[i - 1][j];
}
}
return S[m][n];
}
}
程序测试截图:
(3)使用递归的方法用组合数递推公式计算
程序设计思想:
定义n,k求组合数函数C(n,k)。当k = 0或n = k时,返回值为1。否则,根据递推公式,C(n,k) = C(n - 1,k - 1) + C(n - 1,k),
最后输出结果。
程序流程图:
程序源代码:
import java.util.Scanner;
public class zuuuheshu {
public static void main(String[] args) {
System.out.print("请输入组合数中的底数m:");
Scanner sc = new Scanner(System.in);
int sc_m = sc.nextInt();
System.out.print("请输入组合数中的阶数n:");
int sc_n = sc.nextInt();
System.out.print("该组合数的结果为:"+jisuan(sc_m,sc_n));
}
public static long jisuan(int m,int n)
{
if(m == n || n == 0)
return 1;else
return jisuan(m - 1,n - 1)+jisuan(m - 1,n);
}
}
程序测试截图:
二:递归编程解决汉诺塔问题
程序设计思想:
当盘子的个数n=1时,直接从A移动到C;n>1时,可将其分为三个步骤:1)将上面n-1个盘子从A座移到B座上。2)将剩下的一个盘子从A座移到C座上。
(3)将B座上的n-1个盘子从B座移动到C座上。设置变量n为盘子数,根据n的不同输出结果。
程序流程图:
程序源代码:
import java.util.Scanner;
public class Hanoi {
public static void main(String args[]){
System.out.println("请输入要移动的块数:");
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
move(n,'a','b','c');
}
public static void move(int n,char a,char b,char c){
if(n==1){
System.out.println(a+"-->"+c);
}
else{
move(n-1,a,c,b);
System.out.println(a+"-->"+c);
move(n-1,b,a,c);
}
}
}
程序测试截图:
三:使用递归判断方式判断某个字符串是否为回文
程序设计思想:
首先判断字符串如果小于等于1,则返回为true。若果字符串第一个与最后一个不相等,则输出为false,然后递归调用subString函数每次去掉头和尾,进行
判断。
程序流程图:
程序源代码:
import java.util.Scanner;
public class Huiwenshu {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
System.out.println("请输入字符串:");
String skt = sc.nextLine();
System.out.println("Is it a Palindrome?"+isPalindrome(skt));
}
public static boolean isPalindrome(String s){
if(s.length()<=1){
return true;
}else if(s.charAt(0) != s.charAt(s.length()-1)){
return false;
}
return isPalindrome(s.substring(1,s.length()-1));
}
}
程序测试截图: