Luka Binarna – problem ze zrozumieniem kodu

0

Witam
Mam problem ze zrozumieniem poniższego kodu, a szczególnie momentu, w którym dochodzą dwie zmienne wejściowe jak "max" i "current". Przykładowo dla liczby 12 z Array (test), pierwszy if = false, drugi true, bo reszta z dzielenia 12/2 równa się 0, natomiast o co chodzi z max i current?

public class Main {

    public static void main(String[] args) {
        int[] tests = { 9, 37, 0b1000001010001, 12 };
        for (int i : tests)
            System.out.printf("input = %d, Binary form = %s, Answer = %d%n",
                    i , Integer.toBinaryString(i), solution(i));
    }
        static int solution(int n){
            return solution(n, 0, 0);
        }

    static int solution(int n, int max, int current) {
        if (n == 0)
            return max;
        else if (n % 2 == 0)
            return solution(n / 2, max, current + 1);
        else
            return solution(n / 2, Math.max(max, current), 0);

    }
}

Po kompilacji dostajemy taki wynik:

input = 9, Binary form = 1001, Answer = 2
input = 37, Binary form = 100101, Answer = 2
input = 4177, Binary form = 1000001010001, Answer = 5
input = 12, Binary form = 1100, Answer = 2
1

current jest to liczba zer, a max jak sama nazwa wskazuje - największa ilość jaka się pojawiła.
Chodzi o to, że podczas zamiany liczby systemu dziesiętnego na binarny dzielisz przez 2. Jeżeli jest reszta z dzielenia to wynosi ona 1 i odpowiada binarnej 1.
Dla przykładu jeżeli chcesz zamienić 9 dec to bin to robisz:

Działanie Wynik Reszta
9/2 4 1
4/2 2 0
2/2 1 0
1/2 0 1

I czytasz od dołu tabeli z kolumny reszta, a to daję Ci zapis binarny.

Teraz gdyby w tabeli zapisać co robi metoda function to zauważysz, że current liczy ile 0 było a gdy jest reset (czyli "nagle" mamy 1) to za pomocą metody Math.max() przypisywany jest większa liczba.

N Max Current
37 0 0
18 0 1
9 1 0
4 1 1
2 1 2
1 2 0
0 2 0

Mam nadzieję że zrozumiale to wytłumaczyłem ;)

0

Nie to, żebym się czepiał (sam się uczę dopiero) ale chyba w takiej formie jest łatwiejsze (czytelniejsze) do zrozumienia.

public class Main {

    public static void main(String[] args) {
        int[] tests = {9, 37, 0b1000001010001, 12};
        for (int i : tests) {
            System.out.printf("input = %d, Binary form = %s, Answer = %d%n",
                    i, Integer.toBinaryString(i), solution(i));
        }
    }

    private static int solution(int n) {
        return solution(n, 0, 0);
    }

    private static int solution(int n, int max, int current) {
        if (n == 0) {
            return max;
        } else if (n % 2 == 0) {
            return solution(n / 2, max, current + 1);
        } else {
            return solution(n / 2, Math.max(max, current), 0);
        }
    }
}
0
atmal napisał(a):

current jest to liczba zer, a max jak sama nazwa wskazuje - największa ilość jaka się pojawiła.
Chodzi o to, że podczas zamiany liczby systemu dziesiętnego na binarny dzielisz przez 2. Jeżeli jest reszta z dzielenia to wynosi ona 1 i odpowiada binarnej 1.
Dla przykładu jeżeli chcesz zamienić 9 dec to bin to robisz:

Działanie Wynik Reszta
9/2 4 1
4/2 2 0
2/2 1 0
1/2 0 1

I czytasz od dołu tabeli z kolumny reszta, a to daję Ci zapis binarny.

Teraz gdyby w tabeli zapisać co robi metoda function to zauważysz, że current liczy ile 0 było a gdy jest reset (czyli "nagle" mamy 1) to za pomocą metody Math.max() przypisywany jest większa liczba.

N Max Current
37 0 0
18 0 1
9 1 0
4 1 1
2 1 2
1 2 0
0 2 0

Mam nadzieję że zrozumiale to wytłumaczyłem ;)

Witaj
Dziękuje za pomoc rozumiem teraz za co odpowiedzialny jest current i max. Zamianę na liczbę binarną też rozumiem, nie mogłem skumać, skąd komputer wie, że trzeba ten proces powtarzać(jeżeli nie ma żadnej pętli), ale potem zobaczyłem, że jest to funkcja rekurencyjna, która wywołuje sama siebie, dopóki n ==0.

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