递归C++

什么是递归

递归算法是一种直接或者间接调用自身方法的算法。简言之:在定义自身的同时又出现自身的直接或间接调用。

递归算法特点

递归算法解决问题的特点:
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.找到递推公式或者等价转换 这些都是父问题转化为求解子问题。
找变化的量:变化的通常要作为参数
找出口。

在许多情况下是不会用到递归的,当数据量特别大的时候,许多的递归的中间过程都是不需要的(对结果的产生没有影响),每次递归可能都会有大量重复的时候一般会用预处理出所有数据,避免了大量时间都用来递归重复的中间过程,比如求阶乘、累加、斐波那契······
但比如快速排序每次递归都会对这一段的序列产生影响,所以用递归就非常有效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值