1.方法参数的值传递机制

1.说明

    • 方法:必须由其所在类或对象调用才有意义。若方法含有参数:

      1. 形参:方法声明时的参数;

      2. 实参:方法调用时实际传给形参的参数值

    • 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");
}

}
}

运行结果:

练习1—参数传递、递归调用(Java)的更多相关文章

  1. java中父类与子类, 不同的两个类中的因为构造函数由于递归调用导致栈溢出问题

    /* 对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中, 并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行 */ impo ...

  2. JAVA 遍历文件夹下的所有文件(递归调用和非递归调用)

    JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...

  3. Java 递归调用 recursive 给一个参数 返回一大堆

    需求: 需要组装成对象多层嵌套式的 json字符串; 想到使用 递归来完成这个多层嵌套: 憋了四个小时,终于写出来了; 先看效果: 数据库中的数据: 拼装后的效果: [ EmpVO{ ename='孙 ...

  4. Java中的递归调用

    Java中不合理的使用递归调用,可能会导致栈内存溢出,这点是需要注意的. java将为每个线程维护一个栈,栈里将为每个方法保存一个栈帧,栈帧代表了一个方法的运行状态. 也就是我们常说的方法栈.最后一个 ...

  5. Java中函数的递归调用

    说到递归,java中的递归和C语言中也是很相似的,在Java中,递归其实就是利用了栈的先进后出的机制来描述的. public class HelloWorld { public static void ...

  6. [复习] JAVA 遍历目录 (递归调用和非递归)

    JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...

  7. 慎用Java递归调用

    总结:慎用Java递归调用,测试时可以尝试该方法,否则尽量不要使用递归!递归过多调用时,最好改为for或者whlie来代替. 在java语言中,使用递归调用时,如果过多的调用容易造成java.lang ...

  8. Java递归调用

    6.递归调用 方法的递归调用就是方法自身调用自身. 以下程序因为递归没有结束的条件,所以一直压栈,没有弹栈,导致栈内存溢出错误!所以递归必须要有结束条件. public class Recursion ...

  9. java——递归调用

    递归函数调用调用本身,并通过自己的相应参数,这个计算过程中进行层,直到满足某些条件,只要停止呼叫. 递归函数的特点 1.函数要直接或间接调用自身. 2.要有递归终止条件检查.即递归终止的条件被满足后. ...

  10. Java面向对象---方法递归调用

    递归调用是一种特殊的调用形式,即方法自己调用自己 public int method(int num){ if(num==1){ return 1; } else { return num+metho ...

随机推荐

  1. HDU 6704 K-th occurrence(主席树 + RMQ + 后缀数组)题解

    题意: 给一个串\(S\),\(length\leq 1e5\),\(Q\leq1e5\)个询问,每次询问输出和\(S_lS_{l+1}\dots S_r\)长得一模一样的第\(k\)个子串的开头位置 ...

  2. acm 快速傅里叶变换的理解

    A(x)=A4[0](x*x)+x*A4[1](x*x);x=1,w,w*w,w*w*wwi means w^in=4;w=w[4]result shuould bey[0]=A4[0](1*1)+1 ...

  3. git-reset All In One

    git-reset All In One git 撤销 merge $ git checkout feature-sentry $ git pull $ git checkout dev $ git ...

  4. URL parser All In One

    URL parser All In One const url = new URL(`https://admin:1234567890@cdn.xgqfrms.xyz:8080/logo/icon.p ...

  5. text image & 思维脑图 & xmind

    text image & 思维脑图 text-image 图片读 rgb 值->灰度值->字符; rgb->灰度值的公式 google 一下就有,灰度值传字符部分,从灰度值从 ...

  6. css grid layout in practice

    css grid layout in practice https://caniuse.com/#search=grid subgrid https://caniuse.com/#search=cal ...

  7. NGK的去中心化自治实践,更人性化的DAO

    2020年,DeFi市场市场火爆的同时,引爆了流动性挖矿的市场.行业内对DAO的思考也在源源不断进行,特别项目治理通证发行之前,DAO的去中心化的治理理念,是区块链属性中的重要的一环,也已引发了不同项 ...

  8. ToolBar 用法

    xml中的设置: <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_wi ...

  9. Oracle RMAN scripts to delete archivelog

    vi del_arch.shexport ORACLE_SID=pdcsdbrman target / cmdfile=/home/oracle/scripts/del_arch.sql log=/h ...

  10. mtk相机冷启动拆解

    1 概述 冷启动大致可以分成以下几块内容: S0 (system) 主要是 Activity 的创建耗时(从 Touch up,即 ptr:up 开始) ptr:up S1 App 从 Activit ...