Excel Avanzado

Macros, Vba en Excel y muchos ejemplos de nuestro Curso de Excel Avanzado

Excel Avanzado
descomposicion factorial de un nro, Función para la Descomposición Factorial de un Número con recursividad

Función para la Descomposición Factorial de un Número con recursividad

| 2 comentarios

Esta Función realiza la descomposición factorial de un número, se sabe que todo número es el producto de otros números llamados números primos.

La función tiene la forma siguiente Factores(valor), donde el valor es el parámetro de ingreso, el cual será descompuesto por su factores; el resultado sera una cadena donde muestra todos los factores del número ingresado.

Excel01, Función para la Descomposición Factorial de un Número con recursividad

Código de la función Factores (VBA)

Funcion Descomponer Factores1 300x198, Función para la Descomposición Factorial de un Número con recursividad

(Para mayor visualización de la imagen, hacer click en la misma)

Como se observa en la figura, la función principal Factores, utiliza una función auxiliar Menordivisor, el cual devuelve el menor número(mayor de 1), por el cual se puede dividir un número dado, esta función es de ayuda al momento de realizar las divisiones simultaneas del número que se quiere descomponer en factores.

En la función Menor divisor se utiliza el bucle Do – Loop Until, que se interrumpe cuando se ubica el menor divisor, el programa detecta cuando es un divisor si el resto de la división es cero, con la ayuda del operador Mod que devuelve el resto de una división

La  función principal Factores, tiene la particularidad que se llama a si misma(recursiva), hasta que el resultado de la división del número y su menor divisor se igual a 1 (valor1 = 1), en este momento va a construir la cadena con todos los factores.

Depuración

Valor = 6  parametro ingresado en este ejemplo

–          Valor  = 1  ?        NO         ‘en este momento Valor = 6

–          Entonces realiza

  • Valor1 = 6 / 2(valor obtenido por la función menor divisor) = 3  ' es el valor resultante del numero entre su menor divisor, que sera el valor de  entrada cuando se llame nuevamente a la función.
  • Factores = “2”(el menor divisor) + “*” + =Factores(3)  ‘llama nuevamente a la funcion                 [A]
    • Valor  = 1  ?       NO         ‘en este momento Valor = 3
    • Entonces realiza
    • Valor1 = 3 / 3(valor obtenido por la función menor divisor) = 1 ' es el valor resultante del numero entre su menor divisor, que sera el valor de  entrada cuando se llame nuevamente a la función.
    • Factores = “3”(el menor divisor) +  = Factores(1)  ‘llama nuevamente a la funcion          [B]
    • Valor = 1  ?        SI       ‘en este momento Valor = 1
      • Factores = “”   'ya no llama nuevamente a la función y retorna valores                        [C]
      • En Este momento ya no se puede dividir el número y construirá la cadena con los valores calculados
      • En [B] retornaria Factores = “3”
      • En [A] retornaria el valor de “2” +”*” +”3”
      • L a función devolveria 2 * 3

 Elaborado por Germán Vara O.

2 comentarios

  1. Muy buena explicación y entendible.

  2. Buenas noches, tengo un problema que es posible que solo lo pueda resolver con una funcion recursiva. El detalle es que no se como terminarla, tengo una vaga idea de como hacerlo. Le explico.
    Tengo un equipo, por ejemplo (le puedo anexar el archivo de excel): R0001. Bien, teste valor lo va a buscar en otra hoja de ese libro, en caso de que lo encuentre verá cuales son sus dependencias, para este ejemplo, encontrará que R0001 tiene a F0004, por lo que ahora buscamos si F0004 tiene dependencia, para este caso, tiene F0005. Como F0005 ya no tiene dependencias, buscamos si existe uno mas de F0004, y efectivamente tenemos F0006, buscamos F0006 y como no tiene dependencias buscamos si F0004 tiene alguna otra, como ya no tiene, regresamos a R0001 y vemos si tiene alguna otra dependencia, para este caso tiene T0001, buscamos si T0001 tiene dependencia y encontramos que si, T0007… asi continuamos hasta terminar. Es como si estuvieras viendo un organigrama o bien, directorios y subdirectorios. al final, te deberia de decir que de R0001 dependen: R0001, F0004, F005, F0006, T0001, T0007, F0003,F0001,T0002,F0007,F0008,T0003,F0009,F0010,F0011, F0012, T0004,F0013, F0014, F0015, F0016, R0002, F0017, F0018, F0019, F0020, F0021, F0022, F0023, T0005, F0025

    Este es el listado de dependencia que tengo:
    EQUIPO SIGUIENTE
    ATT004012 F0002
    ATT004012 T0006
    ATT004012 R0001
    R0001 F0004
    R0001 T0001
    R0001 T0002
    F0004 F0005
    F0004 F0006
    T0001 T0007
    T0001 F0003
    T0001 F0001
    T0002 F0007
    T0002 F0008
    T0002 T0003
    T0003 F0009
    T0003 F0010
    T0003 F0011
    T0003 F0012
    T0003 T0004
    T0004 F0013
    T0004 F0014
    T0004 R0002
    F0014 F0015
    F0014 F0016
    R0002 F0017
    R0002 F0018
    R0002 F0019
    R0002 F0020
    R0002 F0021
    R0002 F0022
    R0002 F0023
    F0023 T0005
    T0005 F0025

    Y este el programa que no puedo terminar:
    Public Function factorialEprosec(x)

    Set resultado = Range(“DEPENDENCIAS”).Find(x, LookIn:=xlValues, LookAt:=xlWhole)

    If ActiveCell.Value = “-” Then
    factorialb = ActiveCell.Value
    GoTo 10
    Else
    ActiveCell = Worksheets(“DEPENDENCIAS”).resultado.Address
    Range(resultado.Address).Select
    Do Until ActiveCell.Value x
    factorialb = x.Value & “,” & factorialEprosec(resultado.Offset(0, 1).Value)
    Loop
    ActiveCell.Offset(1, 0).Select

    End If

    10:
    End Function

Deja un comentario

Los campos requeridos estan marcados con *.