Żeby zrozumieć rekurencję, trzeba zrozumieć rekurencję. Wydaje ci się tylko, że ją rozumiesz, a prawda jest taka, że jesteś w ciemnym lesie i nic nie rozumiesz. Ale spokojnie, jesteśmy tu po to, aby takim jak ty pomóc.
Funkcja rekurencyjna nie może zwrócić wartości funkcji triangle(5), dopóki gdy wszystkie wywołania wewnętrzne nie zwrócą wartości. Funkcja rekurencyjna dla n = 5 dochodzi do linijki
int temp = 5 + triangle(4);
i sobie myśli: "kur@# ale ja nie wiem ile jest triangle(4)" i wywołuje funkcję triangle(4) po czym znów dochodzi do linijki
int temp = 4 + triangle(3);
i sobie myśli "ja pier@#$ co ten programista to ja nie wiem, skąd mam wiedzieć ile jest triangle(3)?" i wywołuje triangle(3) po czym znów dochodzi do linijki
int temp = 3 + triangle(2);
i sobie myśli "kur@# skąd mam wiedzieć ile jest triangle(3) i wywołuje funkcje triangle(2) po czym znów dochodzi do linijki
int temp = 2 + triangle(1);
i sobie myśli "coraz więksi amatorzy biorą się za programowanie, ja przecież nie wiem ile wynosi triangle(1) po czym dochodzi do kodu:
if (n == 1) {
System.out.println("Returning 1");
return 1;
}
i sobie myśli "oooo w końcu ten durny programista zwrócił mi jakąś wartość! Teraz mogę policzyć resztę!" i sobie wraca do kodu dla n= 2 ponieważ go nie skończył:
int temp = 2 + triangle(1);
System.out.println("Returning " + temp);
return temp;
i sobie myśli "O! Teraz to jest kulturka, teraz już wiem ile wynosi triangle(1), więc mogę dodać 2 i mam teraz policzony temp" i sobie dodaje int temp = 2 + triangle(1), wychodzi mu 3 i sobie wraca do kodu dla n=3, ponieważ go nie skończył:
int temp = 3 + triangle(2);
System.out.println("Returning " + temp);
return temp;
i sobie myśli "Fajowo, teraz już wiem, że triangle(2) wynosi 3, więc mogę sobie dodać 3 + triangle(2) i wiem ile to będzie!" i sobie dodaje int temp = 3 + triangle(2), wychodzi mu 6 i sobie wraca do kodu dla n=4, ponieważ go nie skończył:
int temp = 4 + triangle(3);
System.out.println("Returning " + temp);
return temp;
i sobie myśli "Panie, teraz to już łatwe. Wiem, że triangle(3) wynosi 6, więc sobie mogę dodać 4 + triangle(3) i wiem, że będzie 10" i sobie dodaje, wychodzi mu 10 i sobie wraca do kodu dla n=5, ponieważ go nie skończył:
int temp = 5 + triangle(4);
System.out.println("Returning " + temp);
return temp;
i sobie myśli "Teraz już wiem wszystko! Wiem, że triangle(4) wynosi 10, więc sobie mogę dodać 5 i mam ostateczny wynik".