一,分治策略:将规模较大的问题转化为规模较小的问题
分治策略和递归不可分割应用于算法设计中产生高效的算法
1,循环可以改成递归
2,求解n的阶乘
3,打印一个数组的内容及其逆向打印数组内容;
4,根据value查找相映的下标;
注意以下递归中的错误写法
代码如下:
#include<stdio.h>
void fun(int n)
{
while (n != 0)
{
printf("%d ", n % 10);
n = n / 10;
}
}
void fac(int n)
{
if (n != 0)
{
printf("%d ", n % 10);
fac(n/10);
}
}
void funa(int n)
{
int sum =1;
for (int i = 1; i <=n; i++)
{
sum = sum * i;
}
printf("%d\n",sum);
}
int faca(int n)
{
if (n == 1) return n;
return faca(n - 1) * n;
}
void Print_ar(int* p, int o)
{
for (int i = o - 1; i >= 0; i--)
{
printf("%d ",p[i]);
}
printf("\n");
}
void Printfac_ar(int* p, int o)
{
if (o != 0)
{
printf("%d ", p[o - 1]);
Printfac_ar(p,o-1);
}
}
void Printfac1_ar(int *p,int o)//错误的写法
{
if (o > 0)
{
Printfac1_ar(p, --o);
printf("%d ",p[o-1]);
}
}
void Printfac2_ar(int* p, int o)//错误的写法
{
if (o > 0)
{
Printfac1_ar(p,o--);//一直执行该代码直至栈帧空间用完;
printf("%d ", p[o - 1]);
}
}
int Findvalue(int* p, int o, int value)
{
int pos = o - 1;
while (pos >= 0&&p[pos]!=value)
{
pos = pos - 1;
}
return pos;
}
int Findfacvalue(int* p, int o, int value)
{
int pos =-1;
if (o>0)
{
if (p[o-1] == value)
{
pos=o-1;
}
else
{
pos= Findfacvalue(p,o-1,value);
}
}
return pos;
}
int Findfacvalue1(int* p, int o, int val)
{
if (o <1 || p[o - 1] == val)
{
return o - 1;
}
else
{
Findfacvalue(p, o - 1, val);
}
}
int main()
{
int n = 1234;
//fun(n);//求n的阶乘
//fac(n);
int m = 5;
//funa(m);
//printf("%d",faca(m));
int ar[] = { 12,23,34,45 };
int o = sizeof(ar)/sizeof(ar[0]);
//Print_ar(ar,o);
//Printfac_ar(ar,o);
//Printfac1_ar(ar,o);//发生内存泄漏 打印结果:任意值 ar[0] ar[1] ar[2]
//Printfac2_ar(ar,o);//将栈帧充爆栈帧的空间耗尽
int value =12;
printf("%d\n",Findvalue(ar, o,12));
printf("%d",Findfacvalue(ar,o,12));//注意两种查找函数递归的不同;
//printf("%d", Findfacvalue1(ar, o, 12));
return 0;
}
注意写入多次递归出现的情况
输出8个#
当i=3时返回给2层一个#返回完成后,再次执行递归再次返回1个#
此时该由2层返回给1层2个#返回完后,再次执行递归再次返回2个#
继续由第1层返回给第0层4个#返回后,再次执行递归再次返回4个#
#include<stdio.h>
void fun(int i, int n)
{
if (i == n)
{
printf("# ");
}
else
{
fun(i + 1, n);
fun(i + 1, n);
}
}
int main()
{
int n = 3;
fun(0,3);
return 0;
}
输出结果: