# RECURSIVIDAD

Un procedimiento recursivo es aquel que se llama a si mismo. Hay dos tipos: directo o indirecto. La recursion directa, el procedimiento se llama a si mismo y en la recursion indirecta, el primer procedimiento llama a un segundo procedimiento, que a su vez llama al primer procedimiento.

La recursividad se puede observar en numerosos algoritmos matematicos. Por ejemplo, considere el caso de calcular el factorial de un numero. El factorial de un numero viene dado por la ecuacion -

```
Fact (n) = n * fact (n-1) for n > 0
```

Por ejemplo: Factorial de 5 es 1x2x3x4x5 = 5x factorial de 4 y puede ser un buen ejemplo para mostrar un procedimiento recursivo. Todo algoritmo debe tener una condicion de finalizacion, es decir, la llamada recursiva del programa debe detenerse cuando se cumple una condicion. En el caos del algoritmo factorial, la condicion final se alcanza cuando nes 0.

Veamos como se implementa el factorial n en asm. Para simplificar el programa, calcularemos el factorial 3.

```
section .data
    msg db 'Factorial de 3 es:', 0xa
    len equ $ - msg

section .bss
    fact resb 1            ; Almacenamos el resultado


proc_fact:                 ; Nombre de la funcion
    cmp bl, 1              ; Compara bl a 1 si es mayor hace calculos 
    jg do_calculation      ; si no establece ax en 1 y retorna
    mov ax, 1
    ret

do_calculation:
    dec bl                  ; Decrementamos el valor en 1 a bl
    call pro_fact           ; Llama a pro_fact
    inc bl                  ; Incrementa a bl
    mul bl                  ; multiplica el resultado ax por bl
    ret


section .text
    global _start

_start:
    mov bx, 3               ; Carga en 3 a bx, se usara para calcular el fact
    call proc_fact          ; Llama a la funcion para calcular el numero fact
    add ax, 30h             ; Agrega 0 a ax para imprimir el valor factorial
    mov [fact], ax          ; Guarda ax en fact para imprimir
    
    mov edx, len
    mov ecx, msg
    mov ebx, 1
    mov eax, 4
    int 0x80
    
    mov edx, 1
    mov ecx, fact
    mov ebx, 1
    mov eax, 4
    int 0x80
    
    mov eax, 1
    int 0x80
    
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://bla0x1s-organization.gitbook.io/untitled-1/reverse-engineering/assembly-x86/recursividad.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
