2017-09-14 3 views
0

Il devrait être question fondamentale sur la récursivité.comment le traitement de récursivité sous le capot

Code simple:

func fact(n int) int { 
    if n == 0 { 
     return 1 
    } 
    return n * fact(n-1) 
} 

comment la ligne n * fact(n-1) sera le traitement sous le capot par les langages de programmation généraux, C++, Java, Go ...

Dans ma compréhension de la ligne n * fact(n-1) va créer l'expression à la volée comme n * n-1 * n-2. ... Ainsi, le programme exécutable préparera l'expression selon le paramètre fonctionnel entrant. Aussi comment va traiter la récurrence simple et la récursion de la queue sous le capot. Pourriez-vous ajouter plus de détails, des documents utiles.

Merci.

+0

Il ne s'agit pas d'une queue récursive. La dernière opération est n * fait résultat –

Répondre

0

Vous pouvez utiliser godbolt.org pour voir ce qui se passe "sous le capot" pour C++ et Go. (Aussi bien que quelques autres langues.)

Si vous modifiez votre algorithme à l'un des langages (tels que C++), godbolt vous montrera le langage d'assemblage qui est généré. Vous ne pouvez pas obtenir beaucoup plus "sous le capot" que de savoir ce qui se passe avec les registres et comment il se branche dans l'assemblage.

Bien sûr, cela nécessite de comprendre l'assemblage. Mais votre exemple est en réalité assez simple.

Voici un exemple de C++ rapide (de votre code), vous pouvez coller dans Godbolt:

int fact(int n); 

int main() 
{ 
    fact(5); 
} 

int fact(int n) 
{ 
    if (n == 0) 
    { 
     return 1; 
    } 
    return n * fact(n-1); 
} 

Espoir qui vous donne de nouvelles perspectives sur ce qui se passe dans les coulisses.