wyjatki, przekazywanie wynikow obliczen

0

Mam problem z pewnym zadaniem, javy dopiero sie ucze i w ogole nie mam pomyslu jak sie za to zabrac (a musze to zrobic szybko):

Wyjątki mogą służyć nie tylko do sygnalizacji błędów, ale także do nietypowego
przekazywania wyników obliczeń. Na przykład obliczony rekurencyjnie wynik zamiast zwracać
przez cały stos instrukcjami return można ”zapakować” w wyjątek, który będzie obsłużony
dopiero tuż przed zwróceniem wyniku przez funkcję czy metodę.
Korzystając z tego schematu zaimplementuj jako metody klasy Testy rekurencyjne wersje
funkcji int silnia(int n) oraz int fib(int n) obliczające silnię oraz n-ty wyraz ciągu
Fibonacciego. Zaprogramuj też dla porównania „zwykłe” wersje rekurencyjne tych metod i
zbadaj, która wersja jest szybsza.

jak to ort!? nie prosze o kod tylko jakies naprowadzenie z ty przekazywaniem wynikow(z java mam kontakt od niedawna, wczesniej pisalem w c++)

0

Ok... wykładowca powinien pójść siedzieć za coś takiego... w Javie nie powinno się sterować za pomocą wyjątków. Jet to powolne, szczególnie w problemach rozwiązywanych przez rekurencję. Jednak skoro jesteś na to skazany...

Jak masz jakieś zadanie rekurencyjne to dochodzisz do momentu, w którym osiągasz "przypadek bazowy". Jest to punkt, w którym zamiast kolejnego wywołania metody, rekurencyjnie, zwracasz wynik obliczeń za pomocą return. Przykład:

public int odejmijJedenAzBedzieZero(int start) {
   if(start == 0)
     return start;
   else
     return odejmijJedenAzBedzieZero(start - 1);
}

Debilne to, ale działa (mam nadzieję, bo pisze z czaszki bez sprawdzania).
Można zamiast return zwrócić wyjątek:


public class App {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		App app = new App();
		try {
			app.odejmijJedenAzBedzieZero(10);
		} catch (WykladowcaToIdiotaException e) {
			System.out.println("wynik: " + e.wynik);
		}
	}

	public int odejmijJedenAzBedzieZero(int start) throws WykladowcaToIdiotaException {
		System.out.println(start);
		if (start == 0)
			throw new WykladowcaToIdiotaException(start);
		else
			return odejmijJedenAzBedzieZero(start - 1);
	}
}

class WykladowcaToIdiotaException extends Exception {

	int wynik;

	public WykladowcaToIdiotaException(int wynik) {
		this.wynik = wynik;
	}
}

Jak widać się da... tylko po co?

0
Koziołek napisał(a)

Ok... wykładowca powinien pójść siedzieć za coś takiego... w Javie nie powinno się sterować za pomocą wyjątków.

W zadnym znanym mi jezyku programowania, nie powinno sie uzywac wyjatkow do sterowania programem [!!!] (i pewnie tez w zadnym mi nie znanym). Shit, co za koles wymyslil cos takiego... moze w domu do wbicia gwozdzia uzywa wkretaka? :|

0

@__apache__, no nie do końca. Wyjątki są bardzo efektywną formą przekazywania sterowania na poziomie szyny usług w systemie. Zresztą w czasach DOS tak się pisało. Może nie pamiętasz, ale w konfiguracji np. karty dźwiękowej podawało się coś co się nazywało wektorem przerwania służył on do komunikacji na bardzo niskim poziomie. Dziś obudowano to interfejsami w stylu np. DirectX.

jeszcze jedna rzecz. Zrobiłem sobie programik porównujący czas wykonania:
http://koziolekweb.pl/2009/04/04/jak-nie-uczyc-programowania-ii/

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