一,递归方法:
就是在一个方法体内,调用了它自己本身的方法。
二,说明:
方法递归包含了一种隐式循环,它会循环执行某段代码,而且不需要循环控制。
三,注意:
递归方法一定要向已知的方向递归,否则会变成无穷递归,类似于死循环,最后导致栈溢出 boom~
四,写一些例题:
练习7.1:请用Java写出递归求阶乘(n!)的算法
/*
* 说明:
* 求阶乘,就是求 1-n 之和。
*
* 求阶乘公式:f(n) = f(n-1) + f(n-2) +...+ 1;
*/
public class Test1 {
public static void main(String[] args) {
Test1 test = new Test1();
int sum = test.getSum(5);
System.out.println(sum);
}
//求阶乘公式:f(n) = f(n-1) + f(n-2) +...+ 1;
public int getSum(int n) {
if(n == 1) {
return 1;
}else {
/*
* 递归方法一定要向已知的方向递归,
* 否则会变成无穷递归
*/
return n + getSum(n-1);
}
}
}
练习7.2:已知有一个数列:f(0) = 1,f(1) = 4,f(n+2)=2*f(n+1) + f(n),其中n是大于0的整数,求f(10)的值。
/*
* 练习7.2:已知有一个数列:f(0) = 1,f(1) = 4,
* f(n+2)=2*f(n+1) + f(n),其中n是大于0的整数,求f(10)的值。
*
* 由题意得:
* 公式:f(n+2)=2*f(n+1) + f(n)
*/
public class Test2 {
public static void main(String[] args) {
Test2 test = new Test2();
System.out.println(test.f(10));
}
public int f(int n) {
//首先把一些明确的写出来
if(n == 0) {
return 1;
}else if(n == 1) {
return 4;
}else {
//要求的是 f(10) = 2*f(9) + f(8)
return 2*f(n-1) + f(n-2);
}
}
}
练习7.4:输入一个数据n,计算斐波那契数列(Fibonacci)的第n个值
例如:1 1 2 3 5 8 13 21 34 55
规律:一个数等于前两个数之和
要求:计算斐波那契数列(Fibonacci)的第n个值,并将整个数列打印出来
/*
* 练习7.4:输入一个数据n,计算斐波那契数列(Fibonacci)的第n个值
1 1 2 3 5 8 13 21 34 55
规律:一个数等于前两个数之和
要求:计算斐波那契数列(Fibonacci)的第n个值,并将整个数列打印出来
公式:f(n) = f(n-1) + f(n-2);
*/
public class Test4 {
public static void main(String[] args) {
Test4 test = new Test4();
System.out.println(test.f(10));
}
public int f(int n) {
//当 n=1 或者 n=2 时,它们不能和前面两个数相加,所以直接输出 1
if((n == 1)||(n == 2)) {
return 1;
//根据公式,一个数等于前两个数之和
}else {
return f(n-1) + f(n-2);
}
}
}
五,Java中还有一些常见的例题:
- 快速排序:快速排序也是采用了递归方法的方式来排序。这样会让程序来排序数组很快。这里不详讲(其实是不会...)...
- 汉诺塔问题:这个游戏也涉及到了递归方法,其原理和递归方法很像。这里不详讲(其实是不会...)...
- 等等等...