首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么这段DFS代码只能在生成器中调用它?

这段DFS代码只能在生成器中调用它的原因是因为它使用了递归的方式来实现深度优先搜索算法。在生成器中调用该代码可以实现递归的效果,而在其他地方调用可能会导致递归无法正常进行或者出现错误。

深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法,它从根节点开始,沿着一条路径尽可能深地访问节点,直到达到叶子节点或无法继续前进的节点,然后回溯到前一个节点,继续探索其他路径。这种算法通常使用递归的方式实现。

在生成器中调用DFS代码可以有效地利用生成器的特性,即在每次迭代中暂停和恢复执行。这样可以避免一次性生成整个搜索路径,节省内存空间。同时,生成器的特性也使得可以在搜索过程中动态生成结果,而不需要等待整个搜索完成。

总结起来,这段DFS代码只能在生成器中调用的原因是为了实现递归的效果,并利用生成器的特性来节省内存空间和动态生成结果。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JavaScript 引擎是如何实现 asyncawait 的

下面我们就来看看生成器函数的具体使用方式: 在生成器函数内部执行一段代码,如果遇到 yield 关键字,那么 JavaScript 引擎将返回关键字后面的内容给外部,并暂停该函数的执行。...从图中可以看到,foo 函数是一个生成器函数,在 foo 函数里面实现了用同步代码形式来实现异步操作;但是在 foo 函数外部,我们还需要写一段执行 foo 函数的代码,如上述代码的后半部分所示,那下面我们就来分析下这段代码是如何工作的...等通过 fetch 发起的请求完成之后,会调用 then 的回函数,then 的回函数拿到结果之后,通过调用 gen.next 放弃主线程的控制权,将控制权交 gen 协程继续执行下个请求。...小结 Promise 的编程模型依然充斥着大量的 then 方法,虽然解决了回地狱的问题,但是在语义方面依然存在缺陷,代码充斥着大量的 then 函数,这就是 async/await 出现的原因。...其实,除了 JavaScript,Python、Dart、C# 等语言也都引入了 async/await,使用它不仅能让代码更加整洁美观,而且还能确保该函数始终都能返回 Promise。

1K30

深入理解Python异步编程(上)

鲜有在生产项目中使用它。而使用它的同学,则大多数都停留在知道如何使用 Tornado、Twisted、Gevent 这类异步框架上,出现各种古怪的问题难以解决。...只能。...4.4.5 生成器协程风格和回风格对比总结 在回风格: 存在链式回(虽然示例嵌套回只有一层) 请求和响应也不得不分为两个回以至于破坏了同步代码那种结构 程序员必须在回之间维护必须的状态。...它主要解决的就是在生成器里玩生成器不方便的问题。它有两大主要功能。 第一个功能是:让嵌套生成器不必通过循环迭代yield,而是直接yield from。以下两种在生成器里玩子生成器的方式是等价的。...那为什么需要改进呢? 首先,我们是在基于生成器做协程,而生成器还得是生成器,如果继续混用yield和yield from 做协程,代码可读性和可理解性都不好。

6.9K56
  • 从Generator入手读懂 co 模块源码(干货)

    在generator具体运用,每次遇到yield关键字都会暂停执行,当调用迭代器的next时,会将yield后面表达式的值作为返回对象的value,比如上面生成器的执行结果如下: ?...yield* 简单理解,yield*就是在生成器里面调用另一个生成器,但是他并不会占用一个next,而是直接进入被调用的生成器去运行。...异步应用 前面讲了Generator的基本用法,我们用它来处理一个异步事件看看。...next itor.next(); 这个例子我们在生成器里面写了一个请求方法,这个方法会去发起网络请求,每次网络请求成功后又继续调用next执行后面的yield,最后是在外层手动一个next触发这个流程...上面这段代码跟co版的promise其实就是等价的。

    65930

    两个try catch引起的对JS事件循环的思考

    前言 最近在跟朋友闲聊时讨论到一个问题,同样都是异步处理,为什么setTimeout回抛出的异常不能被try catch, try { setTimeout(() => { throw...不过这里需要注意一下,由于Promise采用了回函数延迟绑定,所以在执行resolve函数的时候,回函数还没有绑定,那么只能推迟回函数的执行。...这就是为什么大家常说Promise是微任务的原因了。...下面我们就来看看生成器函数的具体使用方式: 在生成器函数内部执行一段代码,如果遇到yield关键字,那么V8将返回关键字后面的内容给外部,并暂停该函数的执行。...基于生成器函数出现了很多执行器框架,比如大名鼎鼎的co,使得我们可以像在写同步代码一样写异步代码

    1.1K10

    JavaScript 权威指南第七版(GPT 重译)(五)

    yield和yield*只能在生成器函数内部使用,但是这段代码的嵌套箭头函数是一个普通函数,而不是function*生成器函数,因此不允许使用yield。...对于生成器来说,你不能定义一个自定义的return()方法来处理清理工作,但你可以结构化生成器代码以使用try/finally语句,在生成器返回时确保必要的清理工作已完成(在finally块)。...通过强制生成器返回,生成器的内置return()方法确保在生成器不再使用时运行清理代码。...这段代码有些复杂,你可以用它来测试你对我们在这一长章节涵盖的内容的理解。...¹ V8 JavaScript 引擎的一个错误意味着这段代码在 Node 13 无法正常工作。

    24210

    PEP 255--简单的生成器

    例如,tokenize.py 可以生成下一个 token 而不是用它作为参数调用回函数,而且 tokenize 客户端可以以自然的方式迭代 tokens:Python 生成器是一种迭代器,但是特别强大...在后续的版本,yield 将是一个语言关键字,不再需要 future 语句。 yield 语句只能在函数内部使用。包含 yield 语句的函数被称为生成器函数。...语句: return 注意,生成器主体的 return 语句不允许使用 expression_list (然而当然,它们可以嵌套地使用在生成器里的非生成器函数)。...CPython 的实现也大量利用它来检测哪些函数是生成器函数(尽管一个新的关键字替代 def 就能解决 CPython 的问题,但人们问“为什么要新的关键字”问题时,并不想要新的关键字)。...使用它需要您从源代码构建 Python。 这是衍生自 Neil Schemenauer【注释7】的早期补丁。

    57520

    JS异步编程的一些总结

    而是一旦某段代码出现错误流程就会被阻塞。如果界面的渲染依赖这段代码,反应到浏览器上就会影响界面的渲染流程,进而出现各种问题。 JS中最常见的解决这个问题的方法有这么几种:一是回函数。...('map-stand-by') } // initPage() 这段代码毫无疑问是同步的,因为showMap()要在initPage()执行完成后才执行。...因为,在promise语句中,我们只有在then()方法的回才可以取到返回值。但是使用await后,我们可以直接取到返回值。这个问题理论上应该和生成器有关。...如果你在async函数体之外使用它,就会抛出语法错误 SyntaxError。 最后一个我能想到的跟异步有关的方法是yield。yield 关键字用来暂停和恢复一个生成器函数。...yield关键字使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的return关键字。对它有兴趣的可以去看下迭代器和生成器的知识点。

    41120

    JavaScript的Generator(生成器)

    众多回函数嵌套使用,执行的顺序不符合我们大脑常规的思维逻辑,回逻辑嵌套比较深的话调试代码时可能会难以定位。...Promise恢复了异步回的可信任性,而Generator正是以一种看似顺序、同步的方式实现了异步控制流程,增强了代码可读性。...可以通过next()方法去启动生成器以及控制生成器的是否往下执行。 yield/next:这是控制代码执行顺序的一对好基友。...通过yield语句可以在生成器函数内部暂停代码的执行使其挂起,此时生成器函数仍然是运行并且是活跃的,其内部资源都会保留下来,只不过是处在暂停状态。...this和他的原型 Generator的this就是谁调用它,那么this就是谁, 我们利用Reflect.apply可以改变Generator的上下文: function* gen() {

    1.3K10

    ES2015新语法详解——生成器(Generator)

    for (var i = 0; i < 10; i++) console.log(generator.next().value) //=> 0 1 1 2 3 5 8 13 21 34 55 你一定会对这段代码感到很奇怪...这在生成器内部的代码上是不需要过多体现的,只需要清楚yield语句是暂停的标志及其作用即可。...我们回过头来再看看生成器函数,是否也可以使用@@toStringTag属性来对生成器函数进行类型检测呢?我们在一个同时支持生成器和@@toStringTag的运行环境运行下面这段代码。...这就说明如果我们将异步IO的操作通过yield语句来从生成器执行对象带到主线程,在主线程完成后再通过.next(value)方法将执行结果带回到生成器执行对象,这一流程在生成器代码是可以以同步的写法完成的...上面我们通过封装所得到的异步方法在生成器内部执行后,可以通过yield语句将内层的函数带到主线程。这样我们就可以在主线程执行这个函数并得到返回值,然后将其返回到生成器执行对象

    81050

    PHP7.+系列新特性和新变更

    Closure::call 闭包绑定 简短干练的暂时绑定一个方法到对象上闭包并调用它。...预期 它使得在生产环境启用断言为零成本,并且提供当断言失败时抛出特定异常的能力。...它允许在生成器函数通过使用 return 语法来返回一个表达式 (但是不允许返回引用值), 可以通过调用 Generator::getReturn() 方法来获取生成器的返回值, 但是这个方法只能在生成器完成产生工作以后调用一次...这也意味着,当发生错误的时候,以前代码的一些错误处理的代码将无法被触发。 因为在 PHP 7 版本,已经使用抛出异常的错误处理机制了。...(如果代码没有捕获 Error 异常,那么会引发致命错误)。set_error_handle不一定接收的是异常,有可能是错误。

    66530

    深入理解JS的事件循环

    独家授权发布,如果觉得文章有帮助,欢迎点击阅读原文给作者点个赞~ 前言 ★「 本文共 8606 字,预计阅读全文需要 28 分钟 」 本文将从万物初始讲起JS世界的运转规则,也就是事件循环,在这个过程你就能明白为什么需要这些规则...阅读本文前可以思考下面几个问题: 你理解的事件循环是怎样的? 有宏任务了,为什么还要有微任务,它们又有什么关系? promise非常重要,你可以手撕promise/A+规范了吗?...” 在单线程,每次只能执行一个任务,而其他任务就都处于等待状态。如果其中一个任务执行时间过久,那么下一个任务就要等待很长时间。...再来看下,它是具体是怎么暂停执行和恢复执行的: 在生成器函数内部执行一段代码,如果遇到yield关键字,那么JavaScript引擎将返回关键字后面的内容给外部,并暂停该函数的执行。...(0) foo() console.log(3) 想要知道上面这段代码执行结果如何,就先看看这段代码的执行流程图,我已经画出来了: ?

    4K60

    WeeklyPEP-8-PEP 492-使用 async 和 await 语法的协程-overview

    这种实现方式能够让新语法(只能在 async 函数中使用)与现有代码无缝结合。...或在生成器上实现 __cocall__。...要在生成器式协程调用 cofunctions,需要使用内置的 costart(cofunc, *args, **kwargs); 因为 cofunction 必须使用 cocall 关键字调用 ,因此自动避免在生成器式协程忘记使用...为什么选择 async 和 await 关键字 在众多编程语言中,async/await 已经不是一个新鲜的概念了: C# 很久以前就是使用它们,请看 引用 5; ECMAScript 7 也提议键入...为什么复用 for 和 with 语句 无论是现有的生成器式协程还是本提案提出的原生协程都更希望使用者能够明显地看到代码可能阻塞的位置。

    11710

    PHP生成器的运用 yield 关键字

    成器允许你在 foreach 代码代码来迭代一组数据而不需要在内存创建一个数组, 那会使你的内存达到上限,或者会占据可观的处理时间。...如果生成器仍然有效,则抛出异常。 public function __wakeup(){} //序列化回,在生成器不能被序列化时抛出异常。...它允许在生成器函数通过使用 return 语法来返回一个表达式 (但是不允许返回引用值), 可以通过调用 Generator::getReturn() 方法来获取生成器的返回值, 但是这个方法只能在生成器完成产生工作以后调用一次...; foreach ($gen as $val) { echo $val, PHP_EOL; } echo $gen->getReturn(), PHP_EOL; //返回 1 2 3 在生成器能够返回最终的值是一个非常便利的特性..., 因为它使得调用生成器的客户端代码可以直接得到生成器(或者其他协同计算)的返回值, 相对于之前版本客户端代码必须先检查生成器是否产生了最终的值然后再进行响应处理 来得方便多了。

    64950

    (建议收藏)关于JS事件循环, 这一篇就够啦

    本文将从万物初始讲起JS世界的运转规则,也就是事件循环,在这个过程你就能明白为什么需要这些规则。有了规则JS世界才能稳稳的运转起来,所以这些规则非常重要,但是你真的了解它们了吗?...阅读本文前可以思考下面几个问题: 你理解的事件循环是怎样的? 有宏任务了,为什么还要有微任务,它们又有什么关系? promise非常重要,你可以手撕promise/A+规范了吗?...在单线程,每次只能执行一个任务,而其他任务就都处于等待状态。如果其中一个任务执行时间过久,那么下一个任务就要等待很长时间。...再来看下,它是具体是怎么暂停执行和恢复执行的: 在生成器函数内部执行一段代码,如果遇到yield关键字,那么JavaScript引擎将返回关键字后面的内容给外部,并暂停该函数的执行。...(0) foo() console.log(3) 想要知道上面这段代码执行结果如何,就先看看这段代码的执行流程图,我已经画出来了: [1709aa6dbc257e69?

    1.5K31

    每个 Flutter 开发人员都应该知道的 16 个 Dart 技巧(第三节)

    这是一个简单的程序,显示如何使用字符串乘法打印中国加油,甘肃挺住: 我的家乡甘肃现在生病了,但我相信他会好起来的!...需要一个只能实例化一次的类(又名单例)?使用带有私有构造函数的静态实例变量。 单例最重要的特性是整个程序只能有一个它的实例。这对于建模文件系统之类的东西很有用。...因此,其他文件的任何代码只能通过instance变量访问此类: //其他文件的.dart final fs = FileSystem.instance; // 用 fs 做点什么 注意:如果您不小心...这在您的测试代码编写模拟类时很有用。 15. 通用流构造器 Stream 类还带有一些方便的构造函数。...同步和异步生成器 在 Dart ,我们可以将同步生成器定义为一个返回 的函数Iterable: Iterable count(int n) sync* { for (var i = 1;

    1.2K10

    python协程2:yield from 分析

    : 协程终止时如何返回值 yield新句法的用途和语义 让协程返回值 先看一个例子: 这段代码会返回最终均值的结果,每次激活协程时不会产出移动平均值,而是最后一次返回。...在python3.3前,如果生成器返回值,会报错 return Result(count, average) 我们调用这段代码,结果如下 >>> coro_avg = averager() >>>...54], 'boys;m': [1.6, 1.8, 1.8, 1.7, 1.55, 1.6], } if __name__ == '__main__': main(data) 这段代码从一个字典读取男生和女生的身高和体重...除了这段代码之外,PEP380 还有个说明: In a generator, the statement return value is semantically equivalent to raise...这也就是为什么 yield from 可以使用return 来返回值而 yield 只能使用 try … except StopIteration … 来捕获异常的value 值。

    83110

    Python3的生成器进阶(sendclosethrow)

    目前面临的问题是:1、回模式编码复杂度高;2、同步编程的并发性不高;3、多线程编程需要线程间通信(目前是lock机制);对于这些问题我们采取的办法就是:1、使用同步的方式去编写异步的代码;2、使用单线程去切换任务...的代码,当函数B3的代码执行完毕,就回到函数A的2位置,继续执行到函数A的3处,进而完成函数的运行后退出程序。...也就是说它A函数代码运行到B处只是运行B函数的逻辑,而不是直接暂停B函数的运行,转而运行A函数3处的逻辑了,这个是我们需要的,但是它目前还做不到。...那么在使用生成器时,第一次为什么要发送一个值为None的变量呢?...现在生成器调用close方法且其中包含未执行的含yield代码,我们又不想让它报错,那该怎么办呢?

    1.1K20

    JavaScript 哪一种循环最快呢?

    (const v of arr) {} // for...of :- 11.7ms console.timeEnd('⏳'); 造成这样结果的原因很简单,在代码...(译者注:但值得注意的是,for…of 和 forEach 都从对象获取了数据,而原型并没有,因此没有可比性。) 循环的类型,以及我们应该在何处使用它们 1....我们可以在任何我们需要的地方使用 for 循环,按照核定的次数运行一段代码。最基础的 for 循环运行最迅速的,那我们每一次都应该使用它,对吗?...2. forEach 这个方法需要接受一个回函数作为输入参数,遍历数组的每一个元素,并执行我们的回函数(以元素本身和它的索引(可选参数)作为参数赋予给回函数)。...// 输出 3, 5, 7 } for (let i of str) { console.log(i); // 输出 'h', 'e', 'l', 'l', 'o' } 需要注意的是,请不要在生成器中使用

    1.2K40
    领券