一、方法递归的基本介绍
- 简单来说,递归(recursion)就是方法自己调用自己,每次调用时传入不同的变量。
- 下面展示一个递归的基础案例:
// 打印问题(代码如下)
//代码说明:
// 当我们传入一个整数n时,就进入到if的判断语句,符合条件则又进入到test方法
//然后后面就一直重复之前的步骤,直到if语句不再成立。
public void test(int n){
if(n>2){
test(n-1);
}
system.out.println("n="+n);
}
二、递归的重要规则
- 递归必须向退出递归的条件逼近,否则就会出现无限递归。
- 执行一个方法的时候,就创建一个新的受保护的独立空间(栈空间)
- 方法中的局部变量是独立的,不会相互影响。比如上面的变量n
- 如果方法中使用的是引用类型的变量(比如数组),就会共享该引用类型的数据
- 当一个方法执行递归完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。
三、递归案例
三、1、阶乘问题
// 计算n的阶乘
//代码解析:
// n的阶乘=1*2*3*...n;我们可以得知n是逐渐向1逼近的
// 因此我们就可以把n==1当作递归的结束条件
// 如果n不等于1,就继续调用factorial,直到n==1才退出递归
public void factorial(int n){
if(n==1){
return 1;
}else{
return factorial(n-1)*n;
}
三、2.斐波那契数
请使用递归的方式求出斐波那契数1,1,2,3,5,8,13......给你一个整数n,求出它的斐波那契数:
题目分析:
根据斐波那契数的规律我们可以知道
1.当n=1时,n=1;
2.当n=2时,n=1;
3.当n>=3时,斐波那契数是前两个数的和
public class Fibonacci {
public static void main(String[] args) {
B b=new B();
int n=7;
int c=b.f(n);
if(c==-1) {
System.out.println("输入错误,需要输入>=1 的数字");
}else {
System.out.println("当n="+n+"对应的斐波那契数为"+c);
}
}
}
class B{
public int f(int n) {
if(n>=1) {
if(n==1||n==2) {
return 1;
}else {
return f(n-1)+f(n-2);
}
}else {
return -1;
}
}
}
上面的代码是用n=7来测试的
结果:
当n=7对应斐波那契数为13
三、3.猴子吃桃
//有一堆桃子,猴子第一天吃其中的一半,并且再多吃一个!以后每天猴子都吃其中的一半,
然后再多吃一个。当到第10天的时候,想再吃的时候,发现桃子还剩1个。问最初桃子有多少个?
//代码解析:
// n==10,peach10=1;
// n==9,peach9=(peach10+1)*2=4;
// n==8,peach8=(peach9+1)*2=10;
// ......
// 上面可以看出,n==10就是递归的结束条件。
public int G(int n) {
if(n==10) {
return 1;
}else if(n>=1 && n<=9){
return (G(n+1)+1)*2;
}else {
System.out.println("n在0-9之间");
return -1;
}
}
三、4.汉诺塔
问题:总共有a,b,c三个塔,a塔从下往上按大到小的顺序放着5(这里用5来举例)个盘子,每次只能移动一个盘子,要把a塔的所有盘子全放到c塔,问要怎么移动盘子?
public static void main(String[] args) {
Tower tower = new Tower();
int size=5;
tower.move(size,'A','B','C');
}
}
//把a塔上的所有盘子放到c盘上
class Tower{
//写个方法
// num表示要移动的个数,a,b,c分布表示a塔,b塔,c塔
public void move(int num,char a,char b,char c){
// 如果只有一个盘 num=1
if(num==1){
System.out.println(a+"->"+c);
}else {
// 如果有多个盘子,可以看成两个,最下面的和上面的所有盘子(num-1)
// 1.先移动上面的所有的盘子到b塔,期间要借助到c塔
move(num-1,a,c,b);
// 2.把最下面的这个盘子移动到c塔
System.out.println(a+"->"+c);
// 3.再把b塔的所有盘子移动到c塔,期间要借助到a塔
move(num-1,b,a,c);
}
}