algorytm generowania wszystkich m-częściowych kompozycji

karol32
Użytkownik
Użytkownik
Posty: 1
Rejestracja: 23 lis 2010, o 17:32
Płeć: Mężczyzna
Lokalizacja: Polska

algorytm generowania wszystkich m-częściowych kompozycji

Post autor: karol32 »

Witam ,
Mam prośbę....czy możecie rzucić okiem na rozwiązanie tego zadania ...chciał bym się upewnić czy jest w 100% dobrze rozwiązane...lub zaproponujcie jakieś zmiany .z góry dzięki
Treść zadania

Kompozycją m-częściową liczby całkowitej dodatniej n nazywamy uporządkowany ciąg m liczb całkowitych dodatnich, których suma wynosi n. Na przykład mamy sześć 3-częściowych kompozycji liczby 5: (1,1,3), (1,2,2), (1,3,1), (2,2,1), (3,1,1), (2,1,2).
Podaj algorytm generowania wszystkich m-częściowych kompozycji liczby n.

Kod: Zaznacz cały

KOMPOZYCJA (A, n, m, K=1)
If n>0
   then if K<m
      then for i <- 1 to n-(m-k)
         do A[K] =i
            KOMPOZYCJA (A, n-i, m, k+1)
      else
         A[K] =n
         Write (A)
pfauel
Użytkownik
Użytkownik
Posty: 32
Rejestracja: 26 lis 2009, o 01:15
Płeć: Mężczyzna
Lokalizacja: Polska
Pomógł: 9 razy

algorytm generowania wszystkich m-częściowych kompozycji

Post autor: pfauel »

Sprawdziłem algorytm dla dwóch przykładów i w obu wynik wygląda prawidłowo, także jeśli Tobie też wynik wychodzi prawidłowy to myślę, że można założyć, że jest ok.
Tylko jedną uwagę mam: jeżeli będziesz to przenosił na jakiś język programowania to uważaj na ten array A. Na przykład w Javie array jest referencją - nie jest przekazywana kopia - także w dokładnie takiej postaci, jak jest w twoim pseudokodzie ten algorytm nie zadziała.
Jeśli masz komuś pokazywać ten pseudokod, to właściwie nie wiem, czy można założyć, że przy przekazywaniu tablicy, jako parametru, przekazywana jest kopia. Myślę, że powinieneś jakoś to przynajmniej zaznaczyć.
pozdrawiam
adam27u
Użytkownik
Użytkownik
Posty: 9
Rejestracja: 10 kwie 2011, o 19:26
Płeć: Mężczyzna
Lokalizacja: Rybnik
Podziękował: 2 razy

algorytm generowania wszystkich m-częściowych kompozycji

Post autor: adam27u »

Cześć,
Jestem w takiej sytuacji że też potrzebuje wykonać to zadanie ale nie bardzo rozumiem jak działa algorytm napisany przez Karola.
Będę bardzo wdzięczny jeżeli ktoś wytłumaczy mi linia po linii jak to działa.

Z góry dziękuję
OShon
Użytkownik
Użytkownik
Posty: 65
Rejestracja: 4 mar 2014, o 00:32
Płeć: Mężczyzna
Lokalizacja: VBATools | Kraków | Poland | Europe | Earth | SolSystem | SomewareInSpace
Podziękował: 1 raz
Pomógł: 7 razy

algorytm generowania wszystkich m-częściowych kompozycji

Post autor: OShon »

Jeśli ktoś jest ciekawy jak taką pętlę zrealizować w VBA to oto rozwiązanie:

Kod: Zaznacz cały

Sub test()
    Debug.Print rozklad(5)
    '(1,1,3),(1,2,2),(1,3,1),(2,1,2),(2,2,1),(3,1,1)
    Debug.Print rozklad(6)
    '(1,1,4),(1,2,3),(1,3,2),(1,4,1),(2,1,3),(2,2,2),(2,3,1),(3,1,2),(3,2,1),(4,1,1)
End Sub

Function rozklad(wartosc&) As String
Dim x&, y&, z&, o$
For x = 1 To wartosc
    For y = 1 To wartosc
        For z = 1 To wartosc
            If x + y + z = wartosc Then _
            o = o & "(" & x & "," & y & "," & z & "),"
        Next z
    Next y
Next x
rozklad = Mid(o, 1, Len(o) - 1)
End Function
ODPOWIEDZ