一.使用计算机计算组合数:
(1)使用组合数公式利用n!来计算
1. 设计思想:定义Calculate函数,函数中使用递归,用来求一个数的阶乘,然后要求用户输入n和k的值,然后利用公式计算出相应的组合数。
2. 程序流程图:
3.实验代码
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("求组合数C(n,k):(n为下标)");//用户输入
System.out.print("请输入n,k:");
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int k = scan.nextInt();
if(n<k)
System.out.println("ERROR!");
else if(n==0&&k==0)
System.out.println("1");
else
System.out.print("C("+n+","+k+")="+Calculate(n)/Calculate(k)/Calculate(n-k));
}
public static long Calculate(int n) {
if(n==1)
{
return 1;
}
return n*Calculate(n-1);
}
}
4. 截图
(2)使用递推的方法用杨辉三角形计算
1. 设计思想:要求用户输入n和k,然后如果k=1的话,直接输出n,如果k不等于1的话,调用递归函数求出对应的n,k-1的组合数和n,k的组合数,并且进行相加,输出结果。
2. 程序流程图
3. 实验代码:
package homework;import javax.swing.JOptionPane; public class Test3 {
public static void main(){
int n,k;
String s=JOptionPane.showInputDialog("请输入一个正整数作为n");
n=Integer.parseInt(s);
String s1=JOptionPane.showInputDialog("请输入一个正整数作为k");
k=Integer.parseInt(s1);
JOptionPane.showMessageDialog( null, digui(k,n),"在n个元素中选取k个组合的所有结果数",JOptionPane.INFORMATION_MESSAGE );
}
public static long digui(int k,int n){
long j=0;
if(k!=1)
j=digui(k-1,n)+digui(k,n);
else
return n;
return j;
}
}
4. 截图
(3)使用递归的方法用组合数递推公式计算
1. 设计思想:定义一个andsum函数,用来求累计的和,在andsum函数中,当要求的值为1时输出0,是1时输出1,既不是1也不是0时,就递归调用andsum函数,达到叠加的效果。
2. 实验流程图
3. 实验代码
package digui;import java.math.BigInteger;import java.util.Scanner;import java.util.*;public class digui {
public static void main(String[] args){
System.out.println("输入正整数n:");
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
System.out.println(a+"累加和为:"+andsum(a));
}
public static int andsum(int a)
{
if(a==0) return 0;
else if(a==1) return 1;
return a+andsum(a-1);
}
}
4. 结果截图
二.递归编程解决汉诺塔问题。用Java实现
1. 设计思想:首先定义hanoita 函数,函数中递归调用hanoita 函数,先将n-1个盘子从A移到C,再从C移到B。递归,一直到n=1.2.
2.实验流程图
3. 实验代码
import java.util.Scanner;
public class hanoita {
public static int m;
public static void main(String args[])
{
System.out.println("请输入要挪动盘子的个数:");
Scanner scanner=new Scanner(System.in);//组合数的下标
int m=scanner.nextInt();
System.out.println("移动盘子的步骤是:");
hanoi(m,'A','B','C');
}
public static void hanoi(int n,char one,char two,char three)//将n个盘从one座借助two座,移到three座
{
if(n==1)
{
move(one,three);
}
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
public static void move(char x,char y)
{
System.out.println(x+"-->"+y);
}
}
4.实验结果截图
三.使用递归方式判断某个字串是否是回文( palindrome )
1. 设计思想:定义一个函数,用来返回true或者是false,最先让i=o,j为str.length() - 1,public static boolean isPalindrome(String s,int i,int j)函数用来判断是否是回文,反复调用该函数,从第一个和最后一个比较,然后第二个和倒数第二个比较,一直到比较完所有字符。在主函数中要求用户输入字符,然后调用函数判断是否是回文数,并返回相应的true或false.
2. 程序流程图:
3.实验代码
package dome;
import java.util.Scanner;
public class huiwen1 {
public static void main(String[] args){
System.out.println("请输入字符");
Scanner s=new Scanner(System.in); //输入一个字符串
String str=null;
str=s.next();
int i = 0;
int j = str.length() - 1;
System.out.println(str + " 回文吗?" +isPalindrome(str, i, j));
}
public static boolean isPalindrome(String s,int i,int j){
if(i > j)
return false;
if(i == j)
return true;
else{
return (s.charAt(i) == s.charAt(j)) && isPalindrome(s,i+1,j-1);
}
}
}
4.截图