Spanish RECURSIVIDAD Y ANIDAMIENTO DE SUB's

Manel

New Member
Hola a todos, me gustaría saber como crear subrutinas anidadas dentro de otra sub; para de forma recursiva llamarlas y realizar un procedimiento de cálculo de funciones pasadas como STRINGS.

En Delphi tengo librerias mías creadas para tal proposito, pero con este sistema no veo esa posibilidad para reescribir dichas subrutinas.

Si alguien me puede explicar como o el "camino" a seguir le estaría muy agradecido.

Saludos a tod@s.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Manel:

Crear subrutinas recursivas en B4A es igual que en Visual Basic, las llamas a ellas mismas desde el mismo sub y hará igual que en Visua Basic, Hará todo lo que le digas, y si vuelves a llamarla desde el mismo sub, entrará de nuevo cogiendo los valores pasados.

Te he echo un pequeño ejemplo, desde un boton llamas a una rutina que crea un bucle y lo escribe en el log, dentro del sub, vuelvo a llamar al sub pero con otro valor

B4X:
Sub Button1_Click

  Contador(10)

End Sub


Sub Contador(ContarHasta As Int)
  ' Cuenta hasta lo que nos diga la variable ContarHasta
  
   Dim n  As Int
   Dim YaEntre As Boolean
  
   Log("Entro en el Sub - Valor contador: " & ContarHasta)
  
   For n = 1 To ContarHasta
    Log(" N: " &  n)
    If YaEntre = False AND n = 5 Then
      YaEntre = True
       Log(" Vuelvo a llamar al Sub desde el Sub con valor = 3" )
       Contador(3)
     End If  
   Next

   Log("Salgo del sub")
  

  YaEntre = False
  
End Sub


Esto son los resultados del Log:
Entro en el Sub - Valor contador: 10
N: 1
N: 2
N: 3
N: 4
N: 5
Vuelvo a llamar al Sub desde el Sub con valor = 3
Entro en el Sub - Valor contador: 3
N: 1
N: 2
N: 3
Salgo del sub
N: 6
N: 7
N: 8
N: 9
N: 10
Salgo del sub


Espero haberte ayudado

Saludos
 

Manel

New Member
Gracias Jesús por responder ....

Quizas no me he expresado del todo bien ...

Te pongo un ejemplo de idea pero que logicamente no funciona (Por eso me remito a el foro)

En delphi me permite llamar a las subutinas que estan dentro de si mismas y comparten parte de la Visibilidad de variable; menos las propias del siguiente nivel.

Como no se si hay alguna metodología para anidar y al mismo tiempo hacer llamadas recursivas he habierto el presente hilo.

B4X:
'Función para calcular ecuaciones tipo x^(Sen(Log(x+4))/(4*x^3-2)+.......
'Siendo F(x) la Fórmula y Valor el que tiene X para su cálculo

Sub Calcula(Formula As String, Valor As Double) As Double
    Dim FormulaT As String ' Para contener el String ya transformado para cáculo
    Dim V As Double ' Contendrá el valor final del resultado
    Dim P As Int ' Valor de la posición a la que apunta la cadena Formula en ese momento Accesible a las sub internas
    Sub FNivel1(T As Double) As Double ' Función de nivel 1
        Dim V1 As Double
        ' .............  Con sus Dim locales
        ' .............  Función intermedia para calcular lo que va dento de parentesis
            Sub FNivel2(M As Double) As Double ' Función de nivel 2
                Dim V2 As Double
                ' .............  Con sus Dim locales
                ' .............  Función intermedia para calcular lo que contiene / y *
                Return V2
            End Sub
        ' .............
        Return V1
    End Sub
    'Preparación cadena traducida para manefarla a gran velocidad (Utiliar código de una letra para cada función)
    'Ejemplo Sen = S; Cos = C Mediante dos arrays o un array de dos dimensiones con las constantes ....
    'Primera llamada a FNivel1(Formula)
    'Código terminando y verificando resultados
    Return V
End Sub
Sub Button2_Click
   
End Sub

Muy agradecido a tod@s
Hola Manel:

Crear subrutinas recursivas en B4A es igual que en Visual Basic, las llamas a ellas mismas desde el mismo sub y hará igual que en Visua Basic, Hará todo lo que le digas, y si vuelves a llamarla desde el mismo sub, entrará de nuevo cogiendo los valores pasados.

Te he echo un pequeño ejemplo, desde un boton llamas a una rutina que crea un bucle y lo escribe en el log, dentro del sub, vuelvo a llamar al sub pero con otro valor

B4X:
Sub Button1_Click

  Contador(10)

End Sub


Sub Contador(ContarHasta As Int)
  ' Cuenta hasta lo que nos diga la variable ContarHasta
 
   Dim n  As Int
   Dim YaEntre As Boolean
 
   Log("Entro en el Sub - Valor contador: " & ContarHasta)
 
   For n = 1 To ContarHasta
    Log(" N: " &  n)
    If YaEntre = False AND n = 5 Then
      YaEntre = True
       Log(" Vuelvo a llamar al Sub desde el Sub con valor = 3" )
       Contador(3)
     End If 
   Next

   Log("Salgo del sub")
 

  YaEntre = False
 
End Sub


Esto son los resultados del Log:
Entro en el Sub - Valor contador: 10
N: 1
N: 2
N: 3
N: 4
N: 5
Vuelvo a llamar al Sub desde el Sub con valor = 3
Entro en el Sub - Valor contador: 3
N: 1
N: 2
N: 3
Salgo del sub
N: 6
N: 7
N: 8
N: 9
N: 10
Salgo del sub


Espero haberte ayudado

Saludos
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Manel:

Como bien dices el meter un sub dentro de otro no lo permite B4A.

Pero viendo lo que necesitas, lo que si puedes hacer es crear los sub individuales y llamarlos desde el sub inicial o del que te interese.
Si quieres mantener lo de la visibilidad de las variables puedes crear variables globales, o desde el sub que estas pasar esas variables como argumento al llamar al nuevo sub, de esa forma esas variables seran "vistas" desde el sub que estas y al que llamas pero no al siguiente (a menos que tambien las pases como argumento).

Saludos:
 
Top