算法案例之递归

直接或间接调用自身的算法过程

  • 设计思路:遵循基准情形和递归情形两大原则,将问题分解为同类型子问题求解;底层基于栈结构,调用时压入当前状态,求解后依次出栈。
  • 适用场合:适用于可按分治思想拆解为同类子问题的场景。
  • 注意事项:必须设置终结条件防止无限递归,控制递归深度避免栈溢出

【例题1】斐波那契数列

斐波那契数列定义:

Fib(n)=1 n=1

Fib(n)=1 n=2

Fib(n)=Fib(n-1)+Fib(n-2) n>2

cpp 复制代码
#include<iostream>
using namespace std;
int Fib(int n){
    if(n==1 || n==2)
    	return 1;
    else
    	return Fib(n-1)+Fib(n-2);
}
int main(){
    int n=10;
    cout<<Fib(n)<<endl;
    return 0;
}

【例题2】选择排序

将数组{1,2,3,6,8,4,10,7,5,9}按照从小到大的顺序进行排序

cpp 复制代码
#include<iostream>
using namespace std;
void swap(int &a,int &b){		//标准的交换函数
    int temp = a;
    a = b;
    b = temp;
}
int findmin(int a[],int i,int n){
	int minindex=i;		// 记录最小值的索引
	for(int j=i+1;j<n;j++){
		if(a[minindex] > a[j]){		// 找到更小的值
			minindex=j;		// 更新最小值索引
		}
	}
	return minindex;		// 返回最小值的索引
}
void sort(int a[],int n,int i){
	if(i>=n-1) return;  //递归出口
	  int minindex = findmin(a,i,n);	// 在[i..n-1]中找最小值
	  if(minindex!=i) swap(a[i],a[minindex]);	// 交换到位置i
	  sort(a,n,i+1); // 递归排序剩余部分
}
int main(){
	int a[]={1,2,3,6,8,4,10,7,5,9};
	int n=sizeof(a)/sizeof(a[0]);
	sort(a,n,0);
	for(int i=0;i<n;i++){
		cout<<a[i];
	} 
	return 0;
}

【例题3】冒泡排序

将数组{1,2,3,6,8,4,10,7,5,9}按照从小到大的顺序进行排序

cpp 复制代码
#include<iostream>
using namespace std;
void swap(int &a,int &b){		//标准的交换函数
    int temp = a;
    a = b;
    b = temp;
}
void sort(int a[],int i,int n){
	if(i>=n) return;		// 递归出口
	for(int j=n;j>i;j--){	// 内层循环:从后向前冒泡
		if(a[j]<a[j-1]) swap(a[j],a[j-1]); 
	}
	sort(a,i+1,n);		// 递归调用,处理下一个位置
}
int main(){
	int a[]={1,2,3,6,8,4,10,7,5,9};
	int n=sizeof(a)/sizeof(a[0]);
	sort(a,0,n-1);
	for(int i=0;i<n;i++){
		cout<<a[i];
	}
	return 0;
}

【例题4】插入排序

将数组{2,5,8,3,6,1,4,7}按照从小到大的顺序进行排序

cpp 复制代码
#include<iostream>
using namespace std;
int find(int a[],int i){
	for(int j;j<=i;j++){
		if(a[j]>=a[i]) return j;
	}
	return i;
}
void move(int a[],int index,int i){
	for(int k=i;k>=index;k--){
		a[k+1]=a[k];
	}
}
void sort(int a[],int i,int e){
	//递归出口
	if (i>e) return;
	//递归体
	//大问题变成小问题
	int index=find(a,i);
	int temp=a[i];
	move(a,index,i-1);
	a[index]=temp;
	//小问题求解
	sort(a,i+1,e);
}
int main(){
	int a[]={2,5,8,3,6,1,4,7}; 
	//数组长度 
	int n=sizeof(a)/sizeof(a[0]);
	sort(a,0,n-1);
	//输出数组的值
	for(int i = 0; i < n; i++) {
		cout << a[i];
	}
	return 0;
} 
相关推荐
土司大王12 分钟前
LeetCode hot100——相交链表
算法·leetcode·链表
土司大王14 分钟前
LeetCode hot100——回文链表
算法·leetcode·链表
郝学胜-神的一滴35 分钟前
Horse3D 游戏引擎研发笔记(七):Clydesdale——从流式日志到多输出订阅
c++·qt·unity·游戏引擎·图形渲染·unreal engine·opengl
sel_939 分钟前
【Docker】Docker 安装与使用详解:从零搭建到日常实战
人工智能·深度学习·算法·docker
小O的算法实验室9 小时前
IEEE TASE,基于MPC的多无人机协同搜索竞争群体优化方法
算法
码匠许师傅9 小时前
【C++ 面试真题】26. 聊聊 C++ 的智能指针
java·c++·面试
Tbisnic10 小时前
BGE-M3 算法详解:从模型架构到三种检索方式的数学原理
算法·自然语言处理·大模型·bert·transformer·注意力机制
Brilliantwxx10 小时前
【算法从零到千】【55-58】哈希位图+常见数学运算 接口
算法
CHENGQUAN_kenan11 小时前
佛山亚马逊卖家出口退税合规指南|9610免税、一般贸易退税、无票采购、申报误区全覆盖
大数据·经验分享·笔记·百度
空堂与归11 小时前
用户分群找不到规律?用K-Means聚类算法自动发现数据模式
算法·机器学习·kmeans·聚类