首页 > 代码库 > 关于方法的学习和应用,递归的应用
关于方法的学习和应用,递归的应用
一:随机数(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 = http://www.mamicode.com/1 + (int) ( Math.random() * 6 );
output += value + " ";
if ( i % 5 == 0 )
output += "\n";
}
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、实验内容:
用递归方式编程解决汉诺塔问题。
设计思想:主要是移动盘子的函数,运用递归思想,定义一个move(int n,char front,char last ,char mid)函数,判断盘子个数为1时直接移动过去,大于一时分三步(1)把n-1个盘子从front移到mid,借助于last(2)把盘子从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);//第三步
}
}
}
结果截图:
运行结果分析:第一次测试n为1的情况,输出结果应该为1次,第二次测试大于1次时,应该输出的次数为2的n次方减一,检验没问题,第三次是检验小于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开始算的,如果不减一,数组里面没有这个数据,会造成错误。
关于方法的学习和应用,递归的应用