关于方法的学习和应用,递归的应用

一:随机数(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开始算的,如果不减一,数组里面没有这个数据,会造成错误。

原文地址:https://www.cnblogs.com/qingtianxt/p/6014252.html