个人博客地址 樱花🌸
**递归**(英语:Recursion),又译为**递回**,在[数学](https://zh.wikipedia.org/wiki/数学)与[计算机科学](https://zh.wikipedia.org/wiki/计算机科学)中,是指在[函数](https://zh.wikipedia.org/wiki/函数)的定义中使用函数自身的方法。递归一词还较常用于描述以[自相似](https://zh.wikipedia.org/wiki/自相似)方法重复事物的过程。例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现的。也可以理解为自我复制的过程。
递归简单的小例子
用递归计算1+2+。。。+1000的和
public class d {
int sum=0;
int i=1;
public void sum(){
sum+=i;
i++;
if(i<=1000){
sum();//递归就是调用自身
}
}
public static void main(String[] args) {
d s = new d();
s.sum();
System.out.println("计算结果是"+s.sum);
}
}
用递归进行数字的阶乘
package cn.sakura521.recursive;
public class Factorial {
int fact(int n) {
int result;
if (n == 1) {
return 1;
}
result = fact(n - 1) * n;
return result;
}
public static void main(String[] args) {
Factorial factorial = new Factorial();
System.out.println(factorial.fact(6));
}
}
用递归实现斐波那契数列
package cn.sakura521.recursive;
public class Fibonacci {
//写法一
int sum(int n) {
if (n == 0) {
return 0;
}
if (n == 1 || n == 2) {
return 1;
}
return sum(n - 1) + sum(n - 2);
}
//写法二
int Fib(int n) {
// return n < 3 ? 1 : (Fib(n - 1) + Fib(n - 2));
return n == 0 ? 0 : n < 3 ? 1 : (Fib(n - 1) + Fib(n - 2));
}
public static void main(String[] args) {
Fibonacci f = new Fibonacci();
System.out.println(f.sum(5));
System.out.println(f.Fib(5));
}
}
用递归打印数组前values 中的前 i 个元素
package cn.sakura521.recursive;
public class RecTest {
int values[];
RecTest(int i) {
values = new int[i];
}
void printArray(int i) {
if (i == 0) {
return;
} else {
printArray(i - 1);
}
System.out.println("[" + (i - 1) + "]" + values[i - 1]);
}
public static void main(String[] args) {
int m = 10;
RecTest recTest = new RecTest(m);
int i;
for (i = 0; i < m; i++) {
recTest.values[i] = i;
}
recTest.printArray(m);
}
}
递归算法设计的基本思想是:对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到能够直接求解,也就是说到了递推的出口,这样原问题就有递推关键要抓住的是:
(1)递归出口
(2)地推逐步向出口逼近
得解。