009面向对象编程(上)-2

方法的重载、可变个数形参

image-20210124140612294

image-20210124140954736

本质上两种都是一样的,传递的是数组

image-20210124141742871

package com.atguigu.exer;

/*
 * 测试可变个数形参传递机制
 */
public class ArraysPassTest {
	public static void main(String[] args) {
		ArraysPassTest test = new ArraysPassTest();
//		String[] temp = new String[]{"hello","World","Test"};
		test.print(new String[]{"hello","World","Test"}); //传递匿名数组
		test.print("Printing");
	}
	public void print(String arr){
		System.out.println(arr);
	}
	public void print(String... arr){
		//输出数组
		for(int i = 0; i < arr.length; i++){
			if(i == 0){
				System.out.print("[ " + arr[i]);
			}else if(i > 0 && i < arr.length - 1){
				System.out.print(", " + arr[i]);
			}else{
				System.out.println(", " + arr[i] + " ]");
			}
			
		}
	}
}

方法的值传递

image-20210124144936488

例1

image-20210124145641011

image-20210124145655817

例2

image-20210124145910289

image-20210124145933582

例3

image-20210124150019660

image-20210124150033780

练习1:替换要输入的值

image-20210124150348665

package com.atguigu.exer;

public class PrintTest {
	public static void main(String[] args) {
		int a = 10;
		int b = 10;
		method(a,b);
		System.out.println(a);
		System.out.println(b);
	}
	public static void method(int a, int b){
		a = 100;
		b = 200;
		System.out.println(a);
		System.out.println(b);
		System.exit(0);//退出程序
	}
}

练习2:除后并赋值

image-20210124150929461

package com.atguigu.exer;

import java.util.Arrays;

/*
 * 定义一个int型的数组:int[] arr = new int[]{12,3,3,34,56,77,432};
让数组的每个位置上的值去除以首位置的元素,得到的结果,作为该位置上的 新值。遍历新的数组。
 */
public class PrintTest01 {
	public static void main(String[] args) {
		int[] arr = new int[]{12,3,3,34,56,77,432};
		for(int i = arr.length - 1; i >= 0; i--){
			arr[i] = arr[i]/arr[0];
		}
		System.out.println(Arrays.toString(arr));
	}
}

练习3:熟悉char类型数组

image-20210124151706793

package com.atguigu.exer;

public class PrintCharArr {
	public static void main(String[] args) {
		int[] arr = new int[10];
		System.out.println(arr); //地址值
		
		char[] arr1 = new char[10]; 
		System.out.println(arr1); //什么都没有
		
		char[] arr2 = new char[]{'a','b','c'}; 
		System.out.println(arr2); //abc
	}
}

练习4:将对象作为参数传递给方法

image-20210124154420489

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

 */
public class CircleTest {
	public static void main(String[] args) {
		PassObject passObject = new PassObject();
		passObject.printAreas(new Circle(), 5);
	}
}

class Circle{
	double radius;
	public double findArea(double radius){
		return Math.PI * radius * radius;
	}
}

class PassObject{
	public void printAreas(Circle c, int time){
		System.out.println("Radius		Area");
		int i = 1;
		for(; i <= time; i++){
			c.radius = i;
			System.out.println(c.radius + "		" + c.findArea(c.radius));
		}
		System.out.println("now radius is: " + (double)i);
	}
}

递归方法

image-20210124154956868

练习1:输出阶乘

package com.atguigu.exer;

/*
 * 请用Java写出递归求阶乘(n!)的算法
 */
public class AriTest01 {
	public static void main(String[] args) {
		AriTest01 test = new AriTest01();
		System.out.println(test.ari(10));
	}

	public int ari(int sum){
		if(sum == 1){
			return 1;
		}else{
			return sum * ari(sum - 1); 
		}
	}
}

练习2:f(n+2)=2*f(n+1) + f(n)

package com.atguigu.exer;
/*
 * 已知有一个数列:f(0) = 1,f(1) = 4,f(n+2)=2*f(n+1) + f(n),其中n是大于0
的整数,求f(10)的值。

 */
public class AriTest02 {
	public static void main(String[] args) {
		AriTest02 ari = new AriTest02();
		System.out.println(ari.f(10));
	}
	public int f(int sum){
		if(sum == 0){
			return 1;
		}
		if(sum == 1){
			return 4;
		}
		return f(sum-2) + 2*f(sum-1);
		
	}
}

练习3:f(n+2)=2*f(n+1) + f(n)

package com.atguigu.exer;

/*
 * 已知一个数列:f(20) = 1,f(21) = 4,f(n+2) = 2*f(n+1)+f(n),
其中n是大于0的整数,求f(10)的值
 */
public class AriTest03 {
	public static void main(String[] args) {
		AriTest03 ari = new AriTest03();
		System.out.println(ari.f(10));
	}

	public int f(int n){
		if(n == 20){
			return 1;
		}else if(n == 21){
			return 4;
		}else if(n < 20){
			return f(n+2) - 2*f(n+1);
		}else{
			return 2*f(n-1)+f(n-2);
		}
		
	}
}

练习4:斐波那契数列

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

 */
public class AriTest04 {
	public static void main(String[] args) {
		AriTest04 ari = new AriTest04();
		System.out.println(ari.fib(10));
	}
	public int fib(int i){
		if(i == 1){
			return 1;
		}else if(i == 2){
			return 1;
		}
		return fib(i-1) + fib(i-2);
	}
}

练习5:汉诺塔问题


练习6:快排


image-20210125203544357

image-20210125203822596

计算递归次数:n = (n-1) + (n-2) + 1

原文地址:https://www.cnblogs.com/Notesdata/p/14403175.html