栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

递归C++

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

递归C++

文章目录
    • 什么是递归
    • 递归算法特点
    • 主要递归
    • 总结

什么是递归

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

递归算法特点

递归算法解决问题的特点:
1)递归就是方法里调用自身。
2)在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
4)在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。

主要递归

1:斐波那契数列

f(1)=1;
f(2)=1;
f(n)=f(n-1)+f(n-2);

2:快速排序:

#include

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 
#include 
void move(char A,int n,char B)//定义一个move函数,来打印往哪挪,谁挪。 
{
	printf(" %d 从%c挪到%cn",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.找到递推公式或者等价转换 这些都是父问题转化为求解子问题。
找变化的量:变化的通常要作为参数
找出口。

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/396342.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号