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 atvejisn <= 1(nen == 1— taipfactorial(0)irgi saugus), rekursinis atvejisn * factorial(n-1).factorialLoop— tas pats darbas paprastuforciklu: trumpesnis, be dėklo augimo.
Patikrink — go 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)vietojefactorial(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 overflowbeveik 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ąžinkn-1atgal ir įsitikink, kad vėl veikia.