2021年9月3日递归

一,分治策略:将规模较大的问题转化为规模较小的问题
分治策略和递归不可分割应用于算法设计中产生高效的算法
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层返回给12个#返回完后,再次执行递归再次返回2个#
继续由第1层返回给第04个#返回后,再次执行递归再次返回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;
}

输出结果:
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值