递归以及面向对象部分练习题

递归:

递归简单理解其实就是不停的循环调用

递归方法:一个方法体内调用它自身。 
方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执 行无须循环控制。
递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死 循环。
      // 计算1--100之间的所有自然数的和
        AprilFourForenoon apf = new AprilFourForenoon();
        int no = apf.sum(100);
        System.out.println(no);

    }
    public int sum(int num ){  
        if(num == 1){
            return 1;
        }else{
            return num+sum(num-1);
        }
    }

练习题

1)定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个 findArea()方法返回圆的面积。
2)定义一个类PassObject,在类中定义一个方法printAreas(),该方法的定义 如下:public void printAreas(Circle c, int time)
   在printAreas方法中打印输出1到time之间的每个整数半径值,以及对应的面积。 例如,times为5,则输出半径1,2345,以及对应的圆面积。 (3)在main方法中调用printAreas()方法,调用完毕后输出当前半径值。程序运行结果如图所示。
                    


 

解答:

import java.util.Scanner;

public class AprilFourCircle {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        double ti = scanner.nextDouble();
        Circle circle = new Circle();
        PassObject p = new PassObject();
        p.printArea(circle,ti);
    }
}

class Circle{
    double radius;
    public double findArea(){
        return Math.PI*radius*radius;  // 利用Math数学计算模块来充当派值
    }
}


class PassObject{
    public void printArea(Circle c, double time){
        for (double i = 1.0; i <= time ; i++) {
            c.radius = i;
            System.out.println(c.radius+" : "+c.findArea());
        }
        c.radius=time+1;
        System.out.println("now radius is : "+ c.radius);
    }
}
View Code
1:请用Java写出递归求阶乘(n!)的算法


2、已知有一个数列:f(0) = 1,f(1) = 4,f(n+2)=2*f(n+1) + f(n),其中n是大于0
的整数,求f(10)的值

3、已知一个数列:f(20) = 1,f(21) = 4,f(n+2) = 2*f(n+1)+f(n),
其中n是大于0的整数,求f(10)的值。

4、输入一个数据n,计算斐波那契数列(Fibonacci)的第n个值 1 1 2 3 5 8 13 21 34 55
规律:一个数等于前两个数之和 要求:计算斐波那契数列(Fibonacci)的第n个值,并将整个数列打印出来

2 :

  

因为f(n+2) 在我们不知道n的值的时候就一直需要n去加2一直去获取上面的+2的值所以要逆转思维 去减去2所有的都减去2即可算出数值

    public int fun(int num ){
        if(num == 0){
            return 1;
        }else if(num == 1){
            return 4;
        }else{
            return 2*fun(num -1) +fun(num -2);
        }
    }
已知有一个数列:f(0) = 1,f(1) = 4,f(n+2)=2*f(n+1) + f(n),其中n是大于0 的整数,求f(10)的值

什么是方法的重载?

两同一不同, 同一个类,相同方法名,参数列表不同

说明Java方法中的参数传递机制的具体体现?

其实就是参数的赋值, 
基本数据类型; 如果是基本数据类型此时赋值的变量便是变量本身的值相当于堆中的值所指向的地址值也给了赋值的变量

引用数据类型: 是在堆中单独开辟了一块内存地址值,堆内相同只不过栈中的名字不同

3. 成员变量和局部变量在声明的位置上、是否有默认初始化值上、是否能有权限修饰符修饰上、内存分配的位置上有何不同?

 

含义:  
    成员变量是作用在整个类中,局部变量是作用在整个方法体中
    

语法格式: 
       成员变量: [权限修饰符] 数据类型  变量名 = 值;
                        eg : public int age = 10;


        局部变量:  数据类型 变量名 = 值;
                         eg: int age = 10;

内存分配:
        成员变量:  堆
        局部变量 : 栈

默认值:
        成员变量 : 无
        局部变量 : 有



使用场合:
     只给当前方法使用,建议使用局部变量
     如果要给这个类中的所有方法都是用,用成员变量
    注意:能用局部变量就不要使用成员变量了

1:如果声明成成员变量,每个方法都能直接对这个变量做修改,很有可能引起程序的值的改变
2:内存使用,声明为成员变量,会在堆中一致存在,除非垃圾回收器来回收它,否则一直占用空间
3:内存使用,声明为局部变量,会在栈中存活,随着方法的接受而销毁,不占用内存

4. 谈谈return关键字的使用

① 结束方法  ② 针对于有返回值的方法,return + 返回数据

5. 提供如下代码的内存解析

 


 
原文地址:https://www.cnblogs.com/zhaoyunlong/p/10717097.html