算法基础--递归与回溯、递推、迭代关系

递归的优缺点

优点:代码更简洁清晰,可读性更好
实际上递归的代码更清晰,但是从学习的角度要理解递归真正发生的什么,是如何调用的,调用层次和路线,调用堆栈中保存了什么,可能是不容易。但是不可否认递归的代码更简洁。
缺点:由于递归需要系统堆栈,所以空间消耗要比非递归代码要大很多.而且,如果递归深度太大,可能会造成栈溢出
在这里插入图片描述

递归,递推,迭代什么关系

递归
详见《递归那些事一》
1、递归分为两个阶段:
1)递推:把复杂的问题的求解推到比原问题简单一些的问题的求解;(递推更多是数学概念,也就是需要找出问题的规律,不必深究)
2)回归:当获得最简单的情况后, 逐步返回, 依次得到复杂的解.

//递归法求第n个数的斐波那契数列

long factorial(int n)
{
if(n<=2)
return 1;
if(n > 1)
return factorial(n - 2) +factorial(n - 1);
}

//递归法计算n的阶乘

long factorial(int n)
{
if (n <= 0)
return 1;
else
return n*factorial(n - 1);
}

迭代:

1、利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,
迭代就是A不停的调用B
2、优点:
1)迭代效率高,运行时间只因循环次数增加而增加;
2)没什么额外开销,空间上也没有什么增加;
3、缺点:
1) 不容易理解;
2) 代码不如递归简洁;
3) 编写复杂问题时困难。

注意: 能用迭代的不用递归,递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出

//迭代法计算n的阶乘

long factorial(int n)
{
int result = 1;
while (n > 1)
{
result *= n;
n -= 1;
}
result;
}

递推:

1、递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法。递推算法分为顺推和逆推两种。(其实和动归接近的)
2、相对于递归算法,递推算法免除了数据进出栈的过程,也就是说,不需要函数不断的向边界值靠拢,而直接从边界出发,直到求出函数值。

#define size 20
int main()
{
//循环法
int arr[size];
arr[0] = 0;
arr[1] = 1;
for (int i = 0; i <= size; i++)
{
if (i>1)
arr[i] = arr[i - 2] + arr[i - 1];//递推算法
printf("factorial[%d]=%d\n", i, arr[i]);
}
system("pause");
return 0;
}

递归的优化方法

递归问题中想到思路本身不非常难,真正的难点在于如何优化。
1、考虑是否重复计算
如果你使用递归的时候不进行优化,是有非常非常非常多的子问题被重复计算的。因此,使用递归的时候,必要须要考虑有没有重复计算,如果重复计算了,一定要把计算过的状态保存起来。
2、考虑尾递归
对于递归的问题,我们一般都是从上往下递归的,直到递归到最底,再一层一层着把值返回。

不过,有时候当 n 比较大的时候,例如当 n = 10000 时,那么必须要往下递归10000层直到 n <=1 才将结果慢慢返回,如果n太大的话,可能栈空间会不够用。这个时候,就可以用尾递归优化来解决。

顾名思义,尾递归就是从最后开始计算, 每递归一次就算出相应的结果, 也就是说, 函数调用出现在调用者函数的尾部, 因为是尾部, 所以根本没有必要去保存任何局部变量。直接让被调用的函数返回时越过调用者, 返回到调用者的调用者去。
在这里插入图片描述

更多练习题目

1、机器人走方格V6
2、分解因数
3、K之字符是A还是B

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信奥教练Andy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值