动态嵌套循环

时间:2012-02-19 07:29:32

标签: java algorithm dynamic loops nested

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

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。任何语言都可以。强烈建议使用通用算法。附:这不是作业。

感谢amit。这是工作代码

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,[]))

3 个答案:

答案 0 :(得分:3)

通常当您需要“动态循环”时 - 它强烈表明您确实需要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

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

答案 1 :(得分:3)

所以你有一个或多个(好的,可能是三个或更多)数字,应该能够在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. 我们创建一个名为array的4元素数组。
  2. 我们遍历数组位置:
  3. 我们将array [0]设置为8(4 +(11 mod 7)))
  4. 我们将反击设置为1(11 div 7)
  5. 我们将数组[1]设置为5(4 +(1 mod 7))
  6. 我们将counter设置为0(1 div 7)
  7. 我们将数组[2]设置为4
  8. 我们将数组[3]设置为4
  9. 因此,第11个阵列将是[8 5 4 4]

答案 2 :(得分:1)

下面给出了使用while循环的解决方案。代码用C ++编写,需要#用于include和define语句

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 它显示了如何在不使用递归的情况下将简单的多个嵌套循环转换为动态循环。