一.概念
递归是一种直接或者间接调用自身函数或者方法的算法
二.算法思想
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);
}