1、使用计算机计算组合数
使用组合数公式利用n!来计算
(1)设计思想:设计功能函数fac()采用循环的方式,计算n!。在主类里输入所要计算的组合数的值,调用函数fac(),利用组合数计算公式计算出组合数。
(2)程序流程图:
(3)源程序代码:
import java.util.Scanner;
public class Cnumber {
public static void main(String[] args) {
long k,n,s,s1=1,s2=1,s3=1;
Scanner scan=new Scanner(System.in);
System.out.println("请输入:");
n=scan.nextInt();
k=scan.nextInt();
s=fac(s1,n)/(fac(s2,k)*fac(s3,(n-k)));//调用fac()函数
System.out.println("c(n,k)="+s);
}
public static long fac(long s,long n)//使用循环的方法计算n!
{
for(int i=1;i<=n;i++)
{
s=s*i;
}
return s;
}
}
(4)结果截图:
使用递推的方法用杨辉三角形计算
(1)设计思想:输入c(n,k),设计函数sum()采用递推的方法计算n!,在主类里调用。递推“从前至后”。
(2)程序流程图:
(3)源程序代码:
import java.util.Scanner;
public class Cnumber3 {
public static void main(String[] args) {
long k,n,s,s1=1,s2=1,s3=1;
Scanner scan=new Scanner(System.in);
System.out.println("请输入组合数c(n,k):");
n=scan.nextInt();
k=scan.nextInt();
System.out.println("c(n,k)="+sum(n,k));
}
static long sum(long n,long k)//递推
{
long s=1,s1=1,s2=1;
for(long i=1;i<=n;i++)
{
s=s*i;
}
for(long i=1;i<=k;i++)
{
s1=s1*i;
}
for(long i=1;i<=n-k;i++)
{
s2=s2*i;
}
return s/(s1*s2);
}
}
(4)结果截图:
使用递归的方法用组合数递推公式计算
(1)设计思想:设计递归函数计算阶乘,在主类里调用。
(2)程序流程图:
(3)源程序代码:
import java.util.Scblic class Cnumber2 {
public static void main(String[] args) {
long k,n,s,s1=1,s2=1,s3=1;
Scanner scan=new Scanner(System.in);
System.out.println("递推公式:c(n,k)=c(n-1,k-1)+c(n-1,k)");
System.out.println("请输入:");
n=scan.nextInt();
k=scan.nextInt();
s=fac(n-1)/(fac(k-1)*fac(n-k-2))+fac(n-1)/(fac(k)*fac(n-1-k));
System.out.println("c(n,k)="+s);
}
public static long fac(long n)//递归函数
{
long f=1;
if(n<0)
System.out.println("输入错误!");
if(n==0||n==1)
f=1;
else f=fac(n-1)*n;
return f;
}
}
(4)结果截图:
2、递归编程解决汉诺塔问题。用Java实现
(1)设计思想:输入盘子个数,设计两个函数move1()、move(),move1()函数实现从一个底座指向另一个底座的功能,move()为递归函数,在move()里调用move1(),在主类里调用move()。
(2)程序流程图:
(3)源程序代码:
import java.util.Scanner;
public class Hannuota {
public static void main(String[] args) {
int peg1=1;//三个底座定义为1,2,3
int peg2=2;
int peg3=3;
int n;//盘子的个数
Scanner scan=new Scanner(System.in);
System.out.println("input the number of diskes:");
n=scan.nextInt();
System.out.println("The step to move"+n+"diskes");
move(n,peg1,peg2,peg3);
}
public static void move(int n,int peg1,int peg2,int peg3)
{//将n个盘子借助peg2,移到peg3
if(n==1)
move1(peg1,peg3);
else
{
move(n-1,peg1,peg3,peg2);
move1(peg1,peg3);
move(n-1,peg2,peg1,peg3);
}
}
public static void move1(int p1,int p2)
{
System.out.println(p1+"->"+p2);
}
}
}
(4)结果截图:
3、使用递归方式判断某个字串是否是回文数
(1)设计思想:输入字符串定义i、j来比较前后位置的字符是否相同,设计递归函数judge(),在主类里调用。
(2)程序流程图:
(3)源程序代码:
import java.util.Scanner;
public class Huiwenshu
{
public static void main(String[] args)
{
String str=" ";
System.out.println("请输入要判断的字符串(true表示回文字串,false表示非回文字串)");
Scanner input=new Scanner(System.in);
str=input.next();
int j=str.length()-1;
int i=0;
System.out.println(Huiwenshu.judge(str,i,j));
}
public static boolean judge(String s,int i,int j)
{
if(i>j)
System.out.println("错误!");
if(i==j)
return true;
else
return(s.charAt(i)==s.charAt(j)) && judge(s,i+1,j-1);
}
}
(4)结果截图: