Odpowiadając na Twoje konkretne pytanie: Nie, z punktu widzenia nauki języka rekurencja nie jest funkcją. Jeśli twój profesor naprawdę wystawił ci punkty za używanie „funkcji”, której jeszcze nie nauczał, to było źle.
Czytając między wierszami, jedną z możliwości jest to, że używając rekursji, uniknąłeś kiedykolwiek funkcji, która miała być efektem uczenia się jego kursu. Na przykład, być może w ogóle nie używałeś iteracji, a może użyłeś tylko for
pętli, zamiast używać obu for
iwhile
. Często zdarza się, że zadanie ma na celu sprawdzenie twoich zdolności do robienia pewnych rzeczy, a jeśli tego nie zrobisz, twój profesor po prostu nie może przyznać ci ocen zarezerwowanych dla tej funkcji. Jeśli jednak to rzeczywiście była przyczyna twojej utraty ocen, profesor powinien potraktować to jako własne doświadczenie edukacyjne - jeśli zademonstrowanie pewnych efektów uczenia się jest jednym z kryteriów przydziału, należy to jasno wyjaśnić studentom .
Powiedziawszy to, zgadzam się z większością innych komentarzy i odpowiedzi, że iteracja jest lepszym wyborem niż rekurencja tutaj. Jest kilka powodów i chociaż inni ludzie do pewnego stopnia ich dotykali, nie jestem pewien, czy w pełni wyjaśnili myśl, która za nimi stoi.
Przepełnienia stosu
Bardziej oczywistym jest to, że ryzykujesz popełnienie błędu przepełnienia stosu. Realistycznie rzecz biorąc, metoda, którą napisałeś, jest bardzo mało prawdopodobne, aby faktycznie doprowadziła do takiej sytuacji, ponieważ użytkownik musiałby wiele razy podawać nieprawidłowe dane, aby faktycznie wywołać przepełnienie stosu.
Należy jednak pamiętać o tym, że na stosie będą znajdować się nie tylko sama metoda, ale także inne metody wyżej lub niżej w łańcuchu wywołań. Z tego powodu przypadkowe pochłanianie dostępnego miejsca na stosie jest dość niegrzeczne dla każdej metody. Nikt nie chce ciągle martwić się o wolne miejsce na stosie, gdy piszą kod, ze względu na ryzyko, że inny kod może niepotrzebnie go wykorzystać dużo.
Jest to część bardziej ogólnej zasady w projektowaniu oprogramowania zwanej abstrakcją. Zasadniczo, kiedy dzwonisz DoThing()
, wszystko, o co powinieneś się troszczyć, to to, że rzecz jest załatwiona. Nie powinieneś martwić się szczegółami implementacji, jak to się robi. Ale chciwe użycie stosu łamie tę zasadę, ponieważ każdy bit kodu musi martwić się o to, ile stosu może bezpiecznie założyć, że został mu pozostawiony przez kod w innym miejscu łańcucha wywołań.
Czytelność
Drugim powodem jest czytelność. Ideałem, do którego powinien aspirować kod, jest dokument czytelny dla człowieka, w którym każda linia opisuje po prostu, co robi. Weź te dwa podejścia:
private int getInput() {
int input;
do {
input = promptForInput();
} while (!inputIsValid(input))
return input;
}
przeciw
private int getInput() {
int input = promptForInput();
if(inputIsValid(input)) {
return input;
}
return getInput();
}
Tak, oba działają i tak, oba są dość łatwe do zrozumienia. Ale jak te dwa podejścia można opisać po angielsku? Myślę, że byłoby to coś takiego:
Będę prosił o wprowadzenie danych, dopóki dane wejściowe nie będą prawidłowe, a następnie zwrócę je
przeciw
Poproszę o wprowadzenie danych, a jeśli dane wejściowe są prawidłowe, zwrócę je, w przeciwnym razie otrzymam dane wejściowe i zamiast tego zwrócę wynik
Być może możesz wymyślić nieco mniej niezgrabne sformułowanie tego drugiego, ale myślę, że zawsze okaże się, że pierwszy z nich będzie dokładniejszym, koncepcyjnie, opisem tego, co faktycznie próbujesz zrobić. Nie oznacza to, że rekurencja jest zawsze mniej czytelna. W sytuacjach, w których świeci, takich jak przechodzenie po drzewie, możesz przeprowadzić ten sam rodzaj analizy obok siebie między rekurencją a innym podejściem i prawie na pewno zauważysz, że rekursja daje kod, który jest wyraźniej samoopisujący się, wiersz po wierszu.
W oderwaniu oba te elementy są małymi punktami. Jest bardzo mało prawdopodobne, że kiedykolwiek doprowadziłoby to do przepełnienia stosu, a wzrost czytelności jest niewielki. Ale każdy program będzie zbiorem wielu z tych małych decyzji, więc nawet jeśli w izolacji nie mają one większego znaczenia, ważne jest, aby poznać zasady stojące za ich prawidłowym wykonaniem.