1.函数调用机制
2.分治策略
将问题缩小到一定程度可以解决
该问题缩小为若干个相同问题
规模可以合并
交叉特性
3.直接递归
递推:本身调用本身
回归:
分配新的栈帧
没有无限递归
windows系统 栈帧1M
Linux系统 栈帧10M
4.回归递归
#include<stdio.h>
#include<ctype.h>
#include<assert.h>
void Print(unsigned int x)
{
while (x != 0)
{
printf("%d", x % 10);
x = x / 10;
}
}//方法一循环语句
void Print(unsigned int x)
{
if (x != 0)
{
printf("%d", x % 10);
Print(x / 10);
}
}//递归语句
int main()
{
unsigned int x;
scanf_s("%d", &x);
Print(x);
return 0;
}
5.辗转相除法求最大公约数
#include<stdio.h>
#include<ctype.h>
#include<assert.h>
int fun(int a, int b)
{
int c = 0;
while (b != 0)
{
c = a % b;
a = b;
b = c;
}
return a;
}
int main()
{
int a, b;
scanf_s("%d %d", &a, &b);
printf("%d \n", fun(a, b));
return 0;
}
6.二分法查询数字
#include<stdio.h>
#include<ctype.h>
#include<assert.h>//二分法查询(分治策略)
int FindValue(int* ar,int n,int val)
{
assert(ar != nullptr);
int pos = -1;
int left = 0,right = n - 1;
while (left < right)
{
int mid = (right + left) / 2;
if (val < ar[mid])
{
right = mid - 1;
}
else if (val > ar[mid])
{
left = mid + 1;
}
else
{
pos = mid;
break;
}
}
return pos;
}
int main()
{
int ar[] = { 12,23,34,45,56,67,78,89,90,100 };
int n = sizeof(ar) / sizeof(ar[0]);
int val;
scanf_s("%d", &val);
int pos = FindValue(ar, n, val);
printf("%d \n", pos);//-1
return 0;
}
时间复杂度:
7.打印函数
#include<stdio.h>
#include<ctype.h>
#include<assert.h>
void Print_Ar(int* br, int n)
{
assert(br != nullptr);
while (n > 0)
{
printf("%d",br[ n - 1]);
--n;
}
}
int main()
{
int ar[] = { 12,23,34 };
int n = sizeof(ar) / sizeof(ar[0]);
Print_Ar(ar, n);
return 0;
}