练习1—参数传递、递归调用(Java)
1.方法参数的值传递机制
1.说明
-
-
方法:必须由其所在类或对象调用才有意义。若方法含有参数:
-
-
-
-
形参:方法声明时的参数;
-
实参:方法调用时实际传给形参的参数值
-
-
-
- Java的实参值如何传入方法:Java里方法的参数传递方式只有一种:值传递。 即将实际参数值的副本传入方法内,而参数本身不受影响。
-
-
-
形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参;
-
形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参。
-
-
2.例题
1.如下要求
(1)定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个findArea()方法返回圆的面积。
(2)定义一个类PassObject,在类中定义一个方法printAreas(),该方法的定义如下:public void printAreas(Circle c, int time)在printAreas方法中打印输出1到time之间的每个整数半径值,以及对应的面积。例如,times为5,则输出半径1,2,3,4,5,以及对应的圆面积。
(3)在main方法中调用printAreas()方法,调用完毕后输出当前半径值。
代码:
//定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个 //findArea()方法返回圆的面积。 public class Circle { double radius; public double findArea(){ double m=Math.PI*radius*radius; return m; } // public static void main(String[] args) { // Circle c1=new Circle(); // c1.radius=12; // c1.findArea(); // System.out.println(c1.findArea()); // } }
//Circle //(2)定义一个类PassObject,在类中定义一个方法printAreas(),该方法的定义 //如下:public void printAreas(Circle c, int time) //在printAreas方法中打印输出1到time之间的每个整数半径值,以及对应的面积。 //例如,times为5,则输出半径1,2,3,4,5,以及对应的圆面积。 // (3)在main方法中调用printAreas()方法,调 //用完毕后输出当前半径值。程序运行结果如图 //所示 import java.util.Scanner; public class PassObject { public void printAreas(Circle c,int time ){ Circle c3 = new Circle(); System.out.println("Radius\t\t"+"Ares"); for (int i=0;i<=time;i++) { c3.radius=i; double s=c3.findArea(); System.out.println( c3.radius+"\t\t\t"+s); } System.out.println("now radius is:"+(c3.radius+1)); } public static void main(String[] args) { PassObject p1=new PassObject(); Circle c2=new Circle(); p1.printAreas(c2,5); } }
运行结果:
2.请用Java写出递归求阶乘(n!)的算法 。
代码:
public class recursionTest1 { public int ff(int n) { if (n==1) { return 1; }else { return n*ff(n-1); } } public static void main(String[] args) { recursionTest1 re=new recursionTest1(); int s=re.ff(10); System.out.println(s); } }
运行结果:
3.已知有一个数列:f(0) = 1,f(1) = 4,f(n+2)=2*f(n+1) + f(n),其中n是大于0的整数,求f(10)的值。
代码:
public class recursionTest2 { public int recursion2(int m) { if (m==0) { return 1; }else if (m==1) { return 4; }else { return 2*recursion2(m-1)+recursion2(m-2); } } public static void main(String[] args) { recursionTest2 re2=new recursionTest2(); int x=re2.recursion2(10); System.out.println(x); } }
运行结果:
4.已知一个数列:f(20) = 1,f(21) = 4,f(n+2) = 2*f(n+1)+f(n),
其中n是大于0的整数,求f(10)的值。
代码:
public class recursionTest3 { public static void main(String[] args) { recursionTest3 re3=new recursionTest3(); System.out.println("f(10)="+re3.jj(10)); System.out.println("f(9)="+re3.jj(9)); System.out.println("f(8)="+re3.jj(8)); System.out.println("f(11)="+re3.jj(11)); System.out.println("f(12)="+re3.jj(2)); } public long jj(int x) { if (x==21) { return 4; }else if (x==20) { return 1; }else if (x<20) { return jj(x+2)-(2*jj(x+1)); }else { return 2*jj(x-1)+jj(x-2); } } }
运行结果:
5.输入一个数据n,计算斐波那契数列(Fibonacci)的第n个值1 1 2 3 5 8 13 21 34 55
规律:一个数等于前两个数之和要求:计算斐波那契数列(Fibonacci)的第n个值,并将整个数列打印出来。
代码:
public class recursionTest4 {
public int Fibonacci(int f)
{
int num=0;
if (f==1)
{
return 1;
}else if (f==2)
{
return 1;
}else
{
return Fibonacci(f-1)+Fibonacci(f-2);
}
}
public static void main(String[] args) {
recursionTest4 re4=new recursionTest4();
int x=re4.Fibonacci(8);
System.out.println("第八位为:"+x);
int m=8;
System.out.println("打印前八位:");
for (int i=1;i<=m;i++)
{
System.out.print(re4.Fibonacci(i)+"\t");
}
}
}
运行结果: