zoukankan      html  css  js  c++  java
  • 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("不是回文字符串");

    }

    }

    测试结果截图

    总结

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

  • 相关阅读:
    选择排序与冒泡排序
    判断是否为偶数
    mysql基础之mysql双主(主主)架构
    mysql基础之mysql主从架构半同步复制
    mysql基础之mysql主从架构
    mysql基础之数据库备份和恢复实操
    mysql基础之数据库备份和恢复的基础知识
    mysql基础之日志管理(查询日志、慢查询日志、错误日志、二进制日志、中继日志、事务日志)
    mysql基础之查询缓存、存储引擎
    mysql基础之数据库变量(参数)管理
  • 原文地址:https://www.cnblogs.com/wys-373/p/7660593.html
Copyright © 2011-2022 走看看