递归
1.概述:方法内部自己调用自己
2.分类:
a.直接递归
public static void method(){
method()
}
b.间接递归:
A(){
B()
}
B(){
C()
}
C(){
A()
}
3.注意:
a.递归必须要有出口,否则会出现"栈内存溢出"
b.递归即使有出口,递归次数不不要太多
public class Demo01Recursion {
public static void main(String[] args) {
method();
}
public static void method(){
method();
}
}
示例一:需求:利用递归输出3到1
public class Demo02Recursion {
public static void main(String[] args) {
method(3);
}
public static void method(int n){
if (n==1){
System.out.println(n);
//结束方法
return;
}
System.out.println(n);
n--;
method(n);
}
}
示例二:求n!(n的阶乘)
1.需求:定义一个方法,完成3的阶乘
3*2*1
2.分析:假如定义一个方法,代表n的阶乘 -> method(n) -> n接收几,就代表几的阶乘
method(1) 1
method(2) 2*1 -> 2*method(1)
method(3) 3*2*1 -> 3*method(2)
method(n) -> n*method(n-1)
public class Demo03Recursion {
public static void main(String[] args) {
int method = method(3);
System.out.println("method = " + method);
}
public static int method(int n){
if (n==1){
return 1;
}
return n*method(n-1);
}
}
示例三:计算斐波那契数列(Fibonacci)的第n个值
不死神兔
故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契。
在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔,再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡
问:一对刚出生的兔子,一年内繁殖成多少对兔子?
规律:一个数等于前两个数之和,比如: 1 1 2 3 5 8 13 21 34 55…
1.假设:定义一个方法,叫做method,参数传递month,代表月份
2.分析:
method(1) 1
method(2) 1
method(3) 2 -> method(1)+method(2)
method(4) 3 -> method(2)+method(3)
method(5) 5 -> method(3)+method(4)
method(n) -> method(n-2)+method(n-1)
public class Demo04Recursion {
public static void main(String[] args) {
int method = method(12);
System.out.println("method = " + method);
}
public static int method(int n){
if (n==1 || n==2){
return 1;
}
return method(n-1)+method(n-2);
}
}