当前位置: 首页 > 知识库问答 >
问题:

编写一个递归函数,循环遍历未知深度的嵌套循环

司徒啸
2023-03-14

给定一个值数组:

var values = new Array(); 

array.push(2);
array.push(3);
array.push(4); 

我想创建一个迭代函数,它可以存储任意长度数组中所有可能的值组合。

例如,在这种情况下,可能的值是(1,1,1)(1,1,2)(1,1,3)(1,1,4)(1,2,1)(1,2,2)(1,2,3)(1,2,4)(2,1,1)(2,1,2)(2,1,3)(2,1,4)(2,2,1)(2,2,2)(2,2,3)(2,2,4)

我知道要做到这一点,我需要使用一个递归函数,如果没有达到最大深度,它会更深一层并再次调用该函数。。。

我知道从哪里开始(大概吧,我想)

function iterativeLoop(level, depth) {
    for(var i = 0; i < values.length; i++) {
        if(level < depth) {
            iterativeloop(level+1, depth);
        }
        else if (level=depth) {
        }
   }
}

我不确定一旦函数被调用得更深,我如何才能访问“上层”级别...也就是说,我不确定如何访问(1,2,4)而不仅仅是(?,?,4)

我希望这有意义?

(对不起,我知道我的标题不是很好,我不知道如何简洁地解释它)

共有2个答案

金令
2023-03-14

您不需要递归,因为任意数据集的长度是在运行时开始时定义的:

var numbers = [2,3,4];
var result_array = [];
var num_product = 1;
var i=0, j=0, k=0; // iterators

for (i=0; i<numbers.length; i++) {
    num_product *= numbers[i];
}
for (i=0; i<num_product; i++) {
    result_array.push([]);
}
for (i=0; i<result_array.length; i++) {
    product = 1;
    for (j=0; j<numbers.length; j++) {
        k = (Math.floor(i/product)%numbers[j]) + 1;
        product *= numbers[j];
        result_array[i][j] = k;
    }
}

对任意数量的数组元素进行测试和功能。

并行基准测试表明,此代码比递归代码快得多-如果您能够避免递归(例如,您预先知道足够的信息,能够定义整个问题),那么最好这样做,并且当前定义的问题允许您这样做。如果您只是想学习递归,那么这对您没有多大帮助:)

益银龙
2023-03-14

我不确定一旦函数被调用得更深,我如何才能访问“上层”级别...也就是说,我不确定如何访问(1,2,4)而不仅仅是(?,?,4)

您需要传递它们,例如在阵列中。

for(var i = 0; i < values.length; i++)

这不应该是要执行的外部迭代,除非您想在一个简单的嵌套循环中构造一个结果的二维数组(见下文)。相反,您希望value.length是您递归到的深度。在每个递归级别上,您将从1迭代到值[level]。我们将传递一个长度为级别的当前状态数组(上面的问号),而不是传递一个级别

var values = [2,3,4];
function recurse(state) {
    var level = state.length;
    var depth = values.length;
    if (level == depth) {
        console.log.apply(console, state); // or whatever you want to do
    } else {
        for (var i=1; i<=values[level]; i++) {
            state.push(i); // save current question mark
                           // notice state.length = level + 1 now
            recurse(state); // enter next level
            state.pop(); // delete it after we're so state doesn't grow infinitely :-)
        }
    }
}
recurse([]);

如果要对这些值使用迭代,可以通过向结果数组中添加越来越多的状态(每个级别增加一个值)来实现,结果数组最终将包含所有可能的组合:

var values = [2,3,4];
var result = [[]]; // one empty state at level 0
for (var i=0; i<values.length; i++) {
    var reslen = result.length,
        val = values[i];
    var mult = []; // will become the new result with a length of (reslen * val)
    for (var j=0; j<reslen; j++) {
        for (var k=1; k<=val; k++) {
            var state = result[j].slice(); // make a copy
            state.push(k);
            mult.push(state);
        }
    }
    result = mult;
}

// logging the `result` on each level will show us
// 0 - [[]]
// 1 - [[1],[2]]
// 2 - [[1,1],[1,2],[1,3],[2,1],[2,2],[2,3]]
// 3 - [[1,1,1],[1,1,2],[1,1,3],[1,1,4],[1,2,1],[1,2,2],[1,2,3],[1,2,4],[1,3,1],[1,3,2],[1,3,3],[1,3,4],[2,1,1],[2,1,2],[2,1,3],[2,1,4],[2,2,1],[2,2,2],[2,2,3],[2,2,4],[2,3,1],[2,3,2],[2,3,3],[2,3,4]]

您可以看到这与@Jason的方法有多么相似。

 类似资料:
  • 嗯,我已经试过多次了。不过,我一度认为最长的序列函数会有所帮助,因为它显示的是最长的冰雹序列。尽管如此,我似乎不知道如何查找或存储它用于查找的值。如果有人能解释一下,我将不胜感激。 我遇到的问题是我最长的启动顺序: 我不知道如何将其转换为递归,我注意到对于一些递归,我看到人们仍然在使用for循环,但我确信我们不应该使用循环。这可能是一个愚蠢的问题,但如果有人知道的话,有没有一个公式可以将循环转换为

  • 问题内容: 我有一个方法必须执行以下操作: 我想指定嵌套的数量(在上述情况下,我希望嵌套15个)。这里有一种使用递归编程的方法吗? 问题答案: 是。这可以通过递归编程来执行。 我假设您不喜欢在源代码中写下这些嵌套的代码-如您的示例所示,因为这确实是丑陋的编程-如评论员所解释。 下面的代码(类似于Java的伪代码)对此进行了说明。我假设嵌套的深度固定。然后,您实际上想循环遍历尺寸深度的整数向量。 数

  • 问题内容: 是否有人对未知结构的NSDictionary进行了递归有序遍历?我想学习任何NSDictionary,并按层次结构顺序处理每个级别。 1)此数据来自经过验证的JSON。可以肯定地说,从诸如SBJSON(JSON框架)之类的框架创建的NSDictionary仅会导致嵌套字典,数组和任意叶的组合吗? 2)如何使用适用于数组和字典的快速枚举完成泛型遍历?使用下面的代码,一旦我到达数组中的字典

  • 问题内容: 我正在尝试遍历以下内容 我到目前为止所得到的: 有任何想法吗? 问题答案: 在您的代码中,元素是JSON对象的数组,而不是JSON对象本身。元件,和是JSON的一部分内部对象JSON阵列。 您需要遍历数组 版画 我不知道您的代码片段来自何处。

  • 问题内容: 我想知道是否有人可以帮助我创建一个while循环来遍历几个数据库,以便从两列的一个表中获取数据。这是我到目前为止所做的。什么都行不通,因为我不知道如何针对我从每个数据库查询的表来使select语句在每个数据库中正常工作(dbo.tbldoc) 问题答案: 我会考虑使用sp_MSForEachDB,这要容易得多… 编辑:

  • 我有一个这样的数组 我想做的是前面的模型,为其数量绘制徽标,因此三星=3,索尼=7,以此类推,将绘制3个索尼徽标和7个三星徽标。 我想出了这样的办法 但是当然,所有这些都是为了每个数组条目,呼应出名称,所以我最终打印了5个三星,打印了5个索尼,等等。 如何使其使用 qty 数组的值而不是条目数?