直接或间接调用自身的算法过程
- 设计思路:遵循基准情形和递归情形两大原则,将问题分解为同类型子问题求解;底层基于栈结构,调用时压入当前状态,求解后依次出栈。
- 适用场合:适用于可按分治思想拆解为同类子问题的场景。
- 注意事项:必须设置终结条件防止无限递归,控制递归深度避免栈溢出
【例题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;
}