zoukankan      html  css  js  c++  java
  • 关于方法的学习和应用,递归的应用

    一:随机数(seed):

    package Demo;

    import javax.swing.JOptionPane;

    import java.util.Scanner;

    public class Seed {

    public static void main(String[]args)

    {

    String n=JOptionPane.showInputDialog("请输入你想打印的随机数的个数");

    int m=Integer.parseInt(n);

    int[] a=new int [m];

     int value;

     String output = "";

          for ( int i = 1; i <= m; i++ ) {

             value = 1 + (int) ( Math.random() * 6 );

             output += value + "  ";

             

             if ( i % 5 == 0 )

                output += " ";

          }

    JOptionPane.showMessageDialog(null, output, "产生的随机数如下",JOptionPane.INFORMATION_MESSAGE );

     System.exit( 0 );

    }

    }

    Math.random()函数可以生成一个随机数,后面乘上一个数,这个数决定了随机数的范围,比如( Math.random() * 6 ) 产生 0 5之间的随机数。

    结果截图:

    二:

    请看以下代码,你发现了有什么特殊之处吗?

    结果截图:

    主方法在调用子方法时 ,可以识别子方法的类型,选择对应的方法进行调用。

    上述示例代码展示了Java的“方法重载(overload)”特性。

    满足以下条件的两个或多个方法构成“重载”关系:

    1)方法名相同;

    2)参数类型不同,参数个数不同。

    3)参数类型的顺序不同。

    注意:方法的返回值不作为方法重载的判断条件。

    杨辉三角形:

     

    利用杨辉三角形原理来计算组合数

    使用计算机计算组合数:

    使用组合数公式利用n!来计算

    实验思路:首先就是构造两个方法,一个是阶乘组合数的,另一个是打印组合数的,阶乘可以用递归,也可以循环,打印组合数时运用上面的公式,上面公式是说第n行第k个数的结果,然后两个for循环解得,其中行循环时是循环n行,列循环是第几行有几个数。

    代码:package Demo;

    import java.util.Scanner;

    public class Yanghuitriangle {

    public static void main(String[]args)

    {

    Scanner scanner=new Scanner(System.in);

    System.out.println("请输入你需要打印的行数");

    int n=scanner.nextInt();

    yanghui(n);

    }

    static void yanghui(int n)

    {

    int[][] a=new int [100][100];

    for(int i=0;i<n;i++)//输出第i行的数

    {

    for(int j=0;j<=i;j++)//输出第j列的数

    {

    a[i][j]=factorial(i)/(factorial(j)*factorial(i-j));

    System.out.print(a[i][j]+" ");//输出这个数

    }

    System.out.println();//这一列的数全部输出,然后换行

    }

    }

    static int factorial(int x)//求阶乘

    {

    int n=1;

    if(x==1)

    n=1;

    else if(x>1)

    n=factorial(x-1)*x;

    return n;

    }

    }

    结果截图:

    错误编译:在编译时,主要是for循环时可能出现错误,记住第几行,就有几个数,然后用上面的公式,一般不会出现错误。

    2四:汉诺塔问题:

    [实验任务三]:汉诺塔问题。

    1、 实验要求:

    实验报告中要求包括程序设计思想、程序流程图、源代码、运行结果截图、编译错

    误分析等内容。

    2、实验内容:

    用递归方式编程解决汉诺塔问题。

     设计思想:主要是移动盘子的函数,运用递归思想,定义一个moveint n,char front,char last ,char mid)函数,判断盘子个数为1时直接移动过去,大于一时分三步(1)把n-1个盘子从front移到mid,借助于last2)把盘子从front移到last,并输出(3)把mid作为开始的地方,last是终点,借助于front,其中(1)(3)步递归调用move函数,即可解决该问题。

    流程图:

    源代码:package Demo1;

    import java.util.Scanner;

    public class TowerofHanoi {

    public static int j=0;

    public static void main(String []args)

    {

    Scanner scanner=new Scanner(System.in);

    System.out.println("请输入盘子的数量");

    int n=scanner.nextInt();

    while(n<1)

    {

    System.out.println("您输入的整数不合法,请重新输入");

    n=scanner.nextInt();

    }

    char front='a',mid='b',last='c';

    move(n,front,last,mid);

    }

    public static void move(int n,char front,char last ,char mid)//该函数是把第n个盘子从front移动到last借助于mid

    {

    if(n==1)//如果n=1,直接把盘子从front移到last,并输出;

    {

    j++;//j用来计数,计算共移动了多少步

    System.out.println("进行第"+j+"次运算"+front+"----->"+last);

    }

    //大于1的分三步:

    //n-1个盘子从front移到mid,借助于last

    //把盘子从front移到last,并输出

    //mid作为开始的地方,last是终点,借助于front

    else

    {

    move(n-1,front,mid,last);//第一步

    j++;

    System.out.println("进行第"+j+"次运算"+front+"----->"+last);//第二步

    move(n-1,mid,last,front);//第三步

    }

    }

    }

     结果截图:

     

    运行结果分析:第一次测试n1的情况,输出结果应该为1次,第二次测试大于1次时,应该输出的次数为2n次方减一,检验没问题,第三次是检验小于1时,输出结果应该是让重新输入,直到大于等于1为止。

    编译错误分析:(1)没有整体思路,编译move函数时没思路,经过同学讲解解决该问题。

    2)不理解输出步骤的意思,,

     (3)忘记盘子个数小于1的情况,加了一段判断过程,解决该问题

    五:判断是不是回文数

    实验思路:

    如果会使用String这个题将很快写出来类型的方法,使用a.length()计算字符串的长度,用a.Charat()函数,将字符串存到一个char类型的数组中,然后让这个数组,首尾进行比较。只要有一组不相等,就不是回文数。

    流程图:

    源代码:package Demo;

    import java.util.Scanner;

    public class Palindrome {

    public static void main(String[]args)

    {

    Scanner scanner=new Scanner(System.in);

    System.out.println("请输入一个字符串");

    String a=scanner.nextLine();

    if(huiwen(a)==true)

    System.out.println("该字符串是回文数");

    else

    System.out.println("该字符串不是回文数");

    }

    static boolean huiwen(String a)

    {

    boolean b=true;

    char[] c=new char [a.length()];//

    for(int j=0;j<a.length();j++)

    c[j]=a.charAt(j);

    int i=0;

    while(i<a.length())

    {

    if(c[i]!=c[a.length()-i-1])

    {

    b=false;

    break;

    }

    i++;

    }

    return b;

    }

    }

    结果截图:

    编译错误总结:在判断对应字符是不是相等时,容易把两边的数组的值写错。if(c[i]!=c[a.length()-i-1])这个,后面的值应该a.length()-i还要减去一,因为a.length()是1开始算的,如果不减一,数组里面没有这个数据,会造成错误。

  • 相关阅读:
    Boost练习程序(强制转换)
    4873279(1002)
    A+B Problem(1000)
    STL练习程序(去除相同元素)
    Boost练习程序(智能指针)
    Sql技巧总结
    MySql Show Status详解
    mysql show status调优
    mysql decimal、numeric数据类型
    Apache Thrift学习小记
  • 原文地址:https://www.cnblogs.com/qingtianxt/p/6014252.html
Copyright © 2011-2022 走看看