zoukankan      html  css  js  c++  java
  • 课程作业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;
    }
    }

    结果截图:

  • 相关阅读:
    云计算和大数据时代网络技术揭秘(八)数据中心存储FCoE
    云计算和大数据时代网络技术揭秘(七)大二层网络
    云计算和大数据时代网络技术揭秘(六)LISP协议
    云计算和大数据时代网络技术揭秘(五)可靠的网络
    云计算和大数据时代网络技术揭秘(四)网络加密
    云计算和大数据时代网络技术揭秘(三)安全的网络准入
    python3练习100题——027
    python3练习100题——026
    python3练习100题——025
    python3练习100题--024
  • 原文地址:https://www.cnblogs.com/iCheny/p/7665647.html
Copyright © 2011-2022 走看看