Cum funcționează funcția overflow stack overflow în limba engleză?

Iată două funcții. principala - principala funcție a aplicației, fapt - funcția de calcul al factorială. Factorul este calculat printr-o chemare ciclică la funcția funcției. Faptul pentru prima dată este apelat din principiu, apoi până când argumentul funcției devine 1, se numește prin scăderea argumentului cu 1. Pe scurt, ceva de genul asta. Apropo, algoritmul nu are verificări de argumente și nu va putea procesa argumente mai mici decât 1. - atom-22 23 Aug '15 la 13:39







ok, și dacă treceți de fapt (2), se pare că funcția nu va funcționa? tk n-1 = 1 - user186578 23 Aug '15 la 13:43

@ user186578: de ce nu? va fi. - Nick Volynkin ♦ Aug 23 '15 la 13:44

Pentru viitor: când puneți o întrebare, explicați mai detaliat ceea ce deja înțelegeți și ce nu este, ce ați așteptat să primiți și ce ați primit în schimb. Vă recomandăm să citiți: Cum să puneți întrebări. cum să creați un exemplu scurt, complet și fiabil. - Nick Volynkin ♦ pe 25 august 1515 la 5:15

Factorialul unui număr natural N este produsul tuturor numerelor de la 1 la N inclusiv.

Factorul 1 este 1. În toate celelalte cazuri, factorul (N) este egal cu factorul (N-1) * N.

În acest exemplu, realitatea (int n) este o funcție recursivă, se numește ea însăși.

De exemplu, programul consideră factorialul numărului 4.

Cum funcționează în cazul apelurilor recursive:







Poate că va deveni mai clară dacă o vom rescrie foarte scurt

factul () se cheamă ciclic, de fiecare dată cu un argument de 1 mai puțin decât a fost numit până când este apelat cu un argument egal cu 1. În acest caz, se întoarce 1. În alte cazuri, returnează produsul lui n la rezultat, care returnează fapta (n - 1).

Toate acestea aproape corespund în mod literal cu definiția factorială.

Și în cazul unei funcții recursive, matricea r [] este implicit organizată ca o stivă de activări a faptului funcției.

Deoarece fapta (n - 1) este suficientă pentru calcularea faptei (n). atunci un algoritm aparent eficient este o simplă iterație în care la fiecare etapă a ciclului se multiplică factorial deja calculat de contorul etapelor ciclului. În același timp, verificăm admisibilitatea parametrului de intrare (factorialul este definit pentru întregi ne-negativi) și depășirea (adică rezultatul următor intermediar se încadrează într-o variabilă de tip int).

În cazul erorilor, returnez un rezultat greșit în mod deliberat: atunci când este depășit, zero și pentru un argument negativ, numărul este mai mic decât zero (argumentul greșit în sine).

Răspuns dat la 23 august '15 la 13:43

REALIZARE FĂRĂ RECURSIE:

REALIZAREA CU RECURS:

Dacă vă uitați atent, repetarea codului se poate observa în ambele implementări: num * (factorialRecurses (num - 1)); corespunde

Funcția apelează funcția în interiorul ei până când ajunge la zero. Dacă te uiți la depanator, devine clar că stiva de apel a funcției este plină în acest moment. Este suficient să ne amintim organizarea stack-ului. Funcția A -> apelează funcția B -> apelează funcția C -> apelează funcția D și așa mai departe. numai în cazul recurgerii se dovedește că aceeași funcție se numește în mod repetat. După aceea, atingând punctul extrem - zero, stiva scade treptat. returnează rezultatele apelurilor de funcții până la momentul distrugerii complete.

Răspunsul este dat la 19 octombrie la ora 15:21







Articole similare

Trimiteți-le prietenilor: