编程方式——递归

发布于:2022-12-25 ⋅ 阅读:(410) ⋅ 点赞:(0)

递归编程

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

  • 程序开始执行的时候是先执行main方法。因为main方法是一个入口。
  • 在java语言中所有的方法体中的代码都必须遵循自上而下的顺序依次逐行执行。
  • main方法不需要程序员手动调用,是由JVM调用的。但是除了main方法之外其他的方法,都需要程序员手动调用。
  • 方法只有调用的时候才会执行,方法不调用是不会执行的。
  • 方法定义在类体当中。方法定义的先后顺序没有关系
  • 方法中的变量都属于局部变量。方法结束之后,局部变量占用的内存会自动释放。

自定义方法

方法的概念:

  • Java方法类似于其他编程语言里面的函数,是一段可以重复调用的代码。

方法的作用:

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

语法格式:

  • 修饰符 public static
  • 返回值类型:用于限定调用方法值的数据类型。
  • 返回值:被return语句返回的值,该值会返回给调用者。
    • return关键字用于结束方法以及返回方法指定类型的值。
  • 参数名:是一个变量,用于接收调用方法指定类型的值。
//计算15!+7!+9!+3!+1=? 
public class Cal{ 
	public static void main(String[] args){
	//调用方法的规则【方法名称(实际参数)】 
	long res=jieCheng(15)+jieCheng(7)+jieCheng(9)+jieCheng(3)+1;
	System.out.println(res); 
	}
	//计算阶乘 基本格式为【public static 返回值类型 方法名称(参数类型 形式参数名 称,...)】 
	public static long jieCheng(int params){ 
		long 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; 
}

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

  • 实参和形参的类型必须一一对应,另外个数也要一一对应。
  • 函数返回值小转大—>自动类型转换
  • 函数实参小转大—>自动类型转换
public static long abc(float kk){ 
	return 100L; 
}

double res=abc(12.34f); //正确 
long kk=abc(123); //正确 

double res=abc(12.34);//语法错误

特殊关键字

  • break;用来终止switch或者离它最近的循环。
for(int i=0;i<10;i++){ 
	if(i>6) 
		break; 
}
完全等价于
for(int i=0;i<=6;i++){
}
  • continue用来终止本次循环,进入下次循环
for(int i=0;i<10;i++){ 
	if(i%2==0) 
		continue; 
}
完全等价于
for(int i=1;i<10;i=i+2){
}
  • return;用来终止它所在的一个方法的执行,返回调用处。
public class Test3 {
	public static void main(String[] args) {
		int res=abc(10);
		System.out.println(res); //1
	}
	public static int abc(int k) {
		for (int i = 1; i < k; i++)
			return i;
		return 0;
	}
}	
  • System.exit();用来结束程序运行。
if(age<18) 
	System.exit(0); 
System.out.println("welcome!");

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

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

递归需具备的条件:

  • 子问题须与原始问题为同样的事,且更为简单
  • 不能无限制调用本身,须有个出口,化简为非递归状态处理
  • 递归的次数不能太多,否则容易造成栈内存溢出java.lang.StackOverflowError
    • 网上有种说法是一般建议不要超过300层
  • 构造方法不能递归调用。

案例

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

public class JavaBasic {
	//计算第 num 次反弹的高度(m)
	public static double getHeight(int num) {
		if (num == 1)
			return 100 / 2;
		return getHeight(num - 1) / 2;
	}
	//计算第 num 次落地时经过的路程(m) 
	public static double getSum(int num) {
		double sum = 0; 
		for (int i = 1;i < num ;i ++) 
			sum += getHeight(i) * 3; //初始高度为1,弹跳高度为0.5,总共高度为 1.5,是弹跳高度的3倍。 
		return sum; 
	}
	public static void main(String[] args) { 
		Scanner input = new Scanner(System.in);
		System.out.print("本程序求小球在第n次落地时经过的路程(m)和第n次落地后反弹的 高度,请输入n:");
		int n = input.nextInt();

		/*直接计算 
		//double allDistance = 0,bounceDistance = 0; 
		//allDistance = 100 + 2 * (100 / 2 + 100 / 2^2 + 100 / 2^3 + ... + 100 / 2^(n-1)) 
		//上式括号内的是,首项为50,公比为1/2,数量为(n-1)的等比数列求和,结果为(50* [1-(1/2)^n]) / (1-1/2),化简结果为:300 - 200 * (1/2)^n 				
		//bounceDistance = 100 / 2^n 
		System.out.print("小球从100米自由落下,每次反跳一半路程,则在第n次落地时经过 的路程为:" + (300 - 200 * Math.pow(0.5,n-1)) + ", 第n次落地后反弹的高度为:" + 100/Math.pow(2.0,n)); 
		*/
		double sum = 0;
		System.out.print("小球从100米自由落下,每次反跳一半路程,则在第 "+ n + " 次 落地时经过的路程为:" + getSum(n) + ", 第n次落地后反弹的高度为" + getHeight(n));
	}
}

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到