【动手动脑】
当JAVA里定义的函数中去掉static后,怎么办?(如下程序,将square()函数的static去掉)
public class SquareIntTest { public static void main(String[] args) { int result; for (int x = 1; x <= 10; x++) { result = square(x); // Math库中也提供了求平方数的方法 //result=(int)Math.pow(x,2); System.out.println("The square of " + x + " is " + result + "\n"); } } // 自定义求平方数的静态方法 //问:如果不加static,怎么办? public static int square(int y) { return y * y; }}
因为static 是静态的意思,main是静态的,想加载的时候就加载了,可将函数写在一个新的类中即可,如下所示:
public class SquareIntTest { public static void main(String[] args) { int result; for (int x = 1; x <= 10; x++) { result = new Test().square1(x);//非静态 System.out.println("The square of " + x + " is " + result + "\n"); } }}class Test{ public int square1(int y) { return y*y; }}
【动手动脑】
编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数。
import java.util.Scanner;
public class Random {
public static void main(String[] args) {
// TODO Auto-generated method stub System.out.println("请输入希望产生的随机数的个数:"); Scanner input=new Scanner(System.in); int N=input.nextInt(); int result; for(int i=0;i<N;i++) { result=(int)(Math.random()*10000); System.out.println(result); } }}【动手动脑】
请看以下代码,你发现了有什么特殊之处吗?
// MethodOverload.java
// Using overloaded methodspublic class MethodOverload {
public static void main(String[] args) {
System.out.println("The square of integer 7 is " + square(7)); System.out.println("\nThe square of double 7.5 is " + square(7.5)); }public static int square(int x) {
return x * x; }public static double square(double y) {
return y * y; }}答:此代码中采用static调用自定义方法,如果不加static可以使用类名.成员名或者对象名.成员名调用。
三、递归
1、编个程序求n!
import java.math.BigInteger;
import java.util.Scanner; public class CalculateN {public static void main(String[] args) { System.out.print("请输入N:"); Scanner scanner=new Scanner(System.in); int number=scanner.nextInt(); System.out.println(number+"!="+calculateN2(number)); } public static long calculateN(int n) { if(n==1 || n==0){ return 1; } return n*calculateN(n-1); }
public static BigInteger calculateN2(int n) {
if(n==1 || n==0){ return BigInteger.valueOf(1); } return BigInteger.valueOf(n).multiply(calculateN2((n-1))); }}四、处理大数字和浮点数
2、看上面程序中出现的错误,阶乘数怎么可能出现复数?
原因:java中int类型的数值占32位,是有符号的,long类型的数值占64位。由于计算机使用固定的位数来保存数值,因此,能处理的数值大小是有限的,当要处理的数值超过了这一范围时,计算机将会自动截断数值的二进制表示为它所能处理的最多位数,这将导致错误的处理结果。
五、课后作业
背景:杨辉三角形与组合数公式
利用杨辉三角形原理来计算 组合数
使用计算机计算组合数:
(1)使用组合数公式利用n!来计算
import java.math.BigInteger;
import java.util.Scanner;public class YangHui {
public static void main(String[] args) {
// TODO Auto-generated method stubSystem.out.println("求组合数C(n,k):(n为下标)");//用户输入System.out.print("请输入n,k:");Scanner scan = new Scanner(System.in);int n = scan.nextInt();int k = scan.nextInt();if(n<k)System.out.println("ERROR!");else if(n==0&&k==0)System.out.println("1");elseSystem.out.print("C("+n+","+k+")="+Calculate(n)/Calculate(k)/Calculate(n-k));}public static long Calculate(int n) { if(n==1){ return 1;}return n*Calculate(n-1);}}
(2)使用递推的方法用杨辉三角形计算
import java.math.BigInteger;
import java.util.Scanner;public class YangHui {
public static void main(String[] args) {
// TODO Auto-generated method stubSystem.out.println("求组合数C(n,k):(n为下标)");//用户输入System.out.print("请输入n,k:");Scanner scan = new Scanner(System.in);int n = scan.nextInt();int k = scan.nextInt();if(n<k)System.out.println("ERROR!");else if(n==0&&k==0)System.out.println("1");elseSystem.out.print("C("+n+","+k+")="+Calculate(n)/Calculate(k)/Calculate(n-k));}public static long Calculate(int n) { if(n==1){ return 1;}return n*Calculate(n-1);}}(3)使用递归的方法用组合数递推公式计算
课后作业2
递归编程解决汉诺塔问题。用Java实现
课后作业3
使用递归方式判断某个字串是否是回文( palindrome )
public class Huiwen {
public static boolean isHuiwen(String s,int i,int j)
{ if(i>j) throw new IllegalArgumentException();
if(i == j) return true;
else{ return (s.charAt(i)==s.charAt(j))&& isHuiwen(s,i+1,j-1); }
}
public static void main(String[] args) {
String test = "ABCBA";
int i=0; int j=test.length()-1;
System.out.println(test + " is Palindrome?" + Huiwen.isHuiwen(test, i, j));
}
}