Динамический вложенный цикл - PullRequest
2 голосов
/ 19 февраля 2012

Я относительно новичок в программировании.Как видно из заголовка, мне нужен алгоритм, который позволяет мне получить ту же функцию от переменной вложенного цикла.то есть

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.Подойдет любой язык.Общий алгоритм настоятельно рекомендуется.PS Это не домашнее задание.

Благодаря 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 ]

3 голосов
/ 19 февраля 2012

Итак, у вас есть одно или несколько (ну, может быть, три или более) чисел, которые должны быть в диапазоне от 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. Устанавливаем массив [0] на 8 (4 + (11 мод 7)))
  4. Устанавливаем счетчик на1 (11 дел. 7)
  5. Устанавливаем массив [1] на 5 (4 + (1 мод 7))
  6. Устанавливаем счетчик на 0 (1 дел. 7)
  7. Мы устанавливаем массив [2] в 4
  8. Мы устанавливаем массив [3] в 4

Итак, 11-й массив будет [8 5 4 4]

3 голосов
/ 19 февраля 2012

Обычно, когда вам нужны «динамические циклы» - это сильный признак, который вам действительно нужен рекурсия .

Например, поиск всех возможных комбинаций размера 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 голос
/ 15 апреля 2014

Решение, которое использует цикл 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

    }

}

[Link] http://www.codeproject.com/Tips/759707/Generating-dynamically-nested-loops Показывает, как простой многократный вложенный цикл может быть преобразован в динамический без использования рекурсии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...