第一题

利用递归求组合数

设计思想

(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("不是回文字符串");

}

}

测试结果截图

总结

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

最新文章

  1. 修改linux文件权限
  2. iOS开发之集成iOS9中的Core Spotlight Framework搜索App的内容
  3. Linux内核分析 第二周
  4. MorkDown 常用语法总结
  5. NodeJS模块的使用
  6. IOS中延时执行的几种方式的比较
  7. 强大的矢量图形库:Raphael JS 中文帮助文档及教程
  8. Haskell 函数式编程
  9. Spring AOP实现声明式事务代码分析
  10. Apache配置详解【转】
  11. ACM 海贼王之伟大航路(深搜剪枝)
  12. Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发
  13. 这20个常规Python语法你都搞明白了吗?
  14. codeforces476D
  15. echarts-环形图处理图列中的点击,使百分比的数据列不发生变化,默认追加其他选项
  16. ajax json 表格排序,分页,自己定义每页数量
  17. Sql 中存储过程详细案例
  18. 小工具:使用Python自动生成MD风格链接
  19. poj3017 Cut the Sequence 单调队列 + 堆 dp
  20. IDA问题相关

热门文章

  1. rocketMQ broker 分发并处理请求
  2. Selenium 2自动化测试实战4(引用模块)
  3. Oracle 数据字典视图(V$,GV$,X$)
  4. python3.5 元组
  5. 自动部署脚本-bash
  6. LeetCode.1051-身高检查器(Height Checker)
  7. unable to compile class for jsp解决方案
  8. 【VS开发】【图像处理】自动白平衡(AWB)算法---色温曲线
  9. angular - ngFor, trackby
  10. Python 爬取煎蛋网妹子图片