递归的解释:

递归(英语:Recursion),又译为递回,

在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。(本文要讨论的重点)

递归一词还较常用于描述以自相似方法重复事物的过程。(指一种行为)

递归的使用描述

思考下面的blah()函数会发生什么?



它会无限调用自己。blah()会调用自己,被调用的blah()会再调用自己,无限循环下去。

blah()会无限调用自己。你觉得调用栈会变成什么样?

在无限递归中,计算机会一直把同一个函数压入调用栈。调用栈的大小不断增加,最终会耗尽计算机的短期存储。这就会导致栈溢出错误,即计算机会停止递归然后报错:“没内存了,不干了。”

图像辅助理解:

递归和循环的关系?

大部分的编程场景里,递归能做的事情,都能转换为循环结构去做。

同理,大部分使用循环的场合能替换为递归。

先来继续探索递归的工作方式。

当number为0时,代码不会再调用countdown(),而是直接返回。这样就不会无限调用下去。在递归术语中,这种函数不再继续递归的情形称为基准情形。因此0就是countdown()函数的基准情形。每个递归函数都需要至少一个基准情形才能避免无限调用。

function countdown(number) {
console.log(number);
if(number === 0) {
return;
} else {
countdown(number - 1);
}
}

而阅读递归代码,从基准情形开始慢慢向上分析是理解递归代码的好方法。

解释如下代码:

def factorial(number)
if number == 1
return 1
else
return number * factorial(number - 1)
end
end

解释这段代码在计算机内部都做了什么操作:

在计算机执行到factorial(3)的end关键字前,factorial(3)并未执行完。因此我们遇到了一种奇怪的情况。计算机还未执行完factorial(3),却要在执行factorial(3)的过程中开始执行factorial(2)。

在计算机执行到factorial(3)的end关键字前,factorial(3)并未执行完。因此我们遇到了一种奇怪的情况。计算机还未执行完factorial(3),却要在执行factorial(3)的过程中开始执行factorial(2)。

但这并未结束,因为factorial(2)还会调用factorial(1)。这听起来有些不可思议:在执行factorial(3)的过程中,计算机调用了factorial(2)。而在执行factorial(2)时,计算机又调用了factorial(1)。

从结果来看,在执行factorial(1)时,factorial(2)和factorial(3)都仍处在执行过程中。

计算机该如何记录这些过程呢?

它需要记得,在执行完factorial(1)之后返回并执行factorial(2)。然后在执行完factorial(2)之后返回并继续完成factorial(3)。

计算机使用栈来记录正在调用的函数。这个栈有一个恰如其分的名字——调用栈。

总结:

但能使用递归并不代表应该使用递归。递归并不比for循环优雅或者高效多少。使用递归还是循环,需要思考一下,

  • 如果有具体的循环次数,适合用循环,
  • 如果没有具体的循环次数,适合用递归。

递归的使用场景

学习了递归的原理之后,就可以用递归来解决一些原本无法解决的问题了。有一类问题很适合递归:这类问题有很多层,但我们不知道到底有几层。

  1. 需求:递归删除系统文件;(并不能知道这个文件夹下还有多深的文件夹)

  2. 需求: 需要将评论列表中所有子评论取出。这种情况下需要用到递归;

递归的思想

递归的思想是,它通常把一个大型的复杂的问题转化为一个与原问题相似的问题,以这样的思路去解决问题,这样可以极大的减少代码量,

递归的能力在于用有限的语句来定义对象的无限集合。

Recursion Function 递归笔记的更多相关文章

  1. Python Built-in Function 学习笔记

    Python Built-in Function 学习笔记 1. 匿名函数 1.1 什么是匿名函数 python允许使用lambda来创建一个匿名函数,匿名是因为他不需要以标准的方式来声明,比如def ...

  2. T-SQL with as 的用法(转) SQL 下的递归查询 SQL2005(CTE) ,SQL2000(Function 递归)

    摘自: http://blog.csdn.net/bluefoxev/article/details/6779794 ------- SQL2005 方法 一.WITH AS的含义     WITH ...

  3. 『Python基础-15』递归函数 Recursion Function

    什么是递归函数 一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的.用递归过程定义的函数,称为递归函数,例如连加.连乘及阶乘等.凡是递归的函数,都是可计算的,即能行的. 递归就是一个 ...

  4. [03] Recursive Function递归应用

    递归应用 1.理解 百科:一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的: 理解:函数调用自己的过程,这类函数处理的事情具有重复性,处理此类实行可用while或者for,但结构上 ...

  5. sql function递归

    alter function Fn_GetUserGroupRelation ( @DHsItemID int ) returns nvarchar(1024) begin declare @Col_ ...

  6. es6 箭头函数(arrow function) 学习笔记

    箭头函数有两个好处. 1.他们比传统函数表达式简洁. const arr = [1, 2, 3]; const squares = arr.map(x => x * x); // 传统函数表达式 ...

  7. polynomial&generating function学习笔记

    生成函数 多项式 形如$\sum_{i=0}^{n}a_i x^i$的代数式称为n阶多项式 核函数 {ai}的核函数为f(x),它的生成函数为sigma(ai*f(i)*x^i) 生成函数的加减 {a ...

  8. C学习笔记(10)--- 强制类型转换,错误处理,递归

    1.强制类型转换: 强制类型转换是把变量从一种类型转换为另一种数据类型.例如,如果您想存储一个 long 类型的值到一个简单的整型中,您需要把 long 类型强制转换为 int 类型. 您可以使用强制 ...

  9. 数据结构——栈与递归(recursion)

    /* recursion.c */ /* 递归 */ #include <stdio.h> void interface(void); /* 斐波那契数列以及阶乘函数声明 */ long ...

  10. 前端——语言——Core JS——《The good part》读书笔记——第四章节(Function)

    本章介绍Function对象,它是JS语言最复杂的内容. Java语言中没有Function对象,而是普通的方法,它的概念也比较简单,包含方法的重载,重写,方法签名,形参,实参等. JS语言中的Fun ...

随机推荐

  1. mpi转以太网连接300PLC无需编程与1200PLC数据交换

    300PLC转以太网无需编程300PLC通过 NetDevice与1200PLC数据交换 应用概述: 兴达易控MPI转以太网模块MPI-ETH-XD1.0PLUS 通讯模块实现PLC无需编程通过简单的 ...

  2. Strimzi Kafka Bridge(桥接)实战之三:自制sdk(golang版本)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<Strimzi Kafka B ...

  3. Python基础—— 模块介绍、模块的使用、包介绍、 包的使用、软件开发目录规范

    文章目录 一 模块介绍 二 模块的使用 2.1 import语句 2.2 from-import 语句 2.3 其他导入语法(as) 2.4 循环导入问题 2.5 搜索模块的路径与优先级 2.6 区分 ...

  4. go defer简介

    思考 开始之前,先考虑下下面的代码的执行结果: package main import "fmt" func test() int { i := 0 defer func() { ...

  5. P8679 [蓝桥杯 2019 省 B] 填空问题 题解

    P8679 [蓝桥杯 2019 省 B] 填空问题 题解 题目传送门 欢迎大家指出错误并联系这个蒟蒻 更新日志 2023-05-25 21:02 文章完成 2023-05-27 11:34 文章通过审 ...

  6. P4899 [IOI2018] werewolf 狼人 题解

    P4899 [IOI2018] werewolf 狼人 题解 题目描述 省流: \(n\) 个点,\(m\) 条边,\(q\) 次询问,对于每一次询问,给定一个起点 \(S\) 和终点 \(T\) , ...

  7. sprintf函数内存越界

    最近在做项目的时候遇到sprintf函数内存越界的问题,现在分享给大家,希望对大家有用. 首先介绍了sprintf 这个函数. 函数原型:  int sprintf(char *str, const ...

  8. Qt源码解析——一切从QObject说起

    关键词:Qt 源码 QObject 元对象 属性 事件 信号 槽 状态机 概述 原系列文章地址 学习和理解任何框架或库,官方文档可能都是最权威.最有效的信息.Qt也不例外,https://doc.qt ...

  9. 数据泄露成LLM应用最大障碍,如何用RPA Agent智能体破解谜题?

    大语言模型数据泄露堪忧,超自动化Agent成解决之道 数据泄露成LLM应用最大障碍,如何用RPA Agent智能体破解谜题? 从RPA Agent智能体安全机制,看AI Agent如何破解LLM应用安 ...

  10. 二、RHEL8操作系统安装

      一.如何安装rhel的操作系统?   必要的前提条件:硬件(CPU.内存.硬盘--) + 安装介质(操作系统的安装文件)   会不会把自己的笔记本装成rhel的操作系统呢? 不会   使用虚拟机软 ...