什么是递归
递归算法是一种直接或者间接调用自身方法的算法。简言之:在定义自身的同时又出现自身的直接或间接调用。
递归算法特点
递归算法解决问题的特点:
1)递归就是方法里调用自身。
2)在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
4)在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。
主要递归
1:斐波那契数列
f(1)=1;
f(2)=1;
f(n)=f(n-1)+f(n-2);
2:快速排序:
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int q[N];
void quick_sort(int q[], int l, int r) {
if (l >= r)return;
int x = q[l], i = l - 1, j = r + 1;
while(i < j) {
do i++; while (q[i] < x);
do j--; while (q[j] > x);
if (i < j)swap(q[i], q[j]);
}
quick_sort(q, l, j);
quick_sort(q, j + 1, r);
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) cin >> q[i];
quick_sort(q, 0, n - 1);
for (int i = 0; i < n; i++)cout << q[i];
return 0;
}
3:汉诺塔:
#include <stdio.h>
#include <string.h>
void move(char A,int n,char B)//定义一个move函数,来打印往哪挪,谁挪。
{
printf(" %d 从%c挪到%c\n",n,A,B);
}
void Hanoi(int n,char A,char B,char C)//汉诺塔递归
{
if(n==1)//递归终结条件
move(A,1,C);
else
{
Hanoi(n-1,A,C,B);
move(A,n,C);
Hanoi(n-1,B,A,C);
}
}
int main()
{
int a;
char A = 'A',
B = 'B',
C = 'C';
printf("请输入汉诺塔的层数:");
scanf("%d",&a);
Hanoi(a,A,B,C);
return 0;
}
正常许多排序递归的时间复杂度都是在O(nlogn), 递归函数每递归一次都会运行出两个二分递归函数
各时间复杂度如下:
总结
找重复:
1.找到一种划分的方法
2.找到递推公式或者等价转换 这些都是父问题转化为求解子问题。
找变化的量:变化的通常要作为参数
找出口。
在许多情况下是不会用到递归的,当数据量特别大的时候,许多的递归的中间过程都是不需要的(对结果的产生没有影响),每次递归可能都会有大量重复的时候一般会用预处理出所有数据,避免了大量时间都用来递归重复的中间过程,比如求阶乘、累加、斐波那契······
但比如快速排序每次递归都会对这一段的序列产生影响,所以用递归就非常有效。