汉诺塔和跳台阶问题

Java重载

重载的规则

  • 方法名相同
  • 方法参数不同(参数类型或参数个数)
  • 方法的返回值类型不影响重载

代码示例

重载add()方法,实现整数和小数的加法

import java.util.*;
public class TestDemo{
	public static void main(String[] args) {
        //两个整数
		Scanner sc =new Scanner(System.in);
		int a =sc.nextInt();
		int b =sc.nextInt();
		System.out.println(add(a,b));
		//两个浮点数
		double x = sc.nextDouble();
		double y = sc.nextDouble();
		System.out.println(add(x,y));
		//两个整数和一个浮点数
		int r = sc.nextInt();
		int p = sc.nextInt();
		double q = sc.nextDouble();
		System.out.println(add(r,p,q));
		//整数和浮点数
		int m = sc.nextInt();
		double n = sc.nextDouble();
		System.out.println(add(m,n));
		sc.close();
	}
    
	private static int add(int a,int b) {
			return a + b;
	}
	private static double add(double a,double b) {
		return a + b;
	}
    
    //返回值类型并不影响重载
	private static double add(int a,int b,double c) {
		return a + b + c;
	}
	private static double add(int a,double b) {
		return a + b;
	}
}

递归

一个方法在执行过程中调用自身就叫做递归

例如,在数学中我们求某个数的阶乘时。很容易知道当N =1 时,1!就是1,这个条件在递归中称为结束条件

递归公式:求N!时,我们可以将其化解为N!=N*(N - 1)!

代码示例:递归求N的阶乘

	public static int fac(int n) {
		if (n == 1 || n == 0) { //当输入n为1 时输出1,n为时输出0
			return n;
		}
		return n * fac(n - 1);  //然后根据N!=N*(N - 1)! ,递归计算N!
	}

要清楚理解递归,必须先理解方法执行的结束条件,以及方法调用的位置

递归可以有效地简化方法的代码,但是递归的效率并不是最高的,可以自行验证。

例:求斐波那契数列的第n项

//递归解决
		public static int fibo(int n) {
		if (n == 1 ) {
			return n;
		}
		if (n == 0) {
			return 0;
		}
		return fibo(n - 1) + fibo(n - 2);
	}
//输入5 输出5
//1 1 2 3 5 8
//迭代解决
	public static int fibo(int n) {
		int f1 = 1;
		int f2 = 1;
		if (n == 1 || n == 2) {
			return 1;
		}
		int f3 = 0;
		for (int i = 3;i <= n ;i++ ) {
			f3 = f1 + f2;
			f1 = f2;
			f2 = f3;
		}
		return f3;
	}
//输入5 输出 5

用递归解决问题

1、汉诺塔问题

有三个柱子A,B,C。A柱子上放有N个圆盘,规定任何时候小圆盘不能在大圆盘上,且在三根柱子之间一次只能移动一个圆盘,请问如何移动,才能把所有圆盘从A移到C。

import java.util.Scanner;
public class Hanio{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		HanioTower(n,'A','B','C');
	}
	private static void move(char a,char b){
			System.out.print(a+"->"+b+" ");
	}

	private static void HanioTower(int n,char a,char b,char c) {
		if (n == 1) {  //结束条件,当只剩一个盘子时,从A->C
			move(a,c);
			return ;
		}
		HanioTower(n - 1,a,c,b);  //先把n-1个盘子,从A移到B  借助c
		move(a,c);  //剩下第n个盘子,从A移到C
		HanioTower(n - 1,b,c,a); //然后把n-1个盘子,从B移到A  借助c
	}
}
2、跳台阶问题

青蛙跳台阶问题,有一个n阶的台阶,青蛙每次只能跳一阶或者两阶,请问一共有多少种跳法?

public class FrogJump{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.close();
	}
	private static int frogJump(int n) {
			if (n == 1 ) {
				return 1;
			}
			if (n == 2) {
				return 2;
			}
			return frogJump(n -1)+ frogJump(n -2);
	}
}
//可以发现,青蛙跳台阶的方法数和斐波那契数列一致
//1 2 3 5 8 13....

可以发现青蛙跳台阶的方法数与斐波那契数列一致,因此可以使用迭代来解决跳台阶问题

	private static int frog(int n) {
		int f1 = 1;
		int f2 = 2;
		int f3 = 0;
		for (int i = 3;i <= n ;i++ ) {
			f3 = f1 + f2;
			f1 = f2;
			f2 = f3;
		}
		return f3;
	}
}
进阶:变态跳台阶

青蛙一次可以跳任意阶台阶

	private static int FrogJumpPro(int n) {
		if (n == 0||n == 1 ) {
			return n;
		}

		int res = 0;
		for (
			int i = 0;i < n ;i++ ) {
			res = res +hentaiJump(i);
		}
		return res + 1;
	}
//输入5  输出 16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值