2013-04-18 9 views

Odpowiedz

4

Usuń zmienną count ze swojej metody i uczyń ją statycznym członkiem klasy. Aby zapobiec powtórzeniu funkcji yourlsef (zasada DRY), należy zwiększyć wartość zmiennej count u góry metody.

private static int count = 0; 

private static int chain(int n) { 
    count++; 

    while(n > 1) { 
     if(n % 2 == 0) { 
      return chain(n/2); 
     } 

     return chain(3*n+1); 
    } 

return count; 
} 
+0

Dokładnie to, czego potrzebowałem. –

+2

To działa, ale uważam, że właściwą rzeczą przy pisaniu metody rekursywnej byłoby przekazanie zmiennej licznika. Utrzymuje to stan metody w wywołaniu stac raczej niż w zmiennej klasowej. Jak ktoś wspomniał, ta wersja nie byłaby bezpieczna dla wątków. – aglassman

+0

Chociaż w kontekście twojego pytania, jest to całkowicie w porządku. – aglassman

5

Nie bardzo rozumiem, o co pytasz. ale jeśli chcesz liczyć na życie poza metodą, zamiast tworzyć lokalną kopię za każdym razem, gdy wywoływana jest ta metoda, możesz ją ustawić jako statyczną.

static int count=0; 
+0

Inną opcją jest, aby obiekt zwrotny dla tej metody, która ma zarówno n i liczba przechowywanych w nim. –

10

Jak o tym:

public static int chain(int n) { 
    return chain(n, 0); 
} 

private static int chain(int n, int count) { 
    if (n > 1) { // no need for a while-loop, it will never get past 1 iteration 
     if (n % 2 == 0) { 
      return chain(n/2, count + 1); 
     } 
     return chain(3 * n + 1, count + 1); 
    } 
    return count; 
} 

Dla mnie to wydaje czystsze niż deklarowania pole statyczne poza metody, przede wszystkim dlatego, że nie chcą się martwić o konieczności zresetowania pola statycznego do 0 przy każdym wywołaniu chain.

+1

wszystko to, aby ominąć statyczne, geez =), fajna odpowiedź jednak – dardo

+4

Ta odpowiedź jest jedyną odpowiedzią na wątek +1. – maba

+1

Cóż, to jest podejście mistrza. Potrzebowałem czegoś prostszego, co mój umysł może zrozumieć bez żadnych dalszych problemów. W każdym razie masz mój głos. –

1

To też działa i nie używa tego brzydkiego dodatkowego parametru.

Poprawiłem trochę algorytm (umieszczając chain(3 * n + 1) w części else) przy założeniu, że jest to faktycznie próba pomiaru długości hailstone sequence of the Collatz conjecture. Jak pierwotnie stwierdzono, po prostu przepełniłby stos.

Ten kod rzeczywiście generuje 111 po przejściu 27.

private static int recursiveChain(int n) { 
    if (n > 1) { 
    if (n % 2 == 0) { 
     return 1 + recursiveChain(n/2); 
    } else { 
     return 1 + recursiveChain(3 * n + 1); 
    } 
    } else { 
    return 0; 
    } 
} 

A iteracyjny wersja wygląda zaskakująco podobny do pierwotnego pytania:

private static int iterativeChain(int n) { 
    int count = 0; 
    while (n > 1) { 
    count += 1; 
    if (n % 2 == 0) { 
     n = n/2; 
    } else { 
     n = 3 * n + 1; 
    } 
    } 
    return count; 
} 
Powiązane problemy