Zamiana algorytmu rekurencyjnego na iteracyjny

Zamiana algorytmu rekurencyjnego na iteracyjny
PO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
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ć.

Kopiuj
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);
            }
        }
    }

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5027
0

Takie coś, nie widzę rekurencji:

Kopiuj
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

BraVolt
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 2918
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

BraVolt
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 2918
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

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5027
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 :)

BraVolt
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 2918
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".

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.