java作业利用递归解决问题

第一题

利用递归求组合数

设计思想

(1)首先根据公式求,利用递归完成阶乘函数的初始化,并且通过调用阶乘,实现公式计算

(2)递推方法,根据杨辉三角的特点,设置二维数组,从上到下依次保存杨辉三角所得数,并且每次判断,行列和用户想要得到数的行列是否相同

(3)递归方法,递归调用函数,通过地递推公式从后往前推导  求C[n,k]=C[n-1,k-1]+C[n-1,k],根据这个公式直到n=1或者k=0;或者n=k相等时结束

程序流程图

程序源代码


import java.util.Scanner;

public class Yanghui {
public int Jiecheng(int i){ //递归阶乘
if(i==1||i==0)
{
return 1;
}
return i*Jiecheng(i-1);

}
public int Ditui(int i,int j)
{
int a[][]=new int[100][100]; //声明二维数组用来储存杨辉三角
a[0][0]=1;
int result=1; //用来保存结果
for(int p=1;p<100;p++)
for(int q=0;q<=p;q++)
{
if(q==0||p==q) //杨辉三角的两腰上的数为1
{
a[p][q]=1;
}
else
a[p][q]=a[p-1][q-1]+a[p-1][q]; //递推求结果
if(p==i&&q==j) //判断是不是要输出的结果
{
result=a[p][q];
break;
}

}

return result;
}
public int Zuhe(int i,int j)//组合数公式的下标
{
if(i==0||j<=1||i==j)
{
return 1;
}
return Zuhe(i-1,j-1)+Zuhe(i-1,j);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Yanghui yh=new Yanghui();
System.out.println("请输入组合数下标和行标(用空格或者回车区分)");
Scanner input=new Scanner(System.in);
int hang=input.nextInt(); //组合数的下标
int lie=input.nextInt(); //组合数上标
int fenzi,fenmu;
fenzi=yh.Jiecheng(hang); //使用阶乘方式计算结果的分子
fenmu=yh.Jiecheng(lie)*yh.Jiecheng(hang-lie); //计算分母
System.out.println("利用阶乘计算结果:"+fenzi/fenmu+" "); //输出结果
System.out.println("利用递推方式计算结果:"+yh.Ditui(hang, lie)+" ");
System.out.println("利用递归方式计算结果:"+yh.Zuhe(hang+1, lie+1)+" ");

}

}

测试结果截图

第二题

汉诺塔问题

设计思想

题目要求将n个盘子借助2号杆从1号到3号,首先想假如是两个盘子,就是把第一个放到2.第二个放到三,再将二号放到三号。假如是三个就将上边两个借助三号放到二号,再将最后一个放到三号,在把二号的借助一号放到三号。依次类推。利用递归实现。就是从n个盘子开始,将n-1个移到二号,在将最后一个移到三,将二号上的借助一号移到三。那么n-1个移到二号也是如此,知道只剩一个盘子,算法结束。

程序流程图

程序源代码


import java.util.Scanner;

public class Hannt {
public void Hnt(int a,char one,char two,char three){ //将one上的借助two移到三
if(a==1)
move(one,three);
else
{
Hnt(a-1,one,three,two); //从one借助three移动到two
move(one,three);
Hnt(a-1,two,one,three);
}
}
public void move(char x,char y){
System.out.println(x+"->"+y); //从x移到y
}

public static void main(String[] args) {
// TODO Auto-generated method stub
Hannt h=new Hannt();
Scanner input=new Scanner(System.in);
System.out.print("请输入初始盘子数量:");
int num=input.nextInt();
h.Hnt(num,'1','2','3');

}

}

测试结果截图

第三题

检查字符串是否为回文数

设计思想

统计字符串长度,然后定义两个数,一个保存初始位置,第二保存末尾位置,通过字符串中提取函数,提取相对位置字符,并匹配是否相同,每次执行后长度都减二,直到长度为零或一,并输出结果。

程序流程图

程序源代码

import java.util.Scanner;

public class Huiwen {
public int Hw(String str,int length,int star,int stop){
if(length==0||length==1)
{
return 1;
}
if(str.charAt(star)!=str.charAt(stop))
{
return 0;
}
else
{
return Hw(str,length-2,star+1,stop-1);
}

}

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input=new Scanner(System.in);
String s=input.nextLine();
Huiwen hw=new Huiwen();
int l=s.length();
if(hw.Hw(s, l, 0, l-1)==1)
{
System.out.println("是回文字符串");
}
else
System.out.println("不是回文字符串");

}

}

测试结果截图

总结

这三个题都是根据递归完成的,在过程中遇到的错误大都是递归无法跳出,结束条件不完整导致直接报错。所以在下次应该仔细检查结束条件,这是最重要的。

原文地址:https://www.cnblogs.com/wys-373/p/7660593.html