没有生成器的JavaScript数组递归

时间:2015-05-16 02:06:39

标签: javascript recursion

如果没有发电机,如何解决以下问题?我在一个正在研究的项目中遇到了类似这样的事情,需要成对进行深度迭代。我只能用发电机解决它。

nums是一个示例输入。输入是一个任意长度的数组,由整数和任意深度的其他数组组成。

在[beforeNum,nextNum]对中迭代nums。这意味着 第一对的第一个值应为null[null, 1])。第二 对应该是[1, 2],依此类推。最后一对应该是[10, 11]

最终,我的实际目标是能够获得第n个人"原子",无论它有多少层次。例如,get(nums, 6)将为7。

const nums = [1, [2, 3, [4, [5, 6], 7], [8, 9, [10], 11]]];

编辑使用@ hugomg的帮助计算出来。当我进去的时候,事实证明,我实际上用一些与普通数组不同的东西来实现它的事实正在阻碍我。该解决方案实际上非常简单:https://gist.github.com/jclem/fbd44c43cb175dbf880e

1 个答案:

答案 0 :(得分:1)

我们可以通过在树上进行简单的遍历来解决您的问题,因为我们继续保持“prev”变量。它只是写一个简单的递归问题:

function iterate(tree, onNum){

    var prev = null;

    function go(x, onNum){
       if(x instanceof Array){
         // If you are using a library that provides
         // an isArray function it can be more accurate than this.
         for(var i=0; i<x.length; i++){
             go(x[i], onNum);
         }
       }else{
         onNum(prev, x);
         prev = x;
       }
    }

    go(tree, onNum);
}

var myTree = [1, [2, 3, [4, [5, 6], 7], [8, 9, [10], 11]]];
iterate(myTree, function(prev, curr){
    console.log(prev, curr);
});

这里不需要使用发电机。如果您需要将迭代器设置为可以“暂停”的外部迭代器,则生成器仅提供帮助。例如,如果您需要并行迭代这些树中的两个。对于使用内部迭代器的当前问题,一些递归很好。