【问题标题】:Dynamic Nested Loop动态嵌套循环
【发布时间】:2012-03-09 23:44:33
【问题描述】:

我对编程比较陌生。正如标题所示,我需要一种算法,让我获得与变量嵌套循环相同的功能。即

for(..)
{ for(..){
for(..){....}
.
.
}}

嵌套循环的数量会因用户输入而异。我想要实现的是找到数字的所有组合 (10,9,8,7,6,5,4) 现在我已经阅读了很多。要么我不完全理解它们(我是编程世界的新手),要么它不符合我的目的。我稍后在某些计算中需要这些组合,而不仅仅是打印所有组合。据我所知,一种方法是使用递归。我不完全理解。我试图创建一个递归函数,但惨遭失败。这就是我想要的

10 10 10 
10 10 9
10 10 8
.
.
.
4  4  4 

数字可以改变(如 10 10 10 10 , 10 10 10 9 .. )这些组合将存储在一个数组中,因为我需要它们稍后进行操作。请保持简单并发表评论。

首选语言是 java。任何语言都可以。强烈建议使用通用算法。附:这不是家庭作业。

感谢阿米特。这是工作代码

def findcombinations(array,n,sol,tt=[]):
    if (n== 0):
        tt.append(sol[:])
        return
    for x in array:
        sol.append(x)
        findcombinations(array,n-1,sol,tt)        
        del sol[-1]
    return tt      

调用函数使用 print(findcombinations([1,2],3,[]))

【问题讨论】:

  • 学究式地说,“10”不是数字。您不妨改写一下。
  • 对不起..我会把它改成数字..谢谢

标签: java algorithm dynamic loops nested


【解决方案1】:

通常当您需要“动态循环”时 - 这强烈表明您确实需要 recursion

例如,查找数组[伪代码]中数字的大小n的所有可能组合:

findCombinations(array,n,sol):
   if (sol.size == n): //stop condition for the recursion
      print sol
      return
   for each x in array:
      sol.append(x)
      findCombinations(array,n-1,sol) //recursive call
      sol.removeLast() //cleaning up environment

上面的伪代码将查找并打印由来自array的元素组成的长度为n的所有序列[每个元素可以出现多次]

【讨论】:

  • 我并不完全遵循 sol 的尺寸。就像我说的,我只是不想让它们打印,而是使用它们。 (对不起,如果我遗漏了一些东西,主要是因为我对此并不陌生)。同样在java中,你可以动态增加数组的大小吗? (即 sol.append(x)) 还有如何计算 n ?我应该事先计算排列数吗?谢谢。
  • 这里面的sol究竟是什么? :( 对不起,我是个菜鸟。
  • 我肯定错过了很多。请解释。我错了。你能说具体语言吗?我以为我可以从一般表示中理解。但我错了。谢谢。
  • @Oasa:不需要道歉。 sol 保存当前排列[您当前正在处理的]。当算法开始时,它被初始化为一个空列表,并动态添加元素。有很多方法可以实现这个sol,但最简单的可能是使用ArrayList。请注意,ArrayList.add(element) 将元素附加到列表的末尾
  • 我理解了ArrayList的概念。为此非常感谢。现在 sol 是我想的一个数组列表。最初它是零。我想,“数组”是整个排列。我还是不明白。
【解决方案2】:

所以你有一个或多个(嗯,可能是三个或更多)数字,应该能够在 4 到 10 之间?一种方法是使用一个简单的计数器和一个将计数器转换为数字数组的函数。

在伪代码中:

counter_to_array(counter, positions):
  var array = new array(positions)

  for 0 <= i < positions:
    n = counter % 7
    counter = counter // 7  # INTEGER DIVISION
    array[i] = 4 + n

  return array

也就是说,您的数组隐含在计数器中,您可以根据需要重新创建它。这可能不是您真正需要的,并且如所写,数组将变为“4 4 4”“5 4 4”“6 4 4”...“10 10 9”“10 10 10”,但更改顺序为就像改变数组位置的填充顺序一样简单。

工作示例: 我们要生成一个 4 元素计数器,即第 11 个。

  1. 我们创建一个 4 元素数组,称为数组。
  2. 我们循环遍历数组位置:
  3. 我们将 array[0] 设置为 8 (4 + (11 mod 7)))
  4. 我们将计数器设置为 1 (11 div 7)
  5. 我们将 array[1] 设置为 5 (4 + (1 mod 7))
  6. 我们将计数器设置为 0 (1 div 7)
  7. 我们将 array[2] 设置为 4
  8. 我们将 array[3] 设置为 4

所以,第 11 个数组将是 [8 5 4 4]

【讨论】:

  • 假设我调用 counter_to_array(10,4) 它创建了一个维度为 4 的新变量数组;是数组 [4] 吗?然后是一个从 0 到 4 的循环。然后 n = 3;计数器 = 3;数组[0]=3;数组[1]=3;等等。然后我得到一个充满 3s 的数组?我肯定错过了很多。请解释。我错了。你能说具体语言吗?我以为我可以从一般表示中理解。但我错了。我不明白目的 % 7 :( 谢谢。
  • @oasa 每轮计数器除以 7,我添加了一个工作示例,希望对您有所帮助。
  • 我真的跟不上。可能是因为我的菜鸟。 NP。我从@amit 的回答中找到了它。还是谢谢你。一直很感激。
【解决方案3】:

下面给出了一个使用 while 循环的解决方案。代码是 C++ 并且需要 # 用于包含和定义语句

include <iostream>
define MAXROWS 9
define MAXVALUES 9

using namespace std;
char display[] = {'1','2','3','4','5','6','7','8','9'};

int main() {

int arrs[MAXROWS];  // represent the different variables in the for loops

bool status = false;

for (int r=0;r<MAXROWS;r++)
    arrs[r] = 0;  // Initialize values

while (!status) { 

    int total = 0;
    // calculate total for exit condition
    for (int r=0;r<MAXROWS;r++)
        total +=arrs[r];
    // test for exit condition
    if (total == (MAXVALUES-1)*MAXROWS)
        status = true;

    // printing
    for (int r=0;r<MAXROWS;r++)
        cout << display[arrs[r]]; // print(arrs[r])
    cout << endl;  // print(endline)

    // increment loop variables
        bool change = true;
    int r = MAXROWS-1;  // start from innermost loop
    while (change && r>=0) {
        // increment the innermost variable and check if spill overs
        if (++arrs[r] > MAXVALUES-1) {        
            arrs[r] = 0;  // reintialize loop variable
            // Change the upper variable by one
            // We need to increment the immediate upper level loop by one
            change = true;
        }
        else
            change = false; // Stop as there the upper levels of the loop are unaffected

        // We can perform any inner loop calculation here arrs[r]

        r=r-1;  // move to upper level of the loop

    }

}

[链接]http://www.codeproject.com/Tips/759707/Generating-dynamically-nested-loops 它展示了如何在不使用递归的情况下将简单的多重嵌套循环转换为动态循环。

【讨论】:

  • 你不应该只发布链接的答案
  • 抱歉,我提供了一个示例代码,描述了一种可能的解决方案。
猜你喜欢
  • 2015-05-24
  • 2021-01-15
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
  • 2016-10-16
  • 2012-12-01
  • 1970-01-01
相关资源
最近更新 更多