递归的使用

一.概念

递归是一种直接或者间接调用自身函数或者方法的算法

二.算法思想

1.递:将递归问题分解为若干个规模较小,与原问题形式相同的子问题,这些子问题可以用相同的解题 思路来解决

2.归:如果一直传递时解决不了问题的,必须要有一个结束传递的出口。得使传递达到某一个零界点,然后返回,才能解决一个问题。

过程大概表示为

其中

ABCD的函数形式一定要相同:比如函数体都是 n+1

到D函数的时候要有条件结束,将返回值返回上一个函数。

三.使用条件

1.首先应该明确使用递归是要完成什么功能

2.递归的终止条件

3.递归操作(调用自身函数)

举例

计算6的阶乘

相当于 6!=6*(6-1)*(6-1-1)*…*1

元素不断减少1,可以理解为

                                           n!=n*(n-1)!

                                   而 (n-1)!=(n-1)*(n-1-1)!

                                      ……………………

                                       1

也就是说每一个数向下传递并且都是减去1    相当于不断执行n=n-1

代码如下

int cheng(int n)
{
	if (n == 1)
	{
		return 1;
	}
	return   n*cheng(n - 1);
}
int main()
{
	int result =cheng(6);
	printf("%d", result);
}

cheng函数不断调用自身直到n=1时返回1值。

也会有运行慢情况

当形参相同的函数调用多次运行性能会降低,我们可以通过用数组保存计算结果。这样能避免计算重复的数据,从而提高性能。

可以拿这道题来说

int arr[20] = {0};\\声明一个数组来进行储存
int cheng(int n)
{
	
	if (n == 1)
	{
		return 1;
	}
	if (arr[n] == 0) \\如果数组第n个索引没赋值则进行赋值
    { 
		arr[n] = n*cheng(n - 1);\\给第n个索引赋值
	}
	
	return arr[n];
}
int main()
{
	int result =cheng(12);
	printf("%d", result);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值