辗转相除法:
例如:m%n=0;能够整除则n为最大公倍数
若m%n=k,不能够整除的话,继续辗转相除变为n%k
若n%k=c,不能整除的话继续这样…
核心代码
static int gcd(int m,int n){
if(n==0)
return m;
return gcd(n,m%n);
}
斐波那契数列
转化为二叉树:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
static int fib(int n)
{
if(n==1||n==2)
return 1;
return fib(n-1)+fib(n-2);
}
int main(){
cout<<fib(5)<<endl;
}
注意:fib(n-1)和fib(n-2)是分开计算的不是同时计算的
三、数组插入排序改递归
对数组的0-倒数第一个排序:
等价于
对数组的部分进行排序(0-倒数第二个k,(k越来越小)) ;然后把最后一个元素插入到有序的部分
要排序的数组越来越短
static void insertSort(int arr[],int k){
if(k==0) //k越来越小,当k=0时
return;
}
int arr,k;
insertSort(arr,k-1); //对前k-1个元素进行排序 ,arr[k]插入前面
int x=arr[k]; //保存
int index=k+1; //指针
while(index>-1&&x<arr[index]){ // 小的往前插,比较的往后移
arr[index+1]=arr[index];
index--; //指针往前移动
}
arr[index+1]=x;
递归总结:
1。找重复,找划分方法;
2.找递推公式,或者等价转换
3.父问题转化为子问题;
4.找变化的量,变量作为参数
5.找出口,也就是终止条件