Struktūrinis programavimas
Pamoka 9 / 11 Rekursija — paragauti ~30 min
2 / 3

Parašyk factorial — rekursija ir ciklas greta

Šiam eksperimentui neliesk savo programos — susikurk atskirą aplanką (mkdir rekursija, viduje go mod init rekursija) ir sukurk main.go.

Abu variantai greta — 1 žingsnio popierinis sekimas, tik kodu:

  • factorial — rekursinis: bazinis atvejis n <= 1 (ne n == 1 — taip factorial(0) irgi saugus), rekursinis atvejis n * factorial(n-1).
  • factorialLoop — tas pats darbas paprastu for ciklu: trumpesnis, be dėklo augimo.

Patikrinkgo run . turi išvesti lygiai:

1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
loop says: 120

Abu keliai duoda 120 — skiriasi tik kelias.

Spąstai. Ištrink bazinį atvejį (arba pamiršk mažinti — parašyk factorial(n) vietoje factorial(n-1)) ir paleisk. Kvietimai nebeturi kur sustoti, dėklas auga, kol Go pasiduoda:

runtime: goroutine stack exceeds 1000000000-byte limit
fatal error: stack overflow

Įsidėmėk šitą žinutę — stack overflow beveik visada reiškia rekursiją be veikiančio bazinio atvejo. Bazinis atvejis privalo (a) egzistuoti ir (b) būti pasiekiamas — kiekvienas kvietimas turi mažinti užduotį. Grąžink n-1 atgal ir įsitikink, kad vėl veikia.