递归算法递归是一个从上到下不停调用自身函数的方法。递归算法最重要的就是递和归这两个字,先得递出去之后才能归回来。递的过程就是调用自身函数一直向下的过程,归则是函数到达了递归终止的条件,逐级返回的过程。
在递归的过程当中一定要有一个递归出口作为递归结束的标志。否则迎接你的只会是StackOverflowError
:(因为递归次数太多导致的堆空间不足产生的错误)
计算斐波那契数列前N项和
方法一:普通方法
int fibonacci1(int n) {
int f[] = new int[50];
f[0] = 1;
f[1] = 1;
int sum = 2;
for (int x = 2; x <= n - 1; x++) {
f[x] = f[x - 1] + f[x - 2];
sum += f[x];
}
return sum;
}
其时间复杂度为O(n);
方法二:递归
int fibonacci2(int n) {
if (n<=2) {
return 1;
} else {
return fibonacci2(n - 1) + fibonacci2(n - 2);
}
}
@Test
public void test2() {
int sum =0;
for (int a = 1; a <= 30; a++) {
sum += fibonacci2(a);
}
System.out.println(sum);
}
其时间复杂度为T:递归函数的时间复杂度;depth:递归函数的深度;
O(T*depth)=O(n)
计算N的阶乘
@Test
public void test(){
int sum = factorial(6);
System.out.println(sum);
}
int factorial(int n){
if (n ==1){
return 1;
}else {
return n*factorial(n-1);
}
}
阶乘公式为:!n=123*…*n,每层n都减一逐层向下递,知道达到递归出口n=1结束递归。
此图片来自递归算法总结
和数分解: 把一个数分解成任意几个数的和, 并把所有的可能性都列出来
int[] arr;
int num = 10;
@Test
public void test() {
arr = new int[num];
div(num, 1, 0);
}
void div(int n, int s, int x) {
if (n > 0) {
for (int i = s; i <= n; i++) {
arr[x] = i;
div(n - i, i, x + 1);
}
return;
}
if (num != arr[0]) {
System.out.print(num + "=" + arr[0]);
}
for (int i = 1; i < x; i++) {
System.out.print("+" + arr[i]);
}
System.out.println();
}
递归算法的介绍到此为止,下一篇文章将为您介绍利用递归完成二分排序!
感谢您的阅读,如果本篇文章对您有帮助,欢迎点赞,关注,您的阅读是我莫大的鼓励!