递归(Recursion)

这篇具有很好参考价值的文章主要介绍了递归(Recursion)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

递归(Recursion),Algorithm and DataStructure,算法,数据结构

一、递归

递归:通过函数体来进行的循环

汇编:它没有所谓的循环嵌套这一说,你之前有一段指令写在什么地方,你不断的跳到之前的指令的地方去执行那条指令,这就是递归。

  1. 从前有个山
  2. 山里有个庙
  3. 庙里有个和尚讲故事
  4. 返回1

二、盗梦空间

  • 向下进入不通梦境中;向上又回到原来一层
  • 通过声音同步回到上一层
  • 每一层的环境和周围的人都是一份拷贝、主角等几个人穿越不通的梦境(发生和携带变化)

计算 n!

n! = 1 * 2 * 3 * ... * n

def Factorial(n):
    if n <= 1 :
        return 1
    return n * Factorial(n - 1)

三、递归-代码模板

  1. 终结条件(terminator)
  2. 处理当前层逻辑(current level logic)
  3. 下探到下一层(drill down)
  4. 清理当前层(reverse)

C/C++模版:

void recursion(int level, int param) { 
  // recursion terminator
  if (level > MAX_LEVEL) { // 一、递归终结条件
    // process result 
    return ; 
  }

  // process current logic 
  process(level, param);  // 二、处理当前层逻辑

  // drill down 
  recursion(level + 1, param);// 三、下探到下一层

  // reverse the current level status if needed // 四、清理当前层
}

Java模版:

// Java
public void recur(int level, int param) { 
    // terminator 
    if (level > MAX_LEVEL) { 
        // process result 
        return; 
    }
    // process current logic 
    process(level, param); 
    // drill down 
    recur(level: level + 1, newParam); 
    // restore current status 
}  

Python模版:

def recursion(level, param1, param2, ...): 
    # recursion terminator 
    if level > MAX_LEVEL: 
   process_result 
   return 
    # process logic in current level 
    process(level, data...) 
    # drill down 
    self.recursion(level + 1, p1, ...) 
    # reverse the current level status if needed
    

JavaScript 模版:

const recursion = (level, params) =>{
   // recursion terminator
   if(level > MAX_LEVEL){
     process_result
     return 
   }
   // process current level
   process(level, params)
   //drill down
   recursion(level+1, params)
   //clean current level status if needed
   
}

四、思维要点

  1. 不要人肉进行递归(最大误区) 刚开始学,可以把状态树画出来。到后面了直接看函数本身开始写即可。
  2. 找到最近最简方法,将其拆解成可重复解决的问题(重复子问题)
  3. 数学归纳法思维。

五、LeetCode 题目

https://leetcode-cn.com/problems/climbing-stairs/

https://leetcode-cn.com/problems/generate-parentheses/

https://leetcode-cn.com/problems/invert-binary-tree/description/

https://leetcode-cn.com/problems/validate-binary-search-tree

https://leetcode-cn.com/problems/maximum-depth-of-binary-tree

https://leetcode-cn.com/problems/minimum-depth-of-binary-tree

https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/

https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/

https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal

https://leetcode-cn.com/problems/combinations/

https://leetcode-cn.com/problems/permutations/

https://leetcode-cn.com/problems/permutations-ii/文章来源地址https://www.toymoban.com/news/detail-790433.html

到了这里,关于递归(Recursion)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Improved Raft Consensus Algorithm in HighReal-Time and Highly Adversarial Environment(Raft算法改进区块链效率

    Raft缺点: 高实时高对抗环境中,无法抵御恶意节点攻击,恶意节点可以RequestVote RPC消息中包含的逻辑时间戳以获得更多选票,leader是恶意节点,它可以篡改客户端发送的日志项,导致其他正常节点接收到错误的日志。 网络分裂影响共识效率 hhRaft:新角色monitor,在领袖选举

    2024年02月11日
    浏览(32)
  • 算法 数据结构 递归插入排序 java插入排序 递归求解插入排序算法 如何用递归写插入排序 插入排序动图 插入排序优化 数据结构(十)

    1. 插入排序(insertion-sort):                                           是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入     算法稳定性:                  

    2024年02月09日
    浏览(43)
  • 算法与数据结构——递归算法+回溯算法——八皇后问题

    八皇后问题是一个经典的回溯算法问题,目的是在8×8的国际象棋棋盘上放置八个皇后,使得没有皇后可以互相攻击(即没有两个皇后在同一行、同一列或同一对角线上)。 回溯算法是一种解决问题的算法,它通过尝试所有可能的解决方案来解决问题。在八皇后问题中,计算

    2024年02月09日
    浏览(45)
  • 数据结构与算法(小议递归)

    递归是一种常用的算法设计,递归就是一种循环推理。简单来说就是调用原算法本身的算法。 这里主要探讨递归的使用, 用一个简单的例子来看: 这是一个很流行的裴波那契数列计算函数,很多编程书籍喜欢拿这个数列做例子。当然一般不会这么写~ 这函数看上去很优雅,

    2024年02月01日
    浏览(40)
  • 【数据结构与算法篇】手撕八大排序算法之快排的非递归实现及递归版本优化(三路划分)

    ​👻内容专栏: 《数据结构与算法篇》 🐨本文概括: 利用数据结构栈(Stack)来模拟递归,实现快排的非递归版本;递归版本测试OJ题时,有大量重复元素样例不能通过,导致性能下降,优化快速排序通过将数组划分为三个区域,可以更有效地处理重复元素。 🐼本文作者:

    2024年02月11日
    浏览(50)
  • 【数据结构与算法】单链表的排序算法(选择,冒泡,递归)

    目录 选择排序 冒泡排序 快速排序 合并两条链表并排序 选择排序 链表的选择排序思想与数组的排序类似,但是链表需要先找到里面最小或者最大的值,然后将这个值用改链语句进行操作 我们先看这个改链语句的操作(min是笔者打错了应该是max,但是图已经画好了就没有改)

    2024年02月04日
    浏览(43)
  • 【算法】递归解决各种数据结构的遍历问题

    对于递归算法,我们最先想到的应该就是用递归的方式去中序遍历一棵树,递归的使用使得我们可以先深入到下层中,然后慢慢的输出下层的元素之后输出上层元素。 因此,基于此,我们甚至可以使用递归来逆序输出一个栈,链表等数据结构。 使用递归输出树 使用递归逆序

    2024年02月08日
    浏览(54)
  • 【数据结构】二叉树的遍历递归算法详解

    我们来写一个函数 BuyNode(x)函数 用于创建二叉树结点。 用动态开辟函数 malloc 函数进行动态开辟,并强制转换为 BTNode 型,用变量 node 来去管理开辟的空间。 我们初始化结点,其 val 即为传入的参数x,左右指针 left 和 right 都设为NULL。 我们在主函数中创建上面这样一颗二叉树

    2024年01月20日
    浏览(33)
  • 【数据结构与算法】归并排序详解:归并排序算法,归并排序非递归实现

    归并排序是一种经典的排序算法,它使用了分治法的思想。下面是归并排序的算法思想: 递归地将数组划分成较小的子数组,直到每个子数组的长度为1或者0。 将相邻的子数组合并,形成更大的已排序的数组,直到最终得到一个完全排序的数组。 归并排序的过程可以分为三

    2024年01月22日
    浏览(53)
  • 【数据结构与算法】:非递归实现快速排序、归并排序

    🔥 个人主页 : Quitecoder 🔥 专栏 :数据结构与算法 上篇文章我们详细讲解了递归版本的快速排序,本篇我们来探究非递归实现快速排序和归并排序 快速排序的非递归实现主要依赖于栈(stack)来模拟递归过程中的函数调用栈。递归版本的快速排序通过递归调用自身来处理子

    2024年03月24日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包