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.
Código de la función Factores (VBA)
(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.
12/11/2012 a las 1:16 am
Muy buena explicación y entendible.
23/07/2019 a las 9:26 pm
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