java 快速排序 递归

The function calls itself until someone stops it.

该函数将自行调用,直到有人停止它为止。

Recursion can feel difficult to new developers. Perhaps that's because many resources teach it using algorithmic examples (Fibonacci, linked-lists). This piece will hopefully introduce things plainly, using one simple example.

对于新开发人员而言,递归可能会感到困难。 也许是因为许多资源都使用算法示例(斐波纳契(Fibonacci),链接列表)来教它。 希望通过一个简单的例子,这篇文章将简单地介绍一下。

核心思想 (Core Idea)

Recursion is when a function calls itself until someone stops it. If no one stops it then it'll recurse (call itself) forever.

递归是指函数调用自身直到有人停止它。 如果没有人停止,它将永远递归 (自称)。

Recursive functions let you perform a unit of work multiple times. This is exactly what for/while loops let us accomplish! Sometimes, however, recursive solutions are a more elegant approach to solving a problem.

递归函数使您可以多次执行一个工作单元。 这正是for/while循环让我们完成的! 但是,有时递归解决方案是解决问题的一种更优雅的方法。

倒数功能 (Countdown Function)

Let's create a function that counts down from a given number. We'll use it like this.

让我们创建一个从给定数字开始倒数的函数。 我们将像这样使用它。

countDownFrom(5);
// 5
// 4
// 3
// 2
// 1

And here's our algorithm to solve this problem.

这是我们解决此问题的算法。

  1. Take one parameter called number. This is our starting point.

    取一个称为number参数。 这是我们的出发点。

  2. Go from number down to 0, logging each one along the way.

    number降低到0 ,并沿途记录每个number

We'll start with a for loop approach and then compare it to a recursive one.

我们将从for循环方法开始,然后将其与递归方法进行比较。

命令式方法(循环) (Imperative approach (loops))

function countDownFrom(number) {for (let i = number; i > 0; i--) {console.log(i);}
}countDownFrom(5);
// 5
// 4
// 3
// 2
// 1

This one contains both algorithmic steps.

这包含两个算法步骤。

  1. ✅ Take one parameter called number.

    ✅取一个称为number参数。

  2. ✅ Log everything from number to 0.

    ✅记录从number0所有内容。

递归方法 (Recursive approach)

function countDownFrom(number) {if (number === 0) {return;}console.log(number);    countDownFrom(number - 1);
}countDownFrom(5);
// 5
// 4
// 3
// 2
// 1

This one also passes.

这也过去了。

  1. ✅ Take one parameter called number.

    ✅取一个称为number参数。

  2. ✅ Log everything from number to 0.

    ✅记录从number0所有内容。

So conceptually the two approaches are the same. However, they get the job done in different ways.

因此,从概念上讲,这两种方法是相同的。 但是,他们以不同的方式完成工作。

调试我们的命令性解决方案 (Debugging our imperative solution)

For a more visual example, let's put a debugger in our loop version and throw it into Chrome Developer Tools.

对于更直观的示例,让我们在循环版本中放入debugger ,然后将其放入Chrome开发者工具中。

function countDownFrom(number) {for (let i = number; i > 0; i--) {console.log(i);debugger;}
}

See how it uses an extra variable, i, to track the current number? As you iterate i decreases, eventually hitting 0 and terminating.

看看它如何使用额外的变量i来跟踪当前数字吗? 随着您的迭代, i逐渐减少,最终达到0并终止。

And in the for loop we specified "stop if i > 0".

for循环中,我们指定“如果i > 0停止”。

调试我们的递归解决方案 (Debugging our recursive solution)

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

The recursive version doesn't need extra variables to track its progress. Notice how the pile of functions (call stack) grows as we recurse?

递归版本不需要额外的变量来跟踪其进度。 注意我们递归时函数堆( 调用堆栈 )如何增长?

That's because each call to countDownFrom adds to the stack, feeding it number - 1. By doing this we're we're passing along an updated number each time. No extra state needed!

这是因为对countDownFrom的每次调用countDownFrom添加到堆栈中,并向其提供number - 1 。 通过这样做,我们每次都传递一个更新的number 。 不需要额外的状态!

That's main difference between the two approaches.

这是两种方法之间的主要区别。

  1. Iterative uses internal state (extra variables for counting, etc).迭代使用内部状态(用于计数的其他变量等)。
  2. Recursive does not, it simply passes updated parameters between each call.递归没有,它只是在每次调用之间传递更新的参数。

But how does either version know when to stop?

但是,哪个版本知道何时停止?

无限循环 (Infinite Loops)

In your travels, you may have been warned about the dreaded infinite loop.

在旅行中,您可能已经被警告过可怕的无限循环。

												

java 快速排序 递归_Java递归快速入门相关推荐

  1. java cookbook中文版_Java Client快速入门指南

    适用于与Amazon S3兼容的云存储的Minio Java SDK Minio Java Client SDK提供简单的API来访问任何与Amazon S3兼容的对象存储服务. 本快速入门指南将向你 ...

  2. java jxl 教程_java jxl快速入门教程

    jxl.jar 包简介 下载地址http://www.andykhan.com/jexcelapi/ 作者的网站上对它的特征有如下描述: ● 支持Excel 95-2000的所有版本 ● 生成Exce ...

  3. Java基础-SSM之mybatis快速入门篇

    Java基础-SSM之mybatis快速入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 其实你可能会问什么是SSM,简单的说就是spring mvc + Spring + m ...

  4. java快速排序算法_JAVA版排序算法之快速排序示例

    本文实例讲述了JAVA快速排序实现方法.分享给大家供大家参考,具体如下: package com.ethan.sort.java; import java.util.Arrays; import ja ...

  5. java8生成jsp页面内容组装到jsp中_JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构、调试、部署...

    接上篇<JAVA WEB快速入门之环境搭建>,在完成了环境搭建后(JDK.Tomcat.IDE),现在是万事具备,就差写代码了,今天就来从编写一个JSP WEB网站了解JSP WEB网站的 ...

  6. java azure blob 查询_快速入门:适用于 Java 的 Azure Blob 存储客户端库 v8 | Microsoft Docs...

    您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn. 快速入门:使用 Jav ...

  7. Java NIO 非阻塞网络编程快速入门

    NIO 非阻塞网络编程快速入门 案例: 编写一个 NIO 入门案例,实现服务器端和客户端之间的数据简单通讯(非阻塞) 目的:理解 NIO 非阻塞网络编程机制 import java.net.InetS ...

  8. Java 诊断利器Arthas:快速入门

    简介     Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱.在线排查问题,无需重启:动态跟踪Java代码:实时监控JVM状态.     Arthas 支持JDK 6+,支持Li ...

  9. java文件递归_java递归处理文件夹和文件

    import java.io.File; /** * 文件综合使用示例 */ public class FileDelete { public static void main(String[] ar ...

最新文章

  1. Can't create layer 289 of type Squeeze in function 'cv::dnn::dnn4_v20190902::LayerData::getLaye
  2. commons.apache
  3. MySQL常见错误代码(转)
  4. @贾跃亭,证监会喊你本周回国对乐视负责!
  5. leetcode最大矩形_柱状图中的最大矩形
  6. 初识Lazarus和Free Pascal Compiler
  7. Excel如何批量删除空行,Leo老师来教你!
  8. 在Linux平台中调试C/C++内存泄漏方法 (腾讯和MTK面试的时候问到的)
  9. 记一次WH-1000XM3翻车经历
  10. hazelcast java_Hazelcast
  11. 关于MAC地址修改和扩展以太网
  12. android google map 标记,android,在googlemap上从位图添加标记
  13. PHPWIND得到管理员密码的方法
  14. PythonThinking_FOR、IF以及while
  15. python entry如何清空_Python3 tkinter基础 Entry insert delete 点击按钮 向输入框赋值 或 清空...
  16. 分众急嫁阿里背后原因,或是新潮电梯屏数已超分众一倍
  17. dell10代cpu装linux,戴尔OptiPlex 7080MT装win7系统及bios设置(完美支持10代cpu)
  18. 今日头条优化实践: iOS 包大小二进制优化,一行代码减少 60 MB 下载大小
  19. vue+elementUI轮播视频
  20. 棒材轧机轧制力矩matlab数学模型,一种普通热轧棒材的轧制力能校核计算方法与流程...

热门文章

  1. Kubernetes—常用命令总结(二)
  2. 2010暑期实训有感【三】
  3. xlrd读取单元格演练
  4. 爬虫-在请求头中添加cookie键值对 访问登陆后可见的页面
  5. django-正向查询与反向查询演练-查询集的三种状态
  6. jquery-表格的增删编辑演练-有一个小bug的
  7. juqery-筛选器-找前后上下
  8. linux指令:时间与日期
  9. Tensorflow 迁移学习 识别中国军网、中国军视网Logo水印
  10. VMWare 虚拟机 安装 Mac OS X