课后作业1

Posted BadGuyhaha

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了课后作业1相关的知识,希望对你有一定的参考价值。

课后作业1:

(1)

 设计思想:

 本题利用了数学公式将原式化为几个求阶乘的式子之间的运算,再利用递归算法求阶乘,因为1的阶乘是1,所以递归算法的结束条件就是当n等于1时,n的阶乘等于一,然后再依次计算,如此可求出n的阶乘。进而可求原式。

 程序流程图:

 

程序源代码:

import java.math.BigInteger;

import java.util.Scanner;

public class Yanghui_1

{

        public static void main(String [] args)

       {

          boolean p;                 //用于判断输入的数字是否符合条件

           System.out.println("请输入nk");                             //提示用户输入nk

           Scanner input=new Scanner(System.in);

           int n=input.nextInt();                                           //定义并给n赋值

           int k=input.nextInt();                                          //定义并给k赋值

           if(n<k)                                                                //判断输入的数据是否符合条件
             p=false;
          else
             p=true;
           while(p==false)
          {
                System.out.println("输入的数据不符合规则,n应该大于k,请重新输入:");
                 n=input.nextInt();     
                k=input.nextInt();
                if(n<k)
                p=false;
                else
                p=true;
           }

          int result1=f(k)*f(n-k);            //定义第一个变量存储分母结果

          int result=f(n)/result1;                    //定义第二个变量存储结果

           System.out.println("结果为:"+result);

     }

  public static BigInteger calculate(int n)          //大数据处理

  {

            if(n==1||n==0)

           {

                return BigInteger.valueOf(1);

           }

          return BigInteger.valueOf(n).multiply(calculate(n-1));

  }

  public static int f(int m)                    //利用递归进行计算

  {

  int c;

 if(m==1)

 c=1;

 else

 c=m*f(m-1);

 return c;

  }

}

 

 结果截图:

(2)

程序设计思想;

本题利用递推思想运算,首先提示用户输入n和k,然后声明一个二维数组,数组大小为c[n+1][n+1],然后把二维数组的第一列全赋值为1,第一行除了第一个元素外全为0,

然后通过循环以及杨辉三角的原理即c[i][j]=c[i-1][j-1]+c[i-1][j];然后计算出二维数组的各值,而所求的式子就等于对应的c[n][k].

程序流程图:

程序源代码:


import java.util.Scanner;
public class Yanghui_2
{
  public static void main(String [] args)
  {
   boolean p;
   System.out.println("请输入n和k");       //提示用户输入n和k 
   Scanner input=new Scanner(System.in);
   int n;
   int k;
   n=input.nextInt();     //定义并给n赋值
   k=input.nextInt();     //定义并给k赋值
   if(n<k)                               //判断输入的数据是否符合条件
   p=false;
   else
   p=true;
   while(p==false)
   {
    System.out.println("输入的数据不符合规则,n应该大于k,请重新输入:");
    n=input.nextInt();     
    k=input.nextInt();
    if(n<k)
     p=false;
     else
     p=true;
   }
  
   System.out.println("结果为:"+ditui(n,k));
  }
  public static int ditui(int n,int k)             //用递推运算
  {
   int c;
   int sum[][]=new int[n+1][n+1];
   for(int i=0;i<n+1;i++)
    sum[i][0]=1;
   for(int i=1;i<n+1;i++)
    sum[0][i]=0;
   for(int i=1;i<n+1;i++)
   {
    for(int j=1;j<n+1;j++)
     sum[i][j]=sum[i-1][j-1]+sum[i-1][j];
   }
   c=sum[n][k];
   return c;
  }
}

结果截图:

 

(3)

 程序设计思想:

通过杨辉三角的思想将原式化简而计算这俩部分可以用递归思想,递归结束的条件为当n=k时,结果为1,当k=1时,结果为n,否则的话就继续化简,直到能计算结果。

程序流程图:          

 

 程序源代码:

import java.util.Scanner;

 

public class Yanghui_3 

{

       public static void main(String [] args)

     {

      boolean p;

     System.out.println("请输入n和k");       //提示用户输入n和k

  

      Scanner input=new Scanner(System.in);

  

       int n=input.nextInt(); //定义并给n赋值

  

       int k=input.nextInt(); //定义并给k赋值

         if(n<k)                                                                //判断输入的数据是否符合条件
             p=false;
          else
             p=true;
           while(p==false)
          {
                System.out.println("输入的数据不符合规则,n应该大于k,请重新输入:");
                 n=input.nextInt();     
                k=input.nextInt();
                if(n<k)
                p=false;
                else
                p=true;
           }

       System.out.println("结果为:"+recursion(n,k));

    }

  public static int recursion(int n,int k)               //利用递归运算

  {

  int c;

  if(k==n)

  c=1;

  else

  {

  if(k==1)

  c=n;

  else

  c=recursion(n-1,k-1)+recursion(n-1,k);

  }

  return c;

  }

}

 结果截图:

  

课后作业2:

程序设计思想:

      本题可以看做是移动盘子的问题,要把n个盘子从A处移到C处借助B,每次只能移动一个盘子,首先可以把n个盘子看做是俩个盘子:最底下的最大的盘子和其余的n-1个盘子,先把n-1个盘子移到B处,再把最大的那个移到C处,然后再把n-1个盘子用同样的方法借助AB移到C,这样一直执行,直到所有盘子都移到了C处。代码上先写一个移动盘子的函数,该函数运用递归调用自己,结束的条件是当移动的盘子数目为1时,执行另外一个移动函数,该移动函数为从一个地方将盘子移到另一个地方。

程序流程图:

程序源代码:


import java.util.Scanner;
public class Hanoi
{
 public static void main(String[] args)
   {
         System.out.println("请输入要移动几个盘子:");
         Scanner input=new Scanner(System.in);
         int sum=input.nextInt();
         hanoi(sum,\'A\',\'B\',\'C\');
   }
  public static void hanoi(int m,char one,char two,char three)            //递归函数
  {
   if(m==1)                                 //递归结束条件
    move(one,three);
   else
   {
    hanoi(m-1,one,three,two);                  //调用自身
    move(one,three);
    hanoi(m-1,two,one,three);
   }
  }
  public static void move(char x,char y)              //当递归结束时执行的操作
  {
 System.out.println(x+"--->"+y); 
  }
}

结果截图:

课后作业3:

程序设计思想:

本题要判断输入的字符串是否为回文,首先声明一个字符串变量,用于存储用户输入的字符串,然后利用函数将字符串转化为char类型的数组,然后利用递归函数判断是否回文,声明一个min变量和max变量,开始时min=0;max=c.length-1,然后调用递归函数,递归结束的条件是c[min]==c[max]&&max-min==2然后输出字符串是回文,当不符合递归结束条件时就再进行一次判断,如果c[min]==c[max]就调用自身,继续判断c[min+1]==c[max-1],否则直接输出字符串不是回文,然后结束程序。

程序流程图:

程序源代码:

import java.util.Scanner;
public class Palindrome
{
  public static void main(String [] args)
  {
  System.out.println("请输入待检测语句:");             //提示用户输入字符串
  String s=new String();                                                             //声明字符串变量
  Scanner input=new Scanner(System.in);
  s=input.nextLine();                            //输入待检测字符串
  char c[]=s.toCharArray();                                                       //将字符串类型化为char数组类型
  int min=0,max=c.length-1;               //声明min和max并赋值
   if(c.length%2==0)                                                                   //如果length为奇数那么肯定不为回文
   {
    System.out.println("语句不是回文语句.");
    System.exit (0);
   }
   else
   {
    judge(c,min,max);                                                                  //否则调用递归函数
   }
 
  }
  public static void judge(char ch[],int min,int max)
  {
     if(ch[min]==ch[max]&&max-min==2)                                      //递归结束条件
     {
      System.out.println("该语句是回文。");
     }
     else
     {
      if(ch[min]==ch[max])                                                                //需要调用自身的条件
      judge(ch,min+1,max-1);
      else
      System.out.println("该语句不是回文。");
     }
   
  }
}

结果截图:

 

以上是关于课后作业1的主要内容,如果未能解决你的问题,请参考以下文章

课后作业1

课后作业1

软件工程课后作业

课程引言课后作业1

2月29日课后作业

课程引言课后作业1