递归&迭代&回溯&递推&树形递归&线性递归&尾递归概念汇总

递归&迭代&回溯&递推&树形递归&线性递归&尾递归概念汇总

引用文档

https://www.jianshu.com/p/32bcc45efd32 递归与迭代的区别

知识储备

在阅读文章前需要查询:

  • 递归的定义

  • 回溯的定义

  • 迭代的定义

  • 递推的定义

  • 树形递归的定义

  • 线性递归的定义

  • 尾递归的定义

  • 线性迭代的定义

笔记

  • 递归:在数学上的理解,就是函数自己调用自己

  • 迭代;迭代就是将别人的输出作为自己的输入,得到最终的结果。从函数表现形式,就是自己调用别人。这个别人可以是自己。

  • 递归是迭代的特殊形式。这个不难理解。

  • 树形递归,就是指递归函数的时间复杂度是指数级别。比如,自己调用自己两次以上。

  • 线性递归,就是指递归函数的时间复杂度是线性级别。比如,自己调用自己一次。

  • 循环的3要素:循环终止条件,循环体,循环变量

  • 递归分为两个过程,递推和回归。递推则是把复杂问题逐步分解为最简单的问题,回归就是把最简单的问题完成后逐渐回溯到最原先的复杂问题。

  • 回溯是一种算法思想,就是指当前算法进行下去以无意义时,回退上一步重新寻找新的解题思路。类似孙子兵法的三十六计走回上策。

  • 递归的第一阶段,递进在计算机看来就是一个不停建立函数调用栈的过程。

  • 递归的第二阶段,回归的过程其实本质上就是一个迭代的过程。我们可以看待函数栈顶部的函数返回值回作为函数栈中下- - 一个函数的输入值。整个过程会把原先递进过程建立的函数栈不停的退栈,直到回归最初建立的函数(函数栈的栈底函数)。

  • 尾递归,是指,如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。即,递归调用后返回的结果直接return;

  • 尾递归,不会消耗栈空间,所以尾递归时间与空间复杂度和迭代的性能一样。

  • 下面是使用线性递归和尾递归分别求解阶乘:


线性递归:

    
    long Rescuvie(long n) {
     

        return (n == 1) ? 1 : n * Rescuvie(n - 1);

     

    }

    



尾递归:


    
    long TailRescuvie(long n, long a) {
     

        return (n == 1) ? a : TailRescuvie(n - 1, a * n);

     

    }

     

     

    long TailRescuvie(long n) {//封装用的

         

        return (n == 0) ? 1 : TailRescuvie(n, 1);

     

    }

    





当n = 5时

对于线性递归, 他的递归过程如下:

Rescuvie(5)

{5 * Rescuvie(4)}

{5 * {4 * Rescuvie(3)}}

{5 * {4 * {3 * Rescuvie(2)}}}

{5 * {4 * {3 * {2 * Rescuvie(1)}}}}

{5 * {4 * {3 * {2 * 1}}}}

{5 * {4 * {3 * 2}}}

{5 * {4 * 6}}

{5 * 24}

120

对于尾递归, 他的递归过程如下:

TailRescuvie(5)

TailRescuvie(5, 1)

TailRescuvie(4, 5)

TailRescuvie(3, 20)

TailRescuvie(2, 60)

TailRescuvie(1, 120)

120



  • 迭代算法可以转化为尾递归。尾递归算法也可以转化为递归算法。编译器就是这么干的,编译器经常会为了减少函数开销,把尾递归算法转化为迭代算法。而树形递归和线性递归就无法做到这一点。尾递归也叫线性迭代。

  • 从时间复杂度来划分,可以分为树形递归和线性迭代.
    尾递归也是一种特殊的线性递归,特殊在于他直接把递归函数的返回值直接return, 而一般的线性递归则需要把返回值带入表达式运算后再return。

总结

  • 突然我有一个习惯,不喜欢用代码表示一些计算机概念,因为代码大多是计算机思维习惯。而人思考问题的时候大多是面向对象化的,甚至更加灵活,不应该局限于计算机的思维。

  • 为什么我不用思维导图,思维导图用于归纳知识,方便于信息阅读和思维引导。而我做笔记的目的是为了便于我记忆和自我检索。我认为,记忆是零散的,那么就不应该强行对起结构化,避免注意力和关注点落在知识管理。零散的知识结构有利于使我更加专注知识的内容本身,而不是知识的结构管理。

  • 零散的知识点方便我检索。所以我故意弱化知识的归纳(除非有必要)。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值