Articles of recursion

javascriptrecursion堆栈溢出

有没有人会解释为什么结果不同下面? // test one function computeMaxCallStackSize() { try { return computeMaxCallStackSize() + 1; } catch (e) { return 1; } } console.log(computeMaxCallStackSize()); 结果是17958 // test two function computeMaxCallStackSize() { try { return 1 + computeMaxCallStackSize(); } catch (e) { return 1; } } console.log(computeMaxCallStackSize()); 结果是15714 当函数“computeMaxCallStackSize”的位置不同时,结果也是不同的。 什么原因? 非常感谢! 运行环境: node.js v6.9.1 OS:Win7

使用promise的asynchronousrecursion

所以我试图把我的代码转移到“承诺世界”,并在许多地方,当我不得不与asynchronousfunction“循环” – 我只是用这种方式recursion function doRecursion(idx,callback){ if(idx < someArray.length){ doAsync(function(){ doRecursion(++idx,callback) }); }else{ callback('done!') } } doRecursion(0,function(msg){ //… }); 现在我正在努力把变化变成承诺的世界,而且我很困难 var Promise = require('bluebird') function doRecursion(idx){ return new Promise(function(resolve){ if(idx < someArray.length){ doAsync(function(){ //… doRecursion(++idx) // how do i call doRecusion here…. }); }else{ resolve('done!') } }); } doRecursion(0).then(function(msg){ //… }); 谢谢。

nodejs中有限的函数调用同一个操作?

我目前正在进行一些科学计算,对于这些计算,只要至less有一个参数是错误的,我的基计算循环就会一遍又一遍地执行recursion调用。 目前我的nodejs服务器停止在大约905-915recursion函数调用。 奇怪的是,它不会崩溃,也不会输出任何错误。 它只是停止做任何事情 – >没有更多的日志等 这是从节点的一些保护行为,以避免溢出? 现在我正在为此苦苦挣扎几周,同时试图用尽可能智能的软件来限制“循环”。 感谢您的帮助和build议。 问候Noa。 根据要求,我提供了一些我的实际代码的抽象 我希望这有帮助。 我不能把我原来的代码放在这里,因为它包含了超过1.5万行 – 很多东西需要检查。 但是下面的例子涵盖了recursion调用背后的基本逻辑。 // Contains objects which contain an array // which represents the amount of the ex_obj terms var amount = { a:[10,10], b:[7.5,7.5], c:[2.5,2.5,2.5,2.5] } // Contains objects, which contain an array of other objects // that represent some selection […]

在使用节点JS的DynamoDB查询中recursion提取所有项目

这可能是一个比DynamoDB特定问题更多的JS / Async问题 – 我想用Amazon的DynamoDB中的散列键获取表中的所有项目。 表中也有Range键。 我正在使用一个NodeJS库,它是AWS DynamoDB REST API的包装器。 – 节点 – DynamoDB DynamoDB只会为每个查询返回1 MB的结果。 要提取结果提醒,它包括lastEvaluatedKey 。 我们可以在另一个查询中包含这个来获取另一个1 MB值的结果,等等… 我在编写recursionasynchronous函数时遇到了困难,它应该按顺序打到服务,直到我可以得到所有结果为止。 (表格永远不会超过10 MB用于我的用例,没有失控查询的机会) 一些伪代码的插图: ddb.query('products', primarykey, {}, function(err,result){ //check err if(result && result.lastEvaluatedKey){ //run the query again var tempSet = result.items; //temporarily store result.items so we can continue and fetch remaining items. } else{ var […]

无法在节点v6.4.0中启用尾部呼叫优化

我不想在节点/ es2015中进行尾部调用优化,但是我一直得到RangeError: Maximum call stack size exceeded 。 所以我尝试了一个非常简单的testing函数: function countTo(n, acc) { if(n === 0) { return acc; } return countTo(n – 1, acc + n); } console.log(countTo(100000 , 0)) 它仍然失败。 我试过添加'use strict'; 在函数体内部和文件的顶部。 我试过使用–harmony和–harmony-tailcalls 球拍中的function与预期相同: #lang racket (define count-to (lambda (n acc) (cond ((= n 0) acc) (else (count-to (- n 1) (+ […]

在javascript中使用asynchronouscallback模式的无限循环

假设我想发送一个asynchronousAJAX请求到服务器,当它响应发送另一个请求,并永远重复: function sendXHR(url, callback) { // Send XMLHttpRequest to server and call callback when response is received } function infinite() { sendXHR('url/path', infinite); } infinite(); 我假设在这里我们会很快耗尽堆栈空间,所以我怎样才能做到这一点(没有阻塞)? 传递callback而不是使用return的模式在node.js特别stream行。 人们如何创造无限循环? 我不相信大多数JS引擎做任何forms的尾部呼叫优化。

使用async.js进行asynchronous树遍历

我试图使用async.js遍历一个嵌套的项目树。 遍历一个分支后,遍历终止。 var count=0; exports.buildFamily = function(item_id, mback){ var extendedFamily={}; exports.getItembyId(item_id, function(err, item){ extendedFamily=item; if(item.descendants){ extendedFamily.kids=[]; count=+item.descendants.length; console.log('outercount ' + count); async.eachSeries(item.descendants, function(item){ count– console.log('item: ' + item) exports.buildFamily(item, function(err, family){ console.log('deepcount: ' + count); extendedFamily.kids.push(family); if(count===0){ return mback(null, extendedFamily);} else {extendedFamily.kids.push(family);} }) }) } else{ if(count===0){ return mback(null, extendedFamily);} else{ extendedFamily.kids.push(family); return; } } […]

理解node.js中recursion函数的承诺

我试图使用recursion调用从redis中获取数据,当成员返回null时停止并返回。 所以我的数据是这样添加的: SADD parents.<name> <parent1> <parent2> SADD parents.<parent1> <grandparent1> <grandparent2> … 最终的数据应该如下所示: [ { label: <name>, parents: [ { label: <parent1>, parents: [ {label: <grandparent1>}, {label: <grandparent2> }] }, { label: <parent2> } ] } ] 这里是我搞乱的代码(来自不同来源的拼凑在一起),但我不知道我在做什么。 不知道这个代码是否有用,我可能会偏离轨道。 var redis = require('node-redis'); var r_client = redis.createClient(); var Q = require('q'); function getFromRedis(nodeName){ var ret = […]

在Nodejs中pipe理大量的callbackrecursion

在Nodejs中,几乎没有阻塞的I / O操作。 这意味着几乎所有的nodejs IO代码都涉及很多callback。 这适用于从数据库,文件,进程等读写数据,这是一个典型的例子: var useFile = function(filename,callback){ posix.stat(filename).addCallback(function (stats) { posix.open(filename, process.O_RDONLY, 0666).addCallback(function (fd) { posix.read(fd, stats.size, 0).addCallback(function(contents){ callback(contents); }); }); }); }; … useFile("test.data",function(data){ // use data.. }); 我期待写代码将做许多 IO操作,所以我期望写很多callback。 我很喜欢使用callback,但我担心所有的recursion。 我是否有陷入过度recursion的危险,并在某个地方吹过堆栈? 如果我用成千上万的callback函数向我的键值存储进行数千次单独写入,我的程序是否会最终崩溃? 我是误解还是低估了影响? 如果没有,有没有办法解决这个问题,同时仍然使用Nodejs的callback编码风格?

在Javascript中获取文件夹和文件列表的最佳方式

我正在使用node-webkit,并试图让用户select一个文件夹,然后我将返回该文件夹的目录结构并recursion获取其子项。 我已经很简单的使用这个代码(在一个Angular Controller中)。 var fs = require('fs'); $ scope.explorer = []; $ scope.openFile = function(){ $ scope.explorer = [tree_entry($ scope.path)]; get_folder($ scope.path,$ scope.explorer [0] .children); }; 函数get_folder(path,树){ fs.readdir(path,function(err,files){ (err)return console.log(err); files.forEach(function(file,idx){ tree.push(tree_entry(文件)); fs.lstat(path+ '/' +文件,function(ERR,统计数据){ (err)return console.log(err); 如果(stats.isDirectory()){ get_folder(path+ '/' +文件,树[IDX]。儿童); } }); }); }); 的console.log($ scope.explorer); 返回; } 函数tree_entry(entry){ return {label:entry,children:[]} } 以一个中等大小的文件夹与22个子文件夹和大约4级深,需要几分钟来获得整个目录结构。 有什么我明显做错了吗? […]