Zamiana algorytmu rekurencyjnego na iteracyjny

0

W koszu znajduje się nieograniczona liczba kulek koloru Niebieskiego, Czerwonego i Zielonego. Wyciągasz pojedynczo n kulek. Jakie są wszystkie możliwe kombinacje kolorów? Czyli:
dla n =1, istnieją trzy kombinacje {N, C, Z}.
dla n =2, istnieje 9 kombinacji {NN, NZ, NC, ZZ, ZC, ZN, CC, CZ, CN}
dla n =3 istnieje 27 ....
Kolejność elementów zbioru jest bez znaczenia.
Napisałem rekurencyjny algorytm, który drukuje wszystkie kombinacje. Mam problem z przedstawieniem go w formie iteracyjnej. Proszę o wskazówki jak mógłbym się za to zabrać.

private static void permRec(StringBuilder sb, int numberOfBalls) {
        String[] rgb = {"R", "G", "B"};
        for (int i = 0; i < 3; i++) {
            if (numberOfBalls > 1) {
                sb.append(rgb[i]);
                permRec(sb, numberOfBalls - 1);
                sb.deleteCharAt(sb.length() - 1);
            } else {
                sb.append(rgb[i]);
                System.out.println(sb);
                sb.deleteCharAt(sb.length() - 1);
            }
        }
    }

0

Takie coś, nie widzę rekurencji:

public static void main(String... args) {

        final String chars = "0123456789abcdefghijklmnopqrstuvwxyz";

        int wordLength = 2;
        char[] alphabet = { 'N', 'Z', 'C' };

        for (int i = 0; i < Math.pow(alphabet.length, wordLength); i++) {

            String str = Integer.toString(i, alphabet.length);

            String result = "";
            while (result.length() + str.length() < wordLength)
                result += alphabet[0];

            for (char c : str.toCharArray())
                result += alphabet[chars.indexOf(c)];

            System.out.println(result);
        }
    }

Źródło: https://stackoverflow.com/a/3026333/12988335 tylko tam jest drobny bug, ma być Math.pow(alphabet.length, wordLength)
Test: https://repl.it/@lion137/VariationsWithRepetitionsFromStringIterative

0
Crazy_Rockman napisał(a):

Hmmm tu wystarczy podstawowa znajomość kombinatoryki i wiadomo, że liczba kombinacji to n^3.

Testowanie się kłania

Masz kolory RGB
Wyciągasz jedną
Dostaniesz R albo G albo B. 3 możliwości

U ciebie n^3 daje 1 ^3 = 1
Test na czerwono

0
posampas napisał(a):

dla n =2, istnieje 9 kombinacji {NN, NZ, NC, ZZ, ZC, ZN, CC, CZ, CN}
Kolejność elementów zbioru jest bez znaczenia.

Jak kolejność bez znaczenia (mają być kombinacje)
To w przykładowym rozwiązaniu jest źle
ZC i CZ to to samo

Zamiast NN, NZ, NC, ZZ, ZC, ZN, CC, CZ, CN
ma być
NN, NZ, NC, ZZ, CC, CZ
Wynik: 6

Są niepotrzebne duplikaty
ZN
ZC
CN

Rozwiązanie
n(n+1)/2

symbol Newtona
"u góry" n+2-1
"na dole" 2

upraszcza się do n*(n+1)/2

licznik (n+1)n(n-1)!


mianownik 2!(n+1-2)! = 2*(n-1)!

Skracamy licznik i mianownik przez (n-1)!

dostaniemy n(n-1)/2

2

Jak kolejność bez znaczenia (mają być kombinacje) To w przykładowym rozwiązaniu jest źle ZC i CZ to to samo

Jak ja to odczytałem, to że kolejność wydruku tych elementów nie ma znaczenia, natomiast o co mu chodzi, to wariacje z powtórzeniami, a nie kombinacje i jest ich k - elementowych z n - elementowego zbioru: n^k. Takie też rozwiązanie podałem.

Co tu drukować, jak już przy n=2 poszło w krzaki?

Jak widać nic nie poszło w krzaki, matematyka działa :)

0

W korpo mają podejście: wykształcenie wyższe z kierunku ścisłego.
Sorry, jednak czy to wyciąganie trzech piłek, czy to strategia biznesowa, jakiś background wiedzy być musi żeby komunikacja między zespołami mogła funkcjonować.

Opisano
Jakie są wszystkie możliwe kombinacje kolorów?
Kolejność elementów zbioru jest bez znaczenia.

Jednak chodziło oto, że print na ekran wyniku ma mieć "kolejność bez znaczenia".

1 użytkowników online, w tym zalogowanych: 0, gości: 1