递归是所有编程语言中,都会讨论到的一个问题。




Content Of Table

递归的通俗认识

编程领域的抽象

一个最简单的示例

一点总结

栈溢出问题

本示例的一点拓展说明



### 递归的通俗认识
编程是现实的抽象,这是能被应用到所有的编程概念的。
递归也是如此,其实递归,就是重复,循环, 我们大概上幼儿园的时候,其实就有过递归的概念。

![](https://img2018.cnblogs.com/blog/1735896/201912/1735896-20191220180001252-1957541256.png)

在一个故事中,不断的提到上一次讲过的故事



### 编程领域的抽象
我们知道,一个函数是可以调用另一个函数的,作为特例,如果函数调用了自己。那么就像故事中提到同样的故事一样。
我们把函数在运行的时候调用自己的情况,叫做递归。其实这样讲并不严谨,因为以上讲到的,实际只有递进,没有回归。回归是计算中的概念,我们可以大致理解为返回并销毁,以下说明。


### 一个最简单的示例
我们定义一个自调用的最简单的情况,定义一个cal函数,如下:
```javascript
//js
function cal(a){
return a + cal(a-1)
}

console.log(cal(3))

其执行过程如下:
<center>![](https://img2018.cnblogs.com/blog/1735896/201912/1735896-20191220225318405-1003795447.png)</center> 显然,这不是我们希望的结果,由于程序无条件的执行,所以该程序理论上将无止尽的递进下去。但是在计算机中,是不被允许的,文章末尾<ud>[栈溢出问题](#栈溢出问题)</ud>
现在,我们为了不让这个程序无止尽递进执行,我们需要给它加上一些条件,例如:
```javascript
//js
function cal(a){
if(a>0){
return a + cal(a-1)
}else{
return 0
}
}
console.log(cal(3))

我们给程序加了一些判断,我们判断了a这个参数,如果它大于0,我们就准许它递归。如果它等于0了,我们就直接通过return终止程序,并且返回0。实现回归

以上程序执行结果为6,正确。 它的实现功能是:3+2+1+0



### 一点总结
- 递归,简单的来说,就是一个方法自己调用自己的这么一个过程
- 递归递归,递:指的是“递进”,归:指的是“回归,返回”。 所以,一般递归方法中会有判断,能让方法有条件的执行,有递,就要有归 否则,只递不归就会造成栈溢出,导致程序崩溃。因此,我们需要有条件语句在合适的时候终止递归。


### 栈溢出问题
在程序中,调用函数,是需要有“代价”的,那就是,要占用一片叫做栈(Stack)的内存空间。
当调用函数时,数据需要存储到栈里,当函数运行结束的时候,这些数据会从栈里被取出。
所以,可想而知,如果调用了很多函数,但是这些函数都不返回,不被处理掉,栈就会被塞满,数据就没有地方放了。
这种情况,叫做栈溢出错误。
对于程序运行而言,这是致命的错误,因此程序会被操作系统强行终止。

例如,如果以上示例,没有设置条件判断,就会产生以下错误(js):

![](https://img2018.cnblogs.com/blog/1735896/201912/1735896-20191220232122561-673785687.png)

本示例的一点拓展说明

虽然本示例用到的是一个最简单的递归方法。

但是仅通过此方法,就可以实现各种等差数列的求和:

![](https://img2018.cnblogs.com/blog/1735896/201912/1735896-20191221003044280-1263729883.png)
如果是a+x呢?、 * ?、 / ? 、更复杂的数学公式?

仅通过这个一个示例我们就可以轻松的实现:

  • 形如:1+3+5+7+···+(2n-1) 这种奇数项求和
  • 形如:2+4+6+8+···+2n 这种偶数项求和
  • 形如:1+2+3+4+5+6+···+n 这种累加
  • 甚至形如: 11+8+5+2+0 这种奇偶求和

是什么是递归?-[all]-[编程理论]的更多相关文章

  1. Python并发编程理论篇

    Python并发编程理论篇 前言 其实关于Python的并发编程是比较难写的一章,因为涉及到的知识很复杂并且理论偏多,所以在这里我尽量的用一些非常简明的语言来尽可能的将它描述清楚,在学习之前首先要记住 ...

  2. 如何编写高质量的 JS 函数(3) --函数式编程[理论篇]

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/EWSqZuujHIRyx8Eb2SSidQ作者:杨昆 [编写高质量函数系列]中, <如何 ...

  3. T-SQL :编程理论 (一)

    SQL代表结构化查询语言,是一种在关系数据库系统中查询和管理数据的标准语言.sql语句也有几个类别,包括定义语言(DDL),数据操作语言(DML),数据控制语言(DCL). DDL包括create,a ...

  4. AOP编程-理论篇

    本节内容主要讲解AOP编程理念,包括概念讲解,使用AOP的优势,如何实现AOP,常见的实现AOP的方法. 1.AOP的概念 AOP是Aspect Oriented Programming的缩写,意思是 ...

  5. Socket编程理论

    Socket理论 本地IP地址.本地端口号.外地IP地址.外地端口号组成一对套接字对. socket(套接字),就是 IP:端口号的形式. 一个完整的Socket有一个本地唯一的Socket号,由操作 ...

  6. JDBC编程理论知识(1)

    1.SUN公司为统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC 2.JDBC全称为:Java Data Base Connectivity(java数据库连接),它主要由接口组 ...

  7. Mysql——JDBC编程 理论介绍

    一.JDBC简介(来自俞琰--数据库老师) Java数据库编程主要使用JDBC技术.JDBC是一种用于执行SQL语句的Java API.它由一组用Java编写的类和接口组成.JDBC为开发人员提供了一 ...

  8. 多进程编程——理论讲解与 multiprocessing 模块

    多进程编程 import os pid = os .fork() 功能 :创建新的进程 参数: 无 返回值 :失败返回一个负数 成功:在原有进程中返回新的进程的PID号 在新进程中返回为0* 子进程会 ...

  9. day38 并发编程(理论)

    目录 一.操作系统发展史 二.多道技术 1 单核实现并发的效果 2 多道技术图解 3 多道技术重点 三.进程理论 1 必备知识点 2 进程调度 3 进程的三状态 4 两对重要概念 四.开启进程的两种方 ...

随机推荐

  1. [每日一题系列] LeetCode 1013. 将数组分成和相等的三个部分

    题目: 给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false. 形式上,如果可以找出索引 i+1 < j 且满足 (A[0] + A[1] + . ...

  2. Block as a Value for SQL over NoSQL

    作者 Yang Cao,Wenfei Fan,Tengfei Yuan University of Edinburgh,Beihang University SICS, Shenzhen Univer ...

  3. day1 执行用例

    故事1 今天的工作,是执行已写好的"回馈"模块用例 每个子模块的用例都有优先级之分 肯定要先进行通过性测试,验证正常流 因此,我优先执行各个子模块优先级最高的那条用例,进行通过性测 ...

  4. C++ 标准模板库(STL)-stack

    主要介绍一下C++11版本中标准模板库中栈的用法,希望可以帮到需要用的人. #include <iostream> #include <stack> #include < ...

  5. RPA如何跑赢传统自动化和人工?

    过去的4年时间里,RPA(机器人流程自动化)一词,在Gartner的搜索引擎中一直排名前五.去年Gartner发表的调查数据中显示,RPA行业在2018年保持了60%以上的增长速度,从而成为全球增长最 ...

  6. mui switch 点击事件不冒泡

    工作上遇到一个问题 手机移动端app,采用mui框架,要求左边是手机号码,右边是switch开关,并且点击标题的时候,可以展开下面人员的基本信息. 采用了折叠面板. 先上图如下: 开始时出现的问题是: ...

  7. rem - 移动前端自适应适配布局解决方案和比较(转载)

    原文链接:http://caibaojian.com/mobile-responsive-example.html 互联网上的自适应方案到底有几种呢?就我个人实践所知,有这么几种方案:· 固定一个某些 ...

  8. 雅奇880、990、小土豆调用EPX Studio 编译的DLL的编程方法~

    在雅奇990中,使用“外部文件-调用链接库文件”命令实现与EP的通信,例如: 1.调用链接库文件(取项目文件信息() + '资源文件\Project1.dll', 'Unit1.rpas:Result ...

  9. 使用Jmeter进行压力测试结果偏差较大原因分析

    Apache软件基金会(ASF)是一家总部位于美国的非营利性慈善组织.ASF的所有产品都通过公共论坛的在线协作开发,并从美国境内的中央服务器分发.Jmeter是ASF的一款开源免费软件 ,在国内被很多 ...

  10. [AFO·游记]我的C++451天游击战

    写在前面 05/10/19 今天心情很糟糕,没学新东西,复习没复习,作业没写完,下午要网课,明天要月考,脑子里就像是被一团棉花塞住了.静静的思考了半个小时,把自己手头上的事情排了个序,所以决定先把游记 ...