Zagnieżdżone pętle

Zagnieżdżone pętle
lipkerson
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 2 lata
0

Witam

Zastanawiam się jak napisac uniwersalny algorytm na zagnieżdżone pętle w javie.
Nie wiem jak to ugryźć - nie umiem wymyśłić w jaki sposób napisać dowolną ilośc pętli for.
Próbowałem rekurencją ale cienko to wygląda.

for w forze w forze w forze itd. Ilośc forów jako parametr. Już pal licho ilośc iteracji w forach - niech bedzie stała np. 3 i niech w najgłębszym forze będzie tylko wypisywany napis albo coś.
Pomysły? Java w wersji 7.


Another jam from the world for the jam from the voices of the world......
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

A jaki problem zrobić to rekurencyjnie? Niech funkcja przyjmuje trzy argumenty -> liczbę zagłębień, liczbę iteracji for oraz Runnable.

Kopiuj
void magicFunction(int depth, int n, Runnable action){
  if(depth > 0){
      for(int i=0;i<n;i++){
          magicFunction(depth-1, n, action);
      }
  }
  else{
      action.run();    
  }
}

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
4

Trochę bardziej wymyślny kod pozwala na różne ilości iteracji na różnych poziomach zagłębienia oraz dostęp do wartości zmiennych sterujących. Informacja o pętlach jest podana w postaci ArrayList<Integer>, rozmiar kolekcji to ilość pętli, elementy kolekcji to ilości iteracji.
http://ideone.com/23mA4F


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans
Zobacz pozostałe 4 komentarze
bogdans
Task dostarczony musi mieć jakiś konkretny typ. Wyprodukowany wewnętrznie nie musi => jest trochę więcej swobody.
Shalom
Runnable? Albo Callable<T>? Nie widzę tutaj specjalnie problemu ani ograniczenia :)
bogdans
Ale klasa z zadaniem może już istnieć i nie możemy jej zmodyfikować. Poza tym, nie każda klasa implementująca Runnable lub Callable się nadaje.
Shalom
I jaki jest problem napisać naszą własną implementację Callable/Runnable w którym wywołamy sobie tą klasę z zadaniem? W ten sposób tą twoją implementację można zamknąć w osobnej klasie, coś jak jakiś TaskExecutor i nie wiązać jej z konkretnymi zadaniami do wywołania. Szczególnie jeśli chcemy w ten sposób wołać wiele różnych zadań nie kopiując przy tym kodu.
bogdans
Jest problem z napisaniem tego ogólnie. Jeśli task zależy od zmiennej sterujących, to klasa opisująca task winna mieć metodę o sygnaturze nazwa(ArrayList&lt;Integer&gt;), Callable/Runnable nie maja takiej metody. Z drugiej strony, task może wymagać przekazania zupełnie innych parametrów => sygnatura metody musi być zupełnie inna. Kto będzie chciał wykorzystać pomysł do wielu tasków o podobnych wymaganiach, to sobie go zmodyfikuje.

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.