递归编程

java语言中的方法Method在其他语言当中也可能被成为函数Function。对于一些复杂的代码逻辑,如果希望重复使用这些代码,并且做到随时任意使用,那么就可以将这些代码放在一个大括号{}当中,并且起一个名字。使用代码的时候,直接找到名字调用即可。

程序开始执行的时候是先执行main方法。因为main方法是一个入口。

在java语言中所有的方法体中的代码都必须遵循自上而下的顺序依次逐行执行。

        3、main方法不需要程序员手动调用,是由JVM调用的。但是除了main方法之外其他的方法,都需要程序员手动调用。

方法只有调用的时候才会执行,方法不调用是不会执行的。

方法定义在类体当中。方法定义的先后顺序没有关系

方法中的变量都属于局部变量。方法结束之后,局部变量占用的内存会自动释放。

自定义方法

方法的概念:

其他编程语言里面的函数,是一段可以重复调用的代码。

方法的作用:

        简化代码,提高代码的可读性,可维护性,可重用性,安全性。

语法格式:

修饰符 public static

返回值类型:用于限定调用方法值的数据类型。

返回值:被return语句返回的值,该值会返回给调用者。

                return关键字用于结束方法以及返回方法指定类型的值。

参数名:是一个变量,用于接收调用方法指定类型的值。

计算15!+7!+9!+3!+1=?

package com.yan2;

public class Test1 {

	public static void main(String[] args) {
		// 计算阶乘
		// 调用方法的规则【方法名称(实际参数)】
		double res = jieCheng(15) + jieCheng(7) + jieCheng(9) + jieCheng(3) + jieCheng(1);
		System.out.println(res);

	}
	// 计算阶乘 基本格式【public static 返回值类型 方法名称(参数类型 形式参数名称)
	public static double jieCheng(int params) {
		double res = 1;
		for (int i = 1; i <= params; i++) {
			res *= i;
		}
		return res;// 返回值,要求类型必须和方法声明中的类型一致
	}
}

方法的分类

根据方法有没有参数可以分为有参和无参

public static int abc(int a,int b){//不能缩写为abc(int a,b)
    if(a>b)
        return a;
    return b;
}
public static int menu(){
    System.out.println("欢迎使用!");
    return 0;
}
public static void menu2(){
    //void表示没有返回值,如果return 1;语法报错
    return;
}

方法的调用:方法名(实际参数列表)

        1、实参和形参的类型必须一一对应,另外个数也要一一对应。

        2、函数返回值小转大-->自动类型转换

        3、函数实参小转大-->自动类型转换

特殊关键字

        1、break;用来终止switch()或者离它最近的循环。

        2、continue;用来终止本次循环,进入下次循环

        3、return;用来终止它所在的一个方法的执行,返回调用处。

        4、System.exit();用来结束程序执行。

程序调用自身的编程技巧称为递归。递归作为一种算法在程序设计语言中广泛应用

一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

递归需具备的条件:

子问题须与原始问题为同样的事,且更为简单

不能无限制调用本身,须有个出口,化简为非递归状态处理

递归的次数不能太多,否则容易造成栈内存溢出java.lang.StackOverflowError

构造方法不能递归调用。

典型案例

1、斐波那契数列是1,1,2,3,5,8,13,21,34...,也称为黄金分割数列,兔子数列

package com.yan;

public class feiBoNaQieShuLie {

	public static void main(String[] args) {
		// 兔子数列
		long res = method(50);// 20365011074
		System.out.println(res);

	}

	public static long method(int num) {
		if (num == 1)
			return 1;
		if (num == 2)
			return 1;
		return method(num - 1) + method(num - 2);
	}

}

2、十进制转8进制和16进制

package com.yan2;

public class Test6 {

	public static void main(String[] args) {
		// 十进制转八进制
		int k = 123;
		String ss = "";
//		while (true) {
//			int k1 = k % 8;
//			k /= 8;
//			ss = k1 + ss;
//			System.out.println(k + "--" + k1);
//			if (k == 0) {
//				break;
//			}
//		}
		System.out.println(ss);
		// 十进制转十六进制
		String sss = "";
		while (true) {
			int k2 = k % 16;
			char yuShu = (k <= 9 && k >= 0) ? ((char) (k2 + '0')) : ((char) (k2 - 10 + 'a'));
			sss = yuShu + sss;
			k /= 16;
			System.out.println(k + "--" + k2);
			if (k == 0)
				break;
		}
		System.out.println(sss);
	}

}

3、汉诺塔问题

package com.yan;

public class hanNuoTa {
        //汉诺塔问题
	public static void main(String[] args) {
		double res = move(63);// 9.223372036854776E18
		System.out.println(res);

	}

	public static double move(int k) {
		if (k == 1)
			return 1;
		return 2 * move(k - 1) + 1;
	}

}

4、假如一个小球从100米高度自由落下,每次落地后就反跳回原高度的一半。那么求它在第10次落地时,共经过多少米?第10次反弹多高?

package com.yan2;

public class Test7 {

	public static void main(String[] args) {
		// 假如一个小球从100米高度自由落下,每次落地后就反跳回原高度的一半。
		// 那么求它在第10次落地时,共经过多少米?第10次反弹多高?
		double res1 = count(10);
		System.out.println(res1);// 输出第十次反弹的高度
		double res2 = high(10);
		System.out.println(res2);

	}

	public static double count(int k) {
		if (k == 1)
			return 100 / 2;
		return 0.5 * count(k - 1);
	}

	public static double high(int j) {
		if (j == 1)
			return 100;
		// f(n)=f(n-1)+f(1)/(Math.pow(2,n-2))
		return high(j - 1) + 100.0 / (Math.pow(2, j - 2));
	}

}