# 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
    
```



