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

1.程序设计思想

(1)用户输入n和k的值。

(2)判断n是否大于等于k,若是,继续运行程序,否则结束程序。

(3)调用计算阶乘的方法,在此方法中,若输入的数字为0或1,返回1;若不是,则用递归的方法重复调用此方法计算阶乘。

2.程序流程图

3.源代码

import java.util.Scanner;
public class digui {
 public static int jiecheng(int x)
 {
  int y=1;
  if(x==1||x==0)
   y=1;
  else y=jiecheng(x-1)*x;
  return y;
 }
  
 public static void main(String args[]) {
  int n ,k,c;
  Scanner in=new Scanner(System.in);
  System.out.print("输入从n个数中选k个数中n,k的值:");
  n=in.nextInt();
  k=in.nextInt();
  System.out.println("结果为:");
  c=jiecheng(n)/(jiecheng(k)*jiecheng(n-k));
  System.out.println(c);
 }

}

4.实验结果截图

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

1.程序设计思想

(1)用户输入组合数的n和k。

(2)定义一个(n+1)*(n+1)的二维数组用来放杨辉三角的数值。

(3)利用循环嵌套完成杨辉三角中每个位置数值的计算。先为每一行赋值,每行的第一个数和最后一个数均为1,其余位置为上一行的第k-1和k个数的和,然后为下一行赋值。

(4)输出指定位置的数值。

2.程序流程图

3.程序源码

import java.util.Scanner;
public class yang {

 public static void main(String args[]) {
  Scanner sc=new Scanner(System.in);
  System.out.print("输入N值:");
  int n=sc.nextInt();
  System.out.print("输入K值:");
  int k=sc.nextInt();
  
  int[][] a=new int[n+1][n+1];
 
  for(int i=0;i<n+1;i++)
  { 
 
   for(int j=0;j<=i;j++) {
   
    if(j==0||j==i)
     {
     a[i][j]=1;
     System.out.print(a[i][j]+" ");
     }
    else
     {
     a[i][j]=a[i-1][j-1]+a[i-1][j];
     System.out.print(a[i][j]);
     System.out.print(" ");
     }
   }

   System.out.println();
  }  
   if(n<2||k==1)
   System.out.println("num=1");
   else System.out.println("num="+a[n][k-1]+"="+a[n-1][k-2]+"+"+a[n-1][k-1]);
 }
}

4.实验结果截图

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

1.程序设计思想

(1)提示用户输入组合数中n和k的值。

(2)判断n和k是否合法,若不合法,则结束程序;合法,继续程序。

(3)定义计算组合数的方法。如果输入的k=0或n,则 =1;如果k=1,则其他情况则根据公式 计算。

(4)输出结果并结束程序。

2.程序流程图

3.程序源码

import java.util.Scanner;
public class ditui2 {

public static void main(String args[]) {
Scanner sc=new Scanner(System.in);
System.out.print("输入N值:");
int n=sc.nextInt();
System.out.print("输入K值:");
int k=sc.nextInt();
System.out.println("结果为:"+C(n,k));
}
public static int C(int n,int k)
{
if(n<0||k<0||n<k)
return 0;
if(n==k)
return 1;
if(k==1)
return n;
return C(n-1,k)+C(n-1,k-1);
}
}
4.结果截图

四.递归编程解决汉诺塔问题

1. 程序设计思想

(1)提示用户输入盘子数量。

(2)调用方法解决汉诺塔问题。

将n个盘子从第一根柱子移到第三根柱子上的方法为:①先将n-1个盘子借助第三根柱子移到第二根柱子上。②再将第一根柱子上的最大的盘子移到第三根柱子上。③然后将第二根柱子上的n-1个盘子借助第一根柱子移到第三根柱子上。

将n-1个盘子从第二根柱子上移到第三根柱子上的方法为:①先将n-2个盘子借助第三根柱子移到第一根柱子上②再将第二根柱子上的最大的盘子移到第三根柱子上。③然后将第一根柱子上的n-2个盘子借助第二根柱子移到第三根柱子上。

而移动n-2个盘子的方法又类似于移动n个盘子的方法,以此类推。上述的第一、二、三根柱子可视为初始柱、过渡柱以及目标柱。移动n个盘子三步可视为:①将n-1个盘子由初始柱借助目标柱移到过渡柱。②将初始柱上的最大的盘子直接移到目标柱。③将n-1个盘子由过渡柱借助初始柱移到目标柱。借助递归的方法可解决汉诺塔的问题。

(3)在方法中,先判断盘子数量是否为1,若为1,则直接将第一根柱子上的盘子移到第三根上;否则,先将n-1个盘子移动到过渡柱上,再将初始柱上的盘子移到目标柱上,再将n-1个盘子由过渡柱移到目标柱上。递归调用该方法,每次调用移动的盘子是上一次减一个。

(4) 直到算出结果,将结果显示在屏幕,程序结束。

2.程序设计流程

 

 

 

3.程序源码

import java.util.*;
public class HanoiTower {
 public static void main(String[] args) {
   @SuppressWarnings("resource")
   Scanner sc=new Scanner(System.in);
   int n;
   System.out.println("Please enter the number of your dished(Hanoi Tower):");
   n=sc.nextInt();
   System.out.println("The number of the times you need to move the dishes is:"+new HanoiTower().hanoiTower(n));
   HanoiTower HanoiTower = new HanoiTower();
   HanoiTower.move(n, 'A', 'B', 'C');
  
 }
 
 public int hanoiTower(int n) {
  if(n==1) return 1;
  else return hanoiTower(n-1)*2+1;
 } 
 
 public void move(int n, char a, char b, char c) {
           if (n == 1)
              System.out.println("盘 " + n + " 由 " + a + " 移至 " + c);
         else {
             move(n - 1, a, c, b);
             System.out.println("盘 " + n + " 由 " + a + " 移至 " + c);
             move(n - 1, b, a, c);
          }
  }

}

4.结果截图

五.使用递归方式判断某个字串是否回文

1. 程序设计思想

(1)提示用户输入字符串。
(2)将字符串类型数据转成字符数组便于比较对称位置上的字符。
(3)定义判断是否是回文的方法,参数为每次要判断的字符的位置。若字符的位置超过字符数组的的一半,说明字符串为回文;判断一对对称位置上的字符是否一致,若一致则判断下一对对称位置上的字符是否一致,如不一致则不是回文。
(4)在主函数中调用判断是否一个字符串是否为回文的方法,因为在数组中一个元素下标为0,所以调用时参数应为0,并做相应输出。

2.程序流程图

 

 

 

3.实验源码

import java.util.Scanner;
public class huiwen
{
private static int len;
private static char p[];

System.out.println(" 请输入要判断的字符串");

 public static void main(String args[]){
  Scanner sc=new Scanner(System.in);
  String str;
  str=sc.nextLine();
  len=str.length();
  p=str.toCharArray();
  if(huiwen(0))
  System.out.println(str+" 是回文!");
  else System.out.println(str+" 不是回文!");

 }


 public static boolean huiwen(int n){
   if(n>=len/2)
   return true;
   if(p[n]==p[len-1-n])
  return huiwen(n+1);
  else return false; 
 }        
 }

4.结果截图

 

 

posted on 2017-10-14 10:59  如果,当时。  阅读(125)  评论(0编辑  收藏  举报