课程作业03:用递归方法计算组合数、解决汉诺塔问题、判断某个字符串是否回文

课后作业1:使用计算机计算组合数

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

程序设计思想:

设计并调用大数求阶乘的方法结合组合数公式计算组合数的值。

程序流程图:

 

 

程序源代码:

 

//信1605-2 张晨阳 20160955
/*
* 设计目的:设计并调用大数阶乘方法来计算组合数。
*/
package homework1;

 

import java.math.BigInteger;//引入BigInteger类包
import java.util.Scanner;//引入Scanner类包

 

public class Homework1
{
public static void main(String[] args)
{
System.out.print("请输入组合数中的n和k:");
Scanner input=new Scanner(System.in);//为Scanner类创建对象input,调用System.in传参
int n=input.nextInt();//调用input对象的方法输入并将输入的字符串转化为整型存到n中
int k=input.nextInt();//调用input对象的方法输入并将输入的字符串转化为整型存到k中
while(n<0||k<0||n<k)//判断n,k的值是否合理
{
System.out.print("输入错误,请重新输入n和k的值:");
n=input.nextInt();
k=input.nextInt();
}
BigInteger c;//定义长整型变量c用于存取组合数结果
c=N(n).divide(N(k)).divide(N(n-k));//调用递归求大数阶乘的方法
System.out.println("组合式运算结果为:"+c);
}
public static BigInteger N(int n)//递归求大数阶乘的方法
{
if(n==0||n==1)
{
return BigInteger.valueOf(1);
}
else
{
return BigInteger.valueOf(n).multiply(N(n-1));//递归调用
}

}

}

 

结果截图:

 

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

程序设计思想:

使用递推的方法创建杨辉三角型二维数组来计算组合数。

程序流程图:

         

程序源代码:

//信1605-2 张晨阳 20160955
/*
* 设计目的:使用递推的方法创建杨辉三角型二维数组来计算组合数。
*/
package homework1;

import java.util.Scanner;//引用Scanner类包

public class Homework2
{
public static void main(String[] args)
{
System.out.print("请输入组合数中n的值:");
Scanner input=new Scanner(System.in);//为Scanner类创建对象input,调用System.in传参
int n=input.nextInt();//调用input对象的方法输入并将输入的字符串转化为整型存到n中
System.out.print("请输入组合数中k的值:");
int k=input.nextInt();//调用input对象的方法输入并将输入的字符串转化为整型存到k中
while(n<0||k<0||n<k)//判断n,k的值是否合理
{
System.out.print("输入错误,请重新输入n和k的值:");
n=input.nextInt();
k=input.nextInt();
}
long[][] a=new long[n+1][];//创建并为二维数组开辟行空间
for(int i=0;i<=n;i++)
{
a[i]=new long[n+1];//为每个行空间分别开辟列空间
}
a[0][0]=1;
for(int i=1;i<=n;i++)//为每个数组元素赋初值
{
for(int j=0;j<=n;j++)
{
if(j==0||j==n)
{
a[i][j]=1;
}
else
{
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
}
System.out.print("组合数运算结果:"+a[n][k]);//输出结果
}

}

结果截图:

 

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

程序设计思想:

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

程序流程图:

         

程序源代码:

//信1605-2 张晨阳 20160955
/*
* 设计目的:使用递归的方法用组合数递推公式计算组合数。
*/
package homework1;

import java.math.BigInteger;//引入BigInteger类包
import java.util.Scanner;//引入Scanner类包

public class Homework3
{
public static void main(String[] args)
{
System.out.print("请输入组合数中n的值:");
Scanner input=new Scanner(System.in);//为Scanner类创建对象input,调用System.in传参
int n=input.nextInt();//调用input对象的方法输入并将输入的字符串转化为整型存到n中
System.out.print("请输入组合数中k的值:");
int k=input.nextInt();//调用input对象的方法输入并将输入的字符串转化为整型存到k中
while(n<0||k<0||n<k)//判断n,k的值是否合理
{
System.out.print("输入错误,请重新输入n和k的值:");
n=input.nextInt();
k=input.nextInt();
}
System.out.print("组合数的结果为:"+N(n,k));//调用N方法
}
public static BigInteger N(int n,int k)//用递归的方法借助组合数递推公式求组合数
{
if(n==k||k==0)
{
return BigInteger.valueOf(1);
}
else
{
BigInteger[][] a=new BigInteger[n+1][];//创建并为二维数组开辟行空间
for(int i=0;i<=n;i++)
{
a[i]=new BigInteger[n+1];//为每个行空间分别开辟列空间
}
a[n][k]=N(n-1,k-1).add(N(n-1,k));//递归调用并求和
return a[n][k];
}
}

}

结果截图:

课后作业2:用递归编程解决汉诺塔问题

程序设计思想:

  假设只有一个盘子,那么只需实现 A->C 这个动作;

  如果有两个盘子,那么需要

  (1)A->B;

  (2)A->C;

  (3)B->C;

  如果有三个盘子,可以将前两个盘子看作一个盘子,对两个盘子重复以上三个步骤,于是得到N个盘子的递归算法,递归结束的条件是N=1;

程序流程图:

程序源代码:

//信1605-2 张晨阳 20160955
/*
* 设计目的:递归调用编程解决汉诺塔问题。
*/
package homework1;

import java.util.Scanner;//引入Scanner类包

public class Homework4
{
public static void main(String[] args)
{
System.out.print("请输入盘子数n的值:");
Scanner input=new Scanner(System.in);//为Scanner类创建对象input,调用System.in传参
int n=input.nextInt();//调用input对象的方法输入并将输入的字符串转化为整型存到n中
moveDish(n, 'A', 'B', 'C'); //调用moveDish方法
}
public static void moveDish(int l, char f, char i, char t) //创建moveDish方法
{
if (l == 1)
{
System.out.println("从" + f + " 移动盘子" + l + " 到" + t);
} else {
moveDish(l - 1, f, t, i);
System.out.println("从" + f + " 移动盘子" + l + " 到" + t);
moveDish(l - 1, i, f, t);
}
}
}

结果截图:

课后作业3:使用递归方式判断某个字符串是否回文

程序设计思想:

字符串直接调用Scanner输入即可,这道题目重点在于判断是否为回文字符串的方法构建,用str.length()判断长度,str.charAt()接收字符,判断是否为回文字符串,找好对应位置是关键,a=str.length()-n, b=str.length()-(a+1),两者一个从头开始,一个从尾部开始,相向而行,运用递归算法判断对应位置的值是否一样,当两者一样,进行一次确定,只有一个字符就是回文数。

程序流程图:

程序源代码:

//信1605-2 张晨阳 20160955
/*
* 设计目的:使用递归方式判断某个字串是否回文。
*/
package homework1;

import java.util.Scanner;//引入Scanner类包

public class Homework5
{
public static void main(String[] args)
{
System.out.println("请输入一个字符串:");
Scanner input=new Scanner(System.in);//为Scanner类创建对象input,调用System.in传参
String str=input.next();//将输入的字符串存到str中
int i=str.length();//计算str的长度存到i中
int j=panDuan(str,i);//调用panDuan方法,用j控制开关
if(j==1)
{
System.out.println("该字符串是回文的");
}
else
{
System.out.println("该字符串不是回文的");
}
}

public static int panDuan(String str,int n)//构造判断字符串是否回文的方法
{
int a,b,t=0;
char p,q;
a=str.length()-n;
b=str.length()-(a+1);
p=str.charAt(a);
q=str.charAt(b);
if(p==q||a==b)
{
t=1;
}
if(a!=b&&a<b&&t==1)
{
panDuan(str,n-1);
}
return t;
}
}

结果截图:

posted @ 2017-10-14 08:55  Felix_9190  阅读(482)  评论(0编辑  收藏  举报